Full Code of alibaba/otter for AI

master 7544d0515e83 cached
1153 files
4.9 MB
1.4M tokens
7681 symbols
1 requests
Download .txt
Showing preview only (5,425K chars total). Download the full file or copy to clipboard to get everything.
Repository: alibaba/otter
Branch: master
Commit: 7544d0515e83
Files: 1153
Total size: 4.9 MB

Directory structure:
gitextract_t6qjy73f/

├── .gitignore
├── HEADER.txt
├── LICENSE.txt
├── README.md
├── codeformat.xml
├── codetemplates.xml
├── docker/
│   ├── Dockerfile
│   ├── base/
│   │   └── Dockerfile
│   ├── build.sh
│   ├── image/
│   │   ├── admin/
│   │   │   ├── app.sh
│   │   │   ├── bin/
│   │   │   │   ├── clean_log
│   │   │   │   ├── clean_log.sh
│   │   │   │   └── ddl.sql
│   │   │   └── health.sh
│   │   └── alidata/
│   │       ├── bin/
│   │       │   ├── exec_rc_local.sh
│   │       │   ├── lark-wait
│   │       │   └── main.sh
│   │       ├── init/
│   │       │   ├── 02init-sshd.sh
│   │       │   └── fix-hosts.py
│   │       └── lib/
│   │           └── proc.sh
│   └── run.sh
├── lib/
│   ├── install.bat
│   ├── install.sh
│   ├── jmockit-0.999.10-sources.jar
│   ├── jmockit-0.999.10.jar
│   ├── jmockit-0.999.10.pom
│   ├── jtester-1.1.8-sources.jar
│   ├── jtester-1.1.8.jar
│   ├── jtester-1.1.8.pom
│   └── ojdbc6.jar
├── manager/
│   ├── biz/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── alibaba/
│   │       │   │           └── otter/
│   │       │   │               └── manager/
│   │       │   │                   └── biz/
│   │       │   │                       ├── autokeeper/
│   │       │   │                       │   ├── AutoKeeperStatService.java
│   │       │   │                       │   └── impl/
│   │       │   │                       │       ├── AutoKeeperCollector.java
│   │       │   │                       │       ├── AutoKeeperData.java
│   │       │   │                       │       ├── AutoKeeperPersist.java
│   │       │   │                       │       └── AutoKeeperStatServiceImpl.java
│   │       │   │                       ├── common/
│   │       │   │                       │   ├── DataSourceCreator.java
│   │       │   │                       │   ├── alarm/
│   │       │   │                       │   │   ├── AbstractAlarmService.java
│   │       │   │                       │   │   ├── AlarmMessage.java
│   │       │   │                       │   │   ├── AlarmService.java
│   │       │   │                       │   │   └── DefaultAlarmService.java
│   │       │   │                       │   ├── arbitrate/
│   │       │   │                       │   │   ├── ArbitrateConfigImpl.java
│   │       │   │                       │   │   └── DeadNodeListener.java
│   │       │   │                       │   ├── basedao/
│   │       │   │                       │   │   └── GenericDAO.java
│   │       │   │                       │   ├── baseservice/
│   │       │   │                       │   │   └── GenericService.java
│   │       │   │                       │   └── exceptions/
│   │       │   │                       │       ├── InvalidConfigureException.java
│   │       │   │                       │       ├── ManagerException.java
│   │       │   │                       │       └── RepeatConfigureException.java
│   │       │   │                       ├── config/
│   │       │   │                       │   ├── alarm/
│   │       │   │                       │   │   ├── AlarmRuleService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── AlarmRuleDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   ├── AlarmRuleDO.java
│   │       │   │                       │   │   │   │   └── AlarmRuleParameter.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       ├── AlarmRuleParameterTypeHandler.java
│   │       │   │                       │   │   │       └── IbatisAlarmRuleDAO.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       └── AlarmRuleServiceImpl.java
│   │       │   │                       │   ├── autokeeper/
│   │       │   │                       │   │   ├── AutoKeeperClusterService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── AutoKeeperClusterDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   └── AutoKeeperClusterDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       └── IbatisAutoKeeperClusterDAO.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       └── AutoKeeperClusterServiceImpl.java
│   │       │   │                       │   ├── canal/
│   │       │   │                       │   │   ├── CanalService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── CanalDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   └── CanalDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       ├── CanalParameterTypeHandler.java
│   │       │   │                       │   │   │       └── IbatisCanalDAO.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       └── CanalServiceImpl.java
│   │       │   │                       │   ├── channel/
│   │       │   │                       │   │   ├── ChannelService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── ChannelDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   └── ChannelDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       ├── ChannelParameterTypeHandler.java
│   │       │   │                       │   │   │       └── IbatisChannelDAO.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       └── ChannelServiceImpl.java
│   │       │   │                       │   ├── datacolumnpair/
│   │       │   │                       │   │   ├── DataColumnPairGroupService.java
│   │       │   │                       │   │   ├── DataColumnPairService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── DataColumnPairDAO.java
│   │       │   │                       │   │   │   ├── DataColumnPairGroupDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   ├── DataColumnPairDO.java
│   │       │   │                       │   │   │   │   └── DataColumnPairGroupDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       ├── IbatisDataColumnPairDAO.java
│   │       │   │                       │   │   │       └── IbatisDataColumnPairGroupDAO.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       ├── DataColumnPairGroupServiceImpl.java
│   │       │   │                       │   │       └── DataColumnPairServiceImpl.java
│   │       │   │                       │   ├── datamatrix/
│   │       │   │                       │   │   ├── DataMatrixService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── DataMatrixDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   └── DataMatrixDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       └── IbatisDataMatrixDAO.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       └── DataMatrixServiceImpl.java
│   │       │   │                       │   ├── datamedia/
│   │       │   │                       │   │   ├── DataMediaService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── DataMediaDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   └── DataMediaDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       └── IbatisDataMediaDAO.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       └── DataMediaServiceImpl.java
│   │       │   │                       │   ├── datamediapair/
│   │       │   │                       │   │   ├── DataMediaPairService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── DataMediaPairDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   └── DataMediaPairDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       └── IbatisDataMediaPairDAO.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       └── DataMediaPairServiceImpl.java
│   │       │   │                       │   ├── datamediasource/
│   │       │   │                       │   │   ├── DataMediaSourceService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── DataMediaSourceDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   └── DataMediaSourceDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       └── IbatisDataMediaSourceDAO.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       └── DataMediaSourceServiceImpl.java
│   │       │   │                       │   ├── node/
│   │       │   │                       │   │   ├── NodeService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── NodeDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   └── NodeDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       ├── IbatisNodeDAO.java
│   │       │   │                       │   │   │       └── NodeParameterTypeHandler.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       └── NodeServiceImpl.java
│   │       │   │                       │   ├── parameter/
│   │       │   │                       │   │   ├── SystemParameterService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── SystemParameterDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   └── SystemParameterDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       ├── IbatisSystemParameterDAO.java
│   │       │   │                       │   │   │       └── SystemParameterTypeHandler.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       └── SystemParameterServiceImpl.java
│   │       │   │                       │   ├── pipeline/
│   │       │   │                       │   │   ├── PipelineService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── PipelineDAO.java
│   │       │   │                       │   │   │   ├── PipelineNodeRelationDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   ├── PipelineDO.java
│   │       │   │                       │   │   │   │   └── PipelineNodeRelationDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       ├── IbatisPipelineDAO.java
│   │       │   │                       │   │   │       ├── IbatisPipelineNodeRelationDAO.java
│   │       │   │                       │   │   │       └── PipelineParameterTypeHandler.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       └── PipelineServiceImpl.java
│   │       │   │                       │   ├── record/
│   │       │   │                       │   │   ├── LogRecordService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── LogRecordDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   └── LogRecordDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       └── IbatisLogRecordDAO.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       └── LogRecordServiceImpl.java
│   │       │   │                       │   └── utils/
│   │       │   │                       │       ├── ListTypeHandler.java
│   │       │   │                       │       └── MapTypeHandler.java
│   │       │   │                       ├── monitor/
│   │       │   │                       │   ├── AlarmController.java
│   │       │   │                       │   ├── AlarmRecovery.java
│   │       │   │                       │   ├── Monitor.java
│   │       │   │                       │   ├── MonitorRuleExplorerRegisty.java
│   │       │   │                       │   ├── MonitorTimer.java
│   │       │   │                       │   ├── PassiveMonitor.java
│   │       │   │                       │   └── impl/
│   │       │   │                       │       ├── AbstractRuleMonitor.java
│   │       │   │                       │       ├── AlarmRecoveryDelayed.java
│   │       │   │                       │       ├── DefaultAlarmController.java
│   │       │   │                       │       ├── DelayStatRuleMonitor.java
│   │       │   │                       │       ├── ExceptionRuleMonitor.java
│   │       │   │                       │       ├── GlobalMonitor.java
│   │       │   │                       │       ├── PipelineMonitor.java
│   │       │   │                       │       ├── PipelineTimeoutRuleMonitor.java
│   │       │   │                       │       ├── PositionTimeoutRuleMonitor.java
│   │       │   │                       │       ├── ProcessTimeoutRuleMonitor.java
│   │       │   │                       │       ├── RestartAlarmRecovery.java
│   │       │   │                       │       └── SelfMonitor.java
│   │       │   │                       ├── remote/
│   │       │   │                       │   ├── ArbitrateRemoteService.java
│   │       │   │                       │   ├── CanalRemoteService.java
│   │       │   │                       │   ├── ConfigRemoteService.java
│   │       │   │                       │   ├── NodeRemoteService.java
│   │       │   │                       │   ├── StatsRemoteService.java
│   │       │   │                       │   ├── impl/
│   │       │   │                       │   │   ├── ArbitrateRemoteServiceImpl.java
│   │       │   │                       │   │   ├── CanalRemoteServiceImpl.java
│   │       │   │                       │   │   ├── ConfigRemoteServiceImpl.java
│   │       │   │                       │   │   ├── NodeMBeanServiceImpl.java
│   │       │   │                       │   │   └── StatsRemoteServiceImpl.java
│   │       │   │                       │   └── interceptor/
│   │       │   │                       │       └── RemoteExceptionLoggerInterceptor.java
│   │       │   │                       ├── statistics/
│   │       │   │                       │   ├── delay/
│   │       │   │                       │   │   ├── DelayCounter.java
│   │       │   │                       │   │   ├── DelayStatService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── DelayStatDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   └── DelayStatDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       └── IbatisDelayStatDAO.java
│   │       │   │                       │   │   ├── impl/
│   │       │   │                       │   │   │   └── DelayStatServiceImpl.java
│   │       │   │                       │   │   └── param/
│   │       │   │                       │   │       ├── DelayCountParam.java
│   │       │   │                       │   │       ├── DelayStatInfo.java
│   │       │   │                       │   │       ├── TimelineDelayCondition.java
│   │       │   │                       │   │       └── TopDelayStat.java
│   │       │   │                       │   ├── stage/
│   │       │   │                       │   │   ├── ProcessStatService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── ProcessDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   └── ProcessStatDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       └── IbatisProcessDAO.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       └── ProcessStatServiceImpl.java
│   │       │   │                       │   ├── table/
│   │       │   │                       │   │   ├── TableStatService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── TableHistoryStatDAO.java
│   │       │   │                       │   │   │   ├── TableStatDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   ├── TableHistoryStatDO.java
│   │       │   │                       │   │   │   │   └── TableStatDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       ├── IbatisTableHistoryStatDAO.java
│   │       │   │                       │   │   │       └── IbatisTableStatDAO.java
│   │       │   │                       │   │   ├── impl/
│   │       │   │                       │   │   │   └── TableStatServiceImpl.java
│   │       │   │                       │   │   └── param/
│   │       │   │                       │   │       ├── BehaviorHistoryCondition.java
│   │       │   │                       │   │       ├── BehaviorHistoryInfo.java
│   │       │   │                       │   │       └── TimelineBehaviorHistoryCondition.java
│   │       │   │                       │   └── throughput/
│   │       │   │                       │       ├── ThroughputStatService.java
│   │       │   │                       │       ├── dal/
│   │       │   │                       │       │   ├── ThroughputDAO.java
│   │       │   │                       │       │   ├── dataobject/
│   │       │   │                       │       │   │   └── ThroughputStatDO.java
│   │       │   │                       │       │   └── ibatis/
│   │       │   │                       │       │       └── IbatisThroughputDAO.java
│   │       │   │                       │       ├── impl/
│   │       │   │                       │       │   └── ThroughputStatServiceImpl.java
│   │       │   │                       │       └── param/
│   │       │   │                       │           ├── AnalysisType.java
│   │       │   │                       │           ├── RealtimeThroughputCondition.java
│   │       │   │                       │           ├── ThroughputCondition.java
│   │       │   │                       │           ├── ThroughputInfo.java
│   │       │   │                       │           └── TimelineThroughputCondition.java
│   │       │   │                       ├── user/
│   │       │   │                       │   ├── UserService.java
│   │       │   │                       │   ├── dal/
│   │       │   │                       │   │   ├── UserDAO.java
│   │       │   │                       │   │   ├── dataobject/
│   │       │   │                       │   │   │   └── UserDO.java
│   │       │   │                       │   │   └── ibatis/
│   │       │   │                       │   │       └── IbatisUserDAO.java
│   │       │   │                       │   └── impl/
│   │       │   │                       │       └── UserServiceImpl.java
│   │       │   │                       └── utils/
│   │       │   │                           ├── DataSourceChecker.java
│   │       │   │                           └── RegexUtils.java
│   │       │   └── resources/
│   │       │       ├── spring/
│   │       │       │   ├── otter-manager-alarm.xml
│   │       │       │   ├── otter-manager-arbitrate.xml
│   │       │       │   ├── otter-manager-autokeeper.xml
│   │       │       │   ├── otter-manager-dal.xml
│   │       │       │   ├── otter-manager-datasource.xml
│   │       │       │   ├── otter-manager-monitor.xml
│   │       │       │   ├── otter-manager-remote.xml
│   │       │       │   └── otter-manager-service.xml
│   │       │       └── sqlmap/
│   │       │           ├── sqlmap-mapping-alarmRule.xml
│   │       │           ├── sqlmap-mapping-autokeeper.xml
│   │       │           ├── sqlmap-mapping-canal.xml
│   │       │           ├── sqlmap-mapping-channel.xml
│   │       │           ├── sqlmap-mapping-datacolumnpair.xml
│   │       │           ├── sqlmap-mapping-datacolumnpairgroup.xml
│   │       │           ├── sqlmap-mapping-datamatrix.xml
│   │       │           ├── sqlmap-mapping-datamedia.xml
│   │       │           ├── sqlmap-mapping-datamediapair.xml
│   │       │           ├── sqlmap-mapping-datamediasource.xml
│   │       │           ├── sqlmap-mapping-delayStat.xml
│   │       │           ├── sqlmap-mapping-logrecord.xml
│   │       │           ├── sqlmap-mapping-node.xml
│   │       │           ├── sqlmap-mapping-pipeline.xml
│   │       │           ├── sqlmap-mapping-pipelinenoderelation.xml
│   │       │           ├── sqlmap-mapping-systemParameter.xml
│   │       │           ├── sqlmap-mapping-tableHistoryStat.xml
│   │       │           ├── sqlmap-mapping-tableStat.xml
│   │       │           ├── sqlmap-mapping-throughputStat.xml
│   │       │           ├── sqlmap-mapping-user.xml
│   │       │           └── sqlmap.xml
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── alibaba/
│   │           │           └── otter/
│   │           │               └── manager/
│   │           │                   └── biz/
│   │           │                       ├── BaseOtterTest.java
│   │           │                       ├── autokeeper/
│   │           │                       │   └── impl/
│   │           │                       │       └── AutoKeeperCollectorTest.java
│   │           │                       ├── monitor/
│   │           │                       │   ├── AbstractRuleMonitorInPeriodTest.java
│   │           │                       │   ├── AlarmServiceTest.java
│   │           │                       │   ├── ExceptionRuleMonitorTest.java
│   │           │                       │   └── GlobalMonitorTest.java
│   │           │                       └── service/
│   │           │                           ├── NodeSerivceTest.java
│   │           │                           └── PipelineSerivceTest.java
│   │           └── resources/
│   │               └── applicationContext.xml
│   ├── deployer/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── assembly/
│   │           │   ├── component.xml
│   │           │   ├── dev.xml
│   │           │   ├── mvn.xml
│   │           │   └── release.xml
│   │           ├── bin/
│   │           │   ├── startup.bat
│   │           │   ├── startup.sh
│   │           │   └── stop.sh
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── alibaba/
│   │           │           └── otter/
│   │           │               └── manager/
│   │           │                   └── deployer/
│   │           │                       ├── JettyEmbedServer.java
│   │           │                       └── OtterManagerLauncher.java
│   │           └── resources/
│   │               ├── jetty.xml
│   │               ├── logback.xml
│   │               ├── otter.properties
│   │               ├── sql/
│   │               │   └── otter-manager-schema.sql
│   │               └── webapp/
│   │                   ├── META-INF/
│   │                   │   └── MANIFEST.MF
│   │                   ├── WEB-INF/
│   │                   │   ├── applicationContext.xml
│   │                   │   ├── common/
│   │                   │   │   ├── pipeline-exception.xml
│   │                   │   │   ├── pipeline.xml
│   │                   │   │   ├── resources.xml
│   │                   │   │   ├── uris.xml
│   │                   │   │   ├── webx-component-and-root.xml
│   │                   │   │   └── webx-component.xml
│   │                   │   ├── home/
│   │                   │   │   └── form.xml
│   │                   │   ├── web.xml
│   │                   │   ├── webx-home.xml
│   │                   │   └── webx.xml
│   │                   ├── css/
│   │                   │   ├── JSONFormatter.css
│   │                   │   ├── commons.css
│   │                   │   ├── otter.css
│   │                   │   └── skin.css
│   │                   ├── js/
│   │                   │   ├── JSONFormatter.js
│   │                   │   ├── My97DatePicker/
│   │                   │   │   ├── My97DatePicker.html
│   │                   │   │   ├── WdatePicker.js
│   │                   │   │   ├── calendar.js
│   │                   │   │   ├── config.js
│   │                   │   │   ├── lang/
│   │                   │   │   │   ├── en.js
│   │                   │   │   │   ├── zh-cn.js
│   │                   │   │   │   └── zh-tw.js
│   │                   │   │   └── skin/
│   │                   │   │       ├── WdatePicker.css
│   │                   │   │       ├── default/
│   │                   │   │       │   └── datepicker.css
│   │                   │   │       └── whyGreen/
│   │                   │   │           └── datepicker.css
│   │                   │   ├── analysisStatus.js
│   │                   │   ├── dbCheck.js
│   │                   │   ├── flot/
│   │                   │   │   ├── excanvas.js
│   │                   │   │   ├── jquery.colorhelpers.js
│   │                   │   │   ├── jquery.flot.crosshair.js
│   │                   │   │   ├── jquery.flot.fillbetween.js
│   │                   │   │   ├── jquery.flot.image.js
│   │                   │   │   ├── jquery.flot.js
│   │                   │   │   ├── jquery.flot.navigate.js
│   │                   │   │   ├── jquery.flot.pie.js
│   │                   │   │   ├── jquery.flot.resize.js
│   │                   │   │   ├── jquery.flot.selection.js
│   │                   │   │   ├── jquery.flot.stack.js
│   │                   │   │   ├── jquery.flot.symbol.js
│   │                   │   │   ├── jquery.flot.threshold.js
│   │                   │   │   └── jquery.js
│   │                   │   ├── gchartapi.js
│   │                   │   ├── jquery.simplemodal-1.4.js
│   │                   │   ├── nodeCheck.js
│   │                   │   ├── pop.js
│   │                   │   └── trcolor.js
│   │                   └── templates/
│   │                       └── home/
│   │                           ├── control/
│   │                           │   └── navigation.vm
│   │                           ├── layout/
│   │                           │   └── default.vm
│   │                           └── screen/
│   │                               ├── addAlarmRule.vm
│   │                               ├── addBatchDataMediaPair.vm
│   │                               ├── addCanal.vm
│   │                               ├── addChannel.vm
│   │                               ├── addColumnPair.vm
│   │                               ├── addColumnPairGroup.vm
│   │                               ├── addDataMatrix.vm
│   │                               ├── addDataMedia.vm
│   │                               ├── addDataMediaPair.vm
│   │                               ├── addDataSource.vm
│   │                               ├── addNode.vm
│   │                               ├── addPipeline.vm
│   │                               ├── addUser.vm
│   │                               ├── addZookeeper.vm
│   │                               ├── alarmRuleList.vm
│   │                               ├── alarmSystemList.vm
│   │                               ├── analysisDelayStat.vm
│   │                               ├── analysisStageStat.vm
│   │                               ├── analysisThroughputHistory.vm
│   │                               ├── analysisThroughputStat.vm
│   │                               ├── analysisTopStat.vm
│   │                               ├── autoKeeperClientPath.vm
│   │                               ├── autoKeeperClustersDetail.vm
│   │                               ├── autoKeeperClustersList.vm
│   │                               ├── behaviorHistoryCurve.vm
│   │                               ├── canalInfo.vm
│   │                               ├── canalList.vm
│   │                               ├── channelInfo.vm
│   │                               ├── channelList.vm
│   │                               ├── checkDelayStat.vm
│   │                               ├── dataMatrixInfo.vm
│   │                               ├── dataMatrixList.vm
│   │                               ├── dataMediaInfo.vm
│   │                               ├── dataMediaList.vm
│   │                               ├── dataMediaPairInfo.vm
│   │                               ├── dataMediaPairList.vm
│   │                               ├── dataSourceInfo.vm
│   │                               ├── dataSourceList.vm
│   │                               ├── editAlarmRule.vm
│   │                               ├── editAutoKeeper.vm
│   │                               ├── editCanal.vm
│   │                               ├── editChannel.vm
│   │                               ├── editDataMatrix.vm
│   │                               ├── editDataMedia.vm
│   │                               ├── editDataMediaPair.vm
│   │                               ├── editDataSource.vm
│   │                               ├── editNode.vm
│   │                               ├── editParameter.vm
│   │                               ├── editPipeline.vm
│   │                               ├── editUser.vm
│   │                               ├── error.vm
│   │                               ├── forbidden.vm
│   │                               ├── index.vm
│   │                               ├── initSql.vm
│   │                               ├── logRecordList.vm
│   │                               ├── logRecordTab.vm
│   │                               ├── login.vm
│   │                               ├── monitor/
│   │                               │   ├── getNodes.vm
│   │                               │   ├── monitorTrigger.vm
│   │                               │   └── ok.vm
│   │                               ├── nodeInfo.vm
│   │                               ├── nodeList.vm
│   │                               ├── pipelineInfo.vm
│   │                               ├── pipelineList.vm
│   │                               ├── selectCanal.vm
│   │                               ├── selectDataMedia.vm
│   │                               ├── selectDataSource.vm
│   │                               ├── systemParameter.vm
│   │                               ├── systemReduction.vm
│   │                               ├── userManager.vm
│   │                               ├── wikiGuide.vm
│   │                               └── zkError.vm
│   ├── pom.xml
│   └── web/
│       ├── pom.xml
│       └── src/
│           └── main/
│               └── java/
│                   └── com/
│                       └── alibaba/
│                           └── otter/
│                               └── manager/
│                                   └── web/
│                                       ├── common/
│                                       │   ├── CanalExtraParamUtil.java
│                                       │   ├── NumberFormatUtil.java
│                                       │   ├── WebConstant.java
│                                       │   ├── api/
│                                       │   │   ├── ApiAuthService.java
│                                       │   │   ├── DefaultApiAuthService.java
│                                       │   │   └── JsonResult.java
│                                       │   └── model/
│                                       │       ├── SeniorCanal.java
│                                       │       ├── SeniorChannel.java
│                                       │       ├── SeniorDataMatrix.java
│                                       │       ├── SeniorDataMedia.java
│                                       │       ├── SeniorDataMediaPair.java
│                                       │       ├── SeniorDataMediaSource.java
│                                       │       └── SeniorNode.java
│                                       ├── home/
│                                       │   └── module/
│                                       │       ├── action/
│                                       │       │   ├── AbstractAction.java
│                                       │       │   ├── AlarmRuleAction.java
│                                       │       │   ├── AutoKeeperClusterAction.java
│                                       │       │   ├── CanalAction.java
│                                       │       │   ├── ChannelAction.java
│                                       │       │   ├── ColumnPairAction.java
│                                       │       │   ├── ColumnPairGroupAction.java
│                                       │       │   ├── DataMatrixAction.java
│                                       │       │   ├── DataMediaAction.java
│                                       │       │   ├── DataMediaPairAction.java
│                                       │       │   ├── DataMediaSourceAction.java
│                                       │       │   ├── NodeAction.java
│                                       │       │   ├── PipelineAction.java
│                                       │       │   ├── PositionAction.java
│                                       │       │   ├── SwitchWarmupAction.java
│                                       │       │   ├── SystemParameterAction.java
│                                       │       │   └── UserAction.java
│                                       │       └── screen/
│                                       │           ├── AddAlarmRule.java
│                                       │           ├── AddBatchDataMediaPair.java
│                                       │           ├── AddCanal.java
│                                       │           ├── AddColumnPair.java
│                                       │           ├── AddColumnPairGroup.java
│                                       │           ├── AddDataMediaPair.java
│                                       │           ├── AddNode.java
│                                       │           ├── AddPipeline.java
│                                       │           ├── AddZookeeper.java
│                                       │           ├── AlarmRuleList.java
│                                       │           ├── AlarmSystemList.java
│                                       │           ├── AnalysisDelayStat.java
│                                       │           ├── AnalysisStageStat.java
│                                       │           ├── AnalysisThroughputHistory.java
│                                       │           ├── AnalysisThroughputStat.java
│                                       │           ├── AnalysisTopStat.java
│                                       │           ├── AutoKeeperClientPath.java
│                                       │           ├── AutoKeeperClustersDetail.java
│                                       │           ├── AutoKeeperClustersList.java
│                                       │           ├── BehaviorHistoryCurve.java
│                                       │           ├── CanalInfo.java
│                                       │           ├── CanalList.java
│                                       │           ├── ChannelInfo.java
│                                       │           ├── ChannelList.java
│                                       │           ├── CheckDelayStat.java
│                                       │           ├── DataMatrixInfo.java
│                                       │           ├── DataMatrixList.java
│                                       │           ├── DataMediaInfo.java
│                                       │           ├── DataMediaList.java
│                                       │           ├── DataMediaPairInfo.java
│                                       │           ├── DataMediaPairList.java
│                                       │           ├── DataSourceInfo.java
│                                       │           ├── DataSourceList.java
│                                       │           ├── EditAlarmRule.java
│                                       │           ├── EditAutoKeeper.java
│                                       │           ├── EditCanal.java
│                                       │           ├── EditChannel.java
│                                       │           ├── EditDataMatrix.java
│                                       │           ├── EditDataMedia.java
│                                       │           ├── EditDataMediaPair.java
│                                       │           ├── EditDataSource.java
│                                       │           ├── EditNode.java
│                                       │           ├── EditPipeline.java
│                                       │           ├── EditUser.java
│                                       │           ├── LogRecordList.java
│                                       │           ├── LogRecordTab.java
│                                       │           ├── NodeInfo.java
│                                       │           ├── NodeList.java
│                                       │           ├── Ok.java
│                                       │           ├── PipelineInfo.java
│                                       │           ├── PipelineList.java
│                                       │           ├── SelectCanal.java
│                                       │           ├── SelectDataMedia.java
│                                       │           ├── SelectDataSource.java
│                                       │           ├── SystemParameter.java
│                                       │           ├── SystemReduction.java
│                                       │           ├── UserManager.java
│                                       │           ├── api/
│                                       │           │   ├── AbstractJsonScreen.java
│                                       │           │   ├── ChannelCheck.java
│                                       │           │   ├── ChannelOp.java
│                                       │           │   ├── NodeOp.java
│                                       │           │   └── TopDelay.java
│                                       │           └── monitor/
│                                       │               └── MonitorTrigger.java
│                                       └── webx/
│                                           └── valve/
│                                               ├── AuthContextValve.java
│                                               ├── PrepareExceptionValve.java
│                                               └── auth/
│                                                   ├── AuthorizeProtected.java
│                                                   ├── RegExpURLAnalyze.java
│                                                   ├── action/
│                                                   │   ├── ActionPatternHolder.java
│                                                   │   ├── ActionProtected.java
│                                                   │   ├── ActionProtectedEditor.java
│                                                   │   └── ActionProtectedImpl.java
│                                                   └── url/
│                                                       ├── URLPatternHolder.java
│                                                       ├── URLProtected.java
│                                                       ├── URLProtectedEditor.java
│                                                       └── URLProtectedImpl.java
├── node/
│   ├── canal/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── alibaba/
│   │           │           └── otter/
│   │           │               └── canal/
│   │           │                   └── extend/
│   │           │                       ├── communication/
│   │           │                       │   ├── CanalCommmunicationClient.java
│   │           │                       │   └── CanalConfigClient.java
│   │           │                       └── ha/
│   │           │                           ├── AuthenticationInfoUtils.java
│   │           │                           └── MediaHAController.java
│   │           └── resources/
│   │               └── spring/
│   │                   ├── otter-canal-communication.xml
│   │                   └── tsdb/
│   │                       ├── mysql-tsdb.xml
│   │                       └── sql-map/
│   │                           ├── sqlmap-config.xml
│   │                           ├── sqlmap_history.xml
│   │                           └── sqlmap_snapshot.xml
│   ├── common/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── alibaba/
│   │       │   │           └── otter/
│   │       │   │               └── node/
│   │       │   │                   └── common/
│   │       │   │                       ├── communication/
│   │       │   │                       │   ├── NodeCommmunicationClient.java
│   │       │   │                       │   └── NodeCommunicationEndpoint.java
│   │       │   │                       ├── config/
│   │       │   │                       │   ├── ConfigClientService.java
│   │       │   │                       │   ├── NodeTaskListener.java
│   │       │   │                       │   ├── NodeTaskService.java
│   │       │   │                       │   ├── impl/
│   │       │   │                       │   │   ├── ConfigClientServiceImpl.java
│   │       │   │                       │   │   ├── InternalConfigClientService.java
│   │       │   │                       │   │   └── NodeTaskServiceImpl.java
│   │       │   │                       │   └── model/
│   │       │   │                       │       └── NodeTask.java
│   │       │   │                       └── statistics/
│   │       │   │                           ├── StatisticsClientService.java
│   │       │   │                           └── impl/
│   │       │   │                               └── StatisticsClientServiceImpl.java
│   │       │   └── resources/
│   │       │       └── spring/
│   │       │           ├── otter-node-communication.xml
│   │       │           ├── otter-node-config.xml
│   │       │           └── otter-node-statistics.xml
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── alibaba/
│   │           │           └── otter/
│   │           │               └── node/
│   │           │                   └── common/
│   │           │                       ├── ArbitrateRemoteServiceIntegration.java
│   │           │                       ├── BaseOtterTest.java
│   │           │                       ├── config/
│   │           │                       │   ├── ConfigClientServiceIntegration.java
│   │           │                       │   ├── ConfigClientServiceTest.java
│   │           │                       │   ├── NodeTaskServiceIntegration.java
│   │           │                       │   └── NodeTaskServiceTest.java
│   │           │                       └── statistics/
│   │           │                           └── StatisticsClientServiceIntegration.java
│   │           └── resources/
│   │               └── applicationContext.xml
│   ├── deployer/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── assembly/
│   │       │   │   ├── component.xml
│   │       │   │   ├── dev.xml
│   │       │   │   ├── mvn.xml
│   │       │   │   └── release.xml
│   │       │   ├── bin/
│   │       │   │   ├── startup.bat
│   │       │   │   ├── startup.sh
│   │       │   │   └── stop.sh
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── alibaba/
│   │       │   │           └── otter/
│   │       │   │               └── node/
│   │       │   │                   └── deployer/
│   │       │   │                       └── OtterLauncher.java
│   │       │   └── resources/
│   │       │       ├── applicationContext.xml
│   │       │       ├── logback.xml
│   │       │       ├── otter.properties
│   │       │       └── sql/
│   │       │           ├── otter-system-ddl-mysql.sql
│   │       │           └── otter-system-ddl-oracle.sql
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── alibaba/
│   │                       └── otter/
│   │                           └── node/
│   │                               └── deployer/
│   │                                   └── OtterLauncherIntegration.java
│   ├── etl/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   ├── Batch.proto
│   │       │   │   ├── com/
│   │       │   │   │   └── alibaba/
│   │       │   │   │       └── otter/
│   │       │   │   │           └── node/
│   │       │   │   │               └── etl/
│   │       │   │   │                   ├── OtterConstants.java
│   │       │   │   │                   ├── OtterContextLocator.java
│   │       │   │   │                   ├── OtterController.java
│   │       │   │   │                   ├── OtterControllerMBean.java
│   │       │   │   │                   ├── common/
│   │       │   │   │                   │   ├── datasource/
│   │       │   │   │                   │   │   ├── DataSourceService.java
│   │       │   │   │                   │   │   └── impl/
│   │       │   │   │                   │   │       └── DBDataSourceService.java
│   │       │   │   │                   │   ├── db/
│   │       │   │   │                   │   │   ├── dialect/
│   │       │   │   │                   │   │   │   ├── AbstractDbDialect.java
│   │       │   │   │                   │   │   │   ├── AbstractSqlTemplate.java
│   │       │   │   │                   │   │   │   ├── DbDialect.java
│   │       │   │   │                   │   │   │   ├── DbDialectFactory.java
│   │       │   │   │                   │   │   │   ├── DbDialectGenerator.java
│   │       │   │   │                   │   │   │   ├── SqlTemplate.java
│   │       │   │   │                   │   │   │   ├── mysql/
│   │       │   │   │                   │   │   │   │   ├── MysqlDialect.java
│   │       │   │   │                   │   │   │   │   └── MysqlSqlTemplate.java
│   │       │   │   │                   │   │   │   └── oracle/
│   │       │   │   │                   │   │   │       ├── OracleDialect.java
│   │       │   │   │                   │   │   │       └── OracleSqlTemplate.java
│   │       │   │   │                   │   │   ├── lob/
│   │       │   │   │                   │   │   │   ├── AutomaticJdbcExtractor.java
│   │       │   │   │                   │   │   │   └── LazyNativeJdbcExtractor.java
│   │       │   │   │                   │   │   └── utils/
│   │       │   │   │                   │   │       ├── ByteArrayConverter.java
│   │       │   │   │                   │   │       ├── DdlUtils.java
│   │       │   │   │                   │   │       ├── SqlTimestampConverter.java
│   │       │   │   │                   │   │       └── SqlUtils.java
│   │       │   │   │                   │   ├── io/
│   │       │   │   │                   │   │   ├── EncryptUtils.java
│   │       │   │   │                   │   │   ├── EncryptedData.java
│   │       │   │   │                   │   │   ├── compress/
│   │       │   │   │                   │   │   │   ├── Compressor.java
│   │       │   │   │                   │   │   │   ├── exception/
│   │       │   │   │                   │   │   │   │   └── CompressException.java
│   │       │   │   │                   │   │   │   └── impl/
│   │       │   │   │                   │   │   │       ├── AbstractCompressor.java
│   │       │   │   │                   │   │   │       ├── PackableObject.java
│   │       │   │   │                   │   │   │       ├── bzip2/
│   │       │   │   │                   │   │   │       │   └── BZip2Compressor.java
│   │       │   │   │                   │   │   │       └── gzip/
│   │       │   │   │                   │   │   │           └── GzipCompressor.java
│   │       │   │   │                   │   │   ├── crypto/
│   │       │   │   │                   │   │   │   ├── AESException.java
│   │       │   │   │                   │   │   │   └── AESUtils.java
│   │       │   │   │                   │   │   ├── download/
│   │       │   │   │                   │   │   │   ├── DataRetriever.java
│   │       │   │   │                   │   │   │   ├── DataRetrieverFactory.java
│   │       │   │   │                   │   │   │   ├── Download.java
│   │       │   │   │                   │   │   │   ├── DownloadStatus.java
│   │       │   │   │                   │   │   │   ├── exception/
│   │       │   │   │                   │   │   │   │   └── DataRetrieveException.java
│   │       │   │   │                   │   │   │   └── impl/
│   │       │   │   │                   │   │   │       ├── AbstractCommandDownload.java
│   │       │   │   │                   │   │   │       ├── AbstractCommandRetriever.java
│   │       │   │   │                   │   │   │       ├── FileRetriever.java
│   │       │   │   │                   │   │   │       ├── aria2c/
│   │       │   │   │                   │   │   │       │   ├── Aria2cConfig.java
│   │       │   │   │                   │   │   │       │   ├── Aria2cDownload.java
│   │       │   │   │                   │   │   │       │   ├── Aria2cRetriever.java
│   │       │   │   │                   │   │   │       │   └── Aria2cStat.java
│   │       │   │   │                   │   │   │       └── observer/
│   │       │   │   │                   │   │   │           ├── DefaultExceptionObserver.java
│   │       │   │   │                   │   │   │           ├── DefaultProgressObserver.java
│   │       │   │   │                   │   │   │           ├── DefaultStatusObserver.java
│   │       │   │   │                   │   │   │           ├── ExceptionObserver.java
│   │       │   │   │                   │   │   │           ├── ProgressObserver.java
│   │       │   │   │                   │   │   │           └── StatusObserver.java
│   │       │   │   │                   │   │   └── signature/
│   │       │   │   │                   │   │       ├── ChecksumException.java
│   │       │   │   │                   │   │       ├── ChecksumUtils.java
│   │       │   │   │                   │   │       └── Crc32C.java
│   │       │   │   │                   │   ├── jetty/
│   │       │   │   │                   │   │   └── JettyEmbedServer.java
│   │       │   │   │                   │   ├── jmx/
│   │       │   │   │                   │   │   ├── JmxConnectorServerFactoryBean.java
│   │       │   │   │                   │   │   ├── StageAggregation.java
│   │       │   │   │                   │   │   └── StageAggregationCollector.java
│   │       │   │   │                   │   ├── pipe/
│   │       │   │   │                   │   │   ├── Pipe.java
│   │       │   │   │                   │   │   ├── PipeDataType.java
│   │       │   │   │                   │   │   ├── PipeKey.java
│   │       │   │   │                   │   │   ├── exception/
│   │       │   │   │                   │   │   │   └── PipeException.java
│   │       │   │   │                   │   │   └── impl/
│   │       │   │   │                   │   │       ├── RowDataPipeDelegate.java
│   │       │   │   │                   │   │       ├── http/
│   │       │   │   │                   │   │       │   ├── AbstractHttpPipe.java
│   │       │   │   │                   │   │       │   ├── AttachmentHttpPipe.java
│   │       │   │   │                   │   │       │   ├── HttpPipeKey.java
│   │       │   │   │                   │   │       │   ├── LimitedInputStream.java
│   │       │   │   │                   │   │       │   ├── RemoteUrlBuilder.java
│   │       │   │   │                   │   │       │   ├── RowDataHttpPipe.java
│   │       │   │   │                   │   │       │   └── archive/
│   │       │   │   │                   │   │       │       ├── ArchiveBean.java
│   │       │   │   │                   │   │       │       ├── ArchiveException.java
│   │       │   │   │                   │   │       │       ├── ArchiveRetriverCallback.java
│   │       │   │   │                   │   │       │       └── LazyFileInputStream.java
│   │       │   │   │                   │   │       ├── memory/
│   │       │   │   │                   │   │       │   ├── AbstractMemoryPipe.java
│   │       │   │   │                   │   │       │   ├── MemoryPipeKey.java
│   │       │   │   │                   │   │       │   └── RowDataMemoryPipe.java
│   │       │   │   │                   │   │       └── rpc/
│   │       │   │   │                   │   │           ├── AbstractRpcPipe.java
│   │       │   │   │                   │   │           ├── RowDataRpcPipe.java
│   │       │   │   │                   │   │           └── RpcPipeKey.java
│   │       │   │   │                   │   └── task/
│   │       │   │   │                   │       └── GlobalTask.java
│   │       │   │   │                   ├── conflict/
│   │       │   │   │                   │   ├── FileBatchConflictDetectService.java
│   │       │   │   │                   │   ├── exception/
│   │       │   │   │                   │   │   └── ConflictException.java
│   │       │   │   │                   │   ├── impl/
│   │       │   │   │                   │   │   └── FileBatchConflictDetectServiceImpl.java
│   │       │   │   │                   │   └── model/
│   │       │   │   │                   │       ├── ConflictEventType.java
│   │       │   │   │                   │       └── FileConflictDetectEvent.java
│   │       │   │   │                   ├── extract/
│   │       │   │   │                   │   ├── ExtractTask.java
│   │       │   │   │                   │   ├── SetlFuture.java
│   │       │   │   │                   │   ├── exceptions/
│   │       │   │   │                   │   │   └── ExtractException.java
│   │       │   │   │                   │   └── extractor/
│   │       │   │   │                   │       ├── AbstractExtractor.java
│   │       │   │   │                   │       ├── DatabaseExtractor.java
│   │       │   │   │                   │       ├── FileExtractor.java
│   │       │   │   │                   │       ├── FreedomExtractor.java
│   │       │   │   │                   │       ├── GroupExtractor.java
│   │       │   │   │                   │       ├── OtterExtractor.java
│   │       │   │   │                   │       ├── OtterExtractorFactory.java
│   │       │   │   │                   │       ├── ProcessorExtractor.java
│   │       │   │   │                   │       └── ViewExtractor.java
│   │       │   │   │                   ├── load/
│   │       │   │   │                   │   ├── LoadTask.java
│   │       │   │   │                   │   ├── exception/
│   │       │   │   │                   │   │   └── LoadException.java
│   │       │   │   │                   │   └── loader/
│   │       │   │   │                   │       ├── AbstractLoadContext.java
│   │       │   │   │                   │       ├── LoadContext.java
│   │       │   │   │                   │       ├── LoadStatsTracker.java
│   │       │   │   │                   │       ├── OtterLoader.java
│   │       │   │   │                   │       ├── OtterLoaderFactory.java
│   │       │   │   │                   │       ├── db/
│   │       │   │   │                   │       │   ├── DataBatchLoader.java
│   │       │   │   │                   │       │   ├── DbLoadAction.java
│   │       │   │   │                   │       │   ├── DbLoadData.java
│   │       │   │   │                   │       │   ├── DbLoadDumper.java
│   │       │   │   │                   │       │   ├── DbLoadMerger.java
│   │       │   │   │                   │       │   ├── FileLoadAction.java
│   │       │   │   │                   │       │   ├── FileloadDumper.java
│   │       │   │   │                   │       │   ├── context/
│   │       │   │   │                   │       │   │   ├── DbLoadContext.java
│   │       │   │   │                   │       │   │   └── FileLoadContext.java
│   │       │   │   │                   │       │   └── interceptor/
│   │       │   │   │                   │       │       ├── log/
│   │       │   │   │                   │       │       │   └── LogLoadInterceptor.java
│   │       │   │   │                   │       │       ├── operation/
│   │       │   │   │                   │       │       │   ├── AbstractOperationInterceptor.java
│   │       │   │   │                   │       │       │   ├── CanalMysqlInterceptor.java
│   │       │   │   │                   │       │       │   ├── CanalOracleInterceptor.java
│   │       │   │   │                   │       │       │   └── OperationInterceptorFactory.java
│   │       │   │   │                   │       │       └── sql/
│   │       │   │   │                   │       │           └── SqlBuilderLoadInterceptor.java
│   │       │   │   │                   │       ├── interceptor/
│   │       │   │   │                   │       │   ├── AbstractLoadInterceptor.java
│   │       │   │   │                   │       │   ├── ChainLoadInterceptor.java
│   │       │   │   │                   │       │   └── LoadInterceptor.java
│   │       │   │   │                   │       └── weight/
│   │       │   │   │                   │           ├── WeightBarrier.java
│   │       │   │   │                   │           ├── WeightBuckets.java
│   │       │   │   │                   │           └── WeightController.java
│   │       │   │   │                   ├── model/
│   │       │   │   │                   │   └── protobuf/
│   │       │   │   │                   │       └── BatchProto.java
│   │       │   │   │                   ├── select/
│   │       │   │   │                   │   ├── SelectTask.java
│   │       │   │   │                   │   ├── exceptions/
│   │       │   │   │                   │   │   └── SelectException.java
│   │       │   │   │                   │   └── selector/
│   │       │   │   │                   │       ├── Message.java
│   │       │   │   │                   │       ├── MessageDumper.java
│   │       │   │   │                   │       ├── MessageParser.java
│   │       │   │   │                   │       ├── OtterSelector.java
│   │       │   │   │                   │       ├── OtterSelectorFactory.java
│   │       │   │   │                   │       └── canal/
│   │       │   │   │                   │           ├── CanalEmbedSelector.java
│   │       │   │   │                   │           ├── CanalFilterSupport.java
│   │       │   │   │                   │           ├── OtterAlarmHandler.java
│   │       │   │   │                   │           └── OtterDownStreamHandler.java
│   │       │   │   │                   └── transform/
│   │       │   │   │                       ├── TransformTask.java
│   │       │   │   │                       ├── exception/
│   │       │   │   │                       │   └── TransformException.java
│   │       │   │   │                       └── transformer/
│   │       │   │   │                           ├── AbstractOtterTransformer.java
│   │       │   │   │                           ├── FileDataTransformer.java
│   │       │   │   │                           ├── OtterTransformer.java
│   │       │   │   │                           ├── OtterTransformerContext.java
│   │       │   │   │                           ├── OtterTransformerFactory.java
│   │       │   │   │                           └── RowDataTransformer.java
│   │       │   │   └── protocol.txt
│   │       │   └── resources/
│   │       │       ├── jetty/
│   │       │       │   └── jetty.xml
│   │       │       └── spring/
│   │       │           ├── otter-node-common.xml
│   │       │           ├── otter-node-conflict.xml
│   │       │           ├── otter-node-database.xml
│   │       │           ├── otter-node-extension.xml
│   │       │           ├── otter-node-extract.xml
│   │       │           ├── otter-node-jmx.xml
│   │       │           ├── otter-node-load.xml
│   │       │           ├── otter-node-pipe.xml
│   │       │           ├── otter-node-select.xml
│   │       │           └── otter-node-transform.xml
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── alibaba/
│   │           │           └── otter/
│   │           │               └── node/
│   │           │                   └── etl/
│   │           │                       ├── ArbitrateRemoteServiceIntegration.java
│   │           │                       ├── BaseDbTest.java
│   │           │                       ├── BaseOtterTest.java
│   │           │                       ├── SqlUtilsTest.java
│   │           │                       ├── TestUtils.java
│   │           │                       ├── common/
│   │           │                       │   ├── datasource/
│   │           │                       │   │   ├── AbstractDbDialectTest.java
│   │           │                       │   │   ├── TestMysqlUnsignedInt.java
│   │           │                       │   │   └── TestMysqlUnsignedNumber.java
│   │           │                       │   ├── db/
│   │           │                       │   │   ├── BitTableIntegration.java
│   │           │                       │   │   ├── DbDialectIntegration.java
│   │           │                       │   │   ├── DbDialectTableTest.java
│   │           │                       │   │   ├── DbDialectTest.java
│   │           │                       │   │   ├── DbPerfIntergration.java
│   │           │                       │   │   ├── DdlUtilsTest.java
│   │           │                       │   │   ├── SqlTemplateTest.java
│   │           │                       │   │   └── TimeTableIntegration.java
│   │           │                       │   ├── io/
│   │           │                       │   │   ├── AESUtilsTest.java
│   │           │                       │   │   ├── ArchiveBeanIntegration.java
│   │           │                       │   │   ├── ArchiveBeanTest.java
│   │           │                       │   │   ├── Aria2cDownLoadIntegration.java
│   │           │                       │   │   ├── ChecksumUtilsTest.java
│   │           │                       │   │   └── CompressorTest.java
│   │           │                       │   ├── jetty/
│   │           │                       │   │   └── JettyEmbedIntegration.java
│   │           │                       │   ├── jmx/
│   │           │                       │   │   ├── JmxLoaderIntegration.java
│   │           │                       │   │   └── StageAggregationTest.java
│   │           │                       │   └── pipe/
│   │           │                       │       ├── HttpPipeIntegration.java
│   │           │                       │       ├── MemoryPipeTest.java
│   │           │                       │       └── RpcPipeTest.java
│   │           │                       ├── conflict/
│   │           │                       │   └── FileBatchConflictDetectServiceIntegration.java
│   │           │                       ├── extract/
│   │           │                       │   ├── DatabaseExtractorTest.java
│   │           │                       │   ├── EventProcessorFactoryIntegration.java
│   │           │                       │   └── FreedomExtractorTest.java
│   │           │                       ├── launcher/
│   │           │                       │   ├── ArbitrateInitIntegration.java
│   │           │                       │   └── OtterLoaderFactoryIntegration.java
│   │           │                       ├── load/
│   │           │                       │   ├── DbLoadActionTest.java
│   │           │                       │   ├── DbLoadMergerTest.java
│   │           │                       │   ├── FileLoadActionTest.java
│   │           │                       │   ├── LocalFileLoaderActionTest.java
│   │           │                       │   ├── WeightBarrierTest.java
│   │           │                       │   ├── WeightBucketTest.java
│   │           │                       │   └── WeightControllerTest.java
│   │           │                       ├── select/
│   │           │                       │   ├── CanalClientIntegration.java
│   │           │                       │   └── OtterDownStreamHandlerIntergration.java
│   │           │                       └── transform/
│   │           │                           └── OtterTransformerTest.java
│   │           └── resources/
│   │               ├── applicationContext.xml
│   │               ├── compress/
│   │               │   └── geo.protodata
│   │               └── sql/
│   │                   ├── mysql_init.sql
│   │                   └── oracle_init.sql
│   ├── extend/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── alibaba/
│   │                       └── otter/
│   │                           └── node/
│   │                               └── extend/
│   │                                   ├── fileresolver/
│   │                                   │   ├── AbstractFileResolver.java
│   │                                   │   └── TestFileResolver.java
│   │                                   └── processor/
│   │                                       ├── AbstractEventProcessor.java
│   │                                       ├── HintEventProcessor.java
│   │                                       └── TestEventProcessor.java
│   └── pom.xml
├── pom.xml
└── shared/
    ├── arbitrate/
    │   ├── pom.xml
    │   └── src/
    │       ├── main/
    │       │   ├── java/
    │       │   │   └── com/
    │       │   │       └── alibaba/
    │       │   │           └── otter/
    │       │   │               └── shared/
    │       │   │                   └── arbitrate/
    │       │   │                       ├── ArbitrateEventService.java
    │       │   │                       ├── ArbitrateManageService.java
    │       │   │                       ├── ArbitrateViewService.java
    │       │   │                       ├── exception/
    │       │   │                       │   └── ArbitrateException.java
    │       │   │                       ├── impl/
    │       │   │                       │   ├── ArbitrateConstants.java
    │       │   │                       │   ├── ArbitrateEvent.java
    │       │   │                       │   ├── ArbitrateEventServiceImpl.java
    │       │   │                       │   ├── ArbitrateManageServiceImpl.java
    │       │   │                       │   ├── ArbitrateViewServiceImpl.java
    │       │   │                       │   ├── alarm/
    │       │   │                       │   │   └── AlarmClientService.java
    │       │   │                       │   ├── communication/
    │       │   │                       │   │   └── ArbitrateCommmunicationClient.java
    │       │   │                       │   ├── config/
    │       │   │                       │   │   ├── ArbitrateConfig.java
    │       │   │                       │   │   ├── ArbitrateConfigRegistry.java
    │       │   │                       │   │   └── ArbitrateConfigUtils.java
    │       │   │                       │   ├── interceptor/
    │       │   │                       │   │   └── LogInterceptor.java
    │       │   │                       │   ├── manage/
    │       │   │                       │   │   ├── ChannelArbitrateEvent.java
    │       │   │                       │   │   ├── NodeArbitrateEvent.java
    │       │   │                       │   │   ├── NodeSessionExpired.java
    │       │   │                       │   │   ├── PipelineArbitrateEvent.java
    │       │   │                       │   │   ├── SystemArbitrateEvent.java
    │       │   │                       │   │   └── helper/
    │       │   │                       │   │       └── ManagePathUtils.java
    │       │   │                       │   ├── setl/
    │       │   │                       │   │   ├── ArbitrateFactory.java
    │       │   │                       │   │   ├── ArbitrateLifeCycle.java
    │       │   │                       │   │   ├── ExtractArbitrateEvent.java
    │       │   │                       │   │   ├── LoadArbitrateEvent.java
    │       │   │                       │   │   ├── MainStemArbitrateEvent.java
    │       │   │                       │   │   ├── SelectArbitrateEvent.java
    │       │   │                       │   │   ├── TerminArbitrateEvent.java
    │       │   │                       │   │   ├── ToolArbitrateEvent.java
    │       │   │                       │   │   ├── TransformArbitrateEvent.java
    │       │   │                       │   │   ├── delegate/
    │       │   │                       │   │   │   ├── AbstractDelegateArbitrateEvent.java
    │       │   │                       │   │   │   ├── ExtractDelegateArbitrateEvent.java
    │       │   │                       │   │   │   ├── LoadDelegateArbitrateEvent.java
    │       │   │                       │   │   │   ├── SelectDelegateArbitrateEvent.java
    │       │   │                       │   │   │   ├── TerminDelegateArbitrateEvent.java
    │       │   │                       │   │   │   └── TransformDelegateArbitrateEvent.java
    │       │   │                       │   │   ├── fastrpc/
    │       │   │                       │   │   │   ├── FastRpcStageController.java
    │       │   │                       │   │   │   └── FastRpcStageEventDispatcher.java
    │       │   │                       │   │   ├── helper/
    │       │   │                       │   │   │   ├── RemedyIndexComparator.java
    │       │   │                       │   │   │   ├── ReplyProcessQueue.java
    │       │   │                       │   │   │   ├── StageComparator.java
    │       │   │                       │   │   │   ├── StagePathUtils.java
    │       │   │                       │   │   │   ├── StageProgress.java
    │       │   │                       │   │   │   └── TerminProcessQueue.java
    │       │   │                       │   │   ├── lb/
    │       │   │                       │   │   │   ├── AbstractLoadBalance.java
    │       │   │                       │   │   │   ├── ExtractRandomLoadBanlance.java
    │       │   │                       │   │   │   ├── ExtractRoundRobinLoadBalance.java
    │       │   │                       │   │   │   ├── ExtractStickLoadBalance.java
    │       │   │                       │   │   │   ├── LoadBalance.java
    │       │   │                       │   │   │   ├── LoadBalanceFactory.java
    │       │   │                       │   │   │   ├── RandomLoadBalance.java
    │       │   │                       │   │   │   ├── RoundRobinLoadBalance.java
    │       │   │                       │   │   │   ├── StickLoadBalance.java
    │       │   │                       │   │   │   ├── TransformRandomLoadBanlance.java
    │       │   │                       │   │   │   ├── TransformRoundRobinLoadBalance.java
    │       │   │                       │   │   │   └── TransformStickLoadBalance.java
    │       │   │                       │   │   ├── memory/
    │       │   │                       │   │   │   ├── ExtractMemoryArbitrateEvent.java
    │       │   │                       │   │   │   ├── LoadMemoryArbitrateEvent.java
    │       │   │                       │   │   │   ├── MemoryStageController.java
    │       │   │                       │   │   │   ├── SelectMemoryArbitrateEvent.java
    │       │   │                       │   │   │   ├── TerminMemoryArbitrateEvent.java
    │       │   │                       │   │   │   └── TransformMemoryArbitrateEvent.java
    │       │   │                       │   │   ├── monitor/
    │       │   │                       │   │   │   ├── MainstemMonitor.java
    │       │   │                       │   │   │   ├── Monitor.java
    │       │   │                       │   │   │   ├── MonitorScheduler.java
    │       │   │                       │   │   │   ├── NodeMonitor.java
    │       │   │                       │   │   │   ├── PermitMonitor.java
    │       │   │                       │   │   │   ├── TerminMonitor.java
    │       │   │                       │   │   │   └── listener/
    │       │   │                       │   │   │       ├── MainstemListener.java
    │       │   │                       │   │   │       ├── NodeListener.java
    │       │   │                       │   │   │       └── PermitListener.java
    │       │   │                       │   │   ├── rpc/
    │       │   │                       │   │   │   ├── ExtractRpcArbitrateEvent.java
    │       │   │                       │   │   │   ├── LoadRpcArbitrateEvent.java
    │       │   │                       │   │   │   ├── RpcStageController.java
    │       │   │                       │   │   │   ├── RpcStageEventDispatcher.java
    │       │   │                       │   │   │   ├── SelectRpcArbitrateEvent.java
    │       │   │                       │   │   │   ├── TerminExecutor.java
    │       │   │                       │   │   │   ├── TerminRpcArbitrateEvent.java
    │       │   │                       │   │   │   ├── TransformRpcArbitrateEvent.java
    │       │   │                       │   │   │   └── monitor/
    │       │   │                       │   │   │       ├── AbstractProcessListener.java
    │       │   │                       │   │   │       ├── ProcessListener.java
    │       │   │                       │   │   │       ├── ProcessMonitor.java
    │       │   │                       │   │   │       └── SelectProcessListener.java
    │       │   │                       │   │   └── zookeeper/
    │       │   │                       │   │       ├── ExtractZooKeeperArbitrateEvent.java
    │       │   │                       │   │       ├── LoadZooKeeperArbitrateEvent.java
    │       │   │                       │   │       ├── SelectZooKeeperArbitrateEvent.java
    │       │   │                       │   │       ├── TerminZooKeeperArbitrateEvent.java
    │       │   │                       │   │       ├── TransformZooKeeperArbitrateEvent.java
    │       │   │                       │   │       ├── monitor/
    │       │   │                       │   │       │   ├── AbstractStageListener.java
    │       │   │                       │   │       │   ├── ExtractStageListener.java
    │       │   │                       │   │       │   ├── LoadStageListener.java
    │       │   │                       │   │       │   ├── SelectStageListener.java
    │       │   │                       │   │       │   ├── StageListener.java
    │       │   │                       │   │       │   ├── StageMonitor.java
    │       │   │                       │   │       │   └── TransformStageListener.java
    │       │   │                       │   │       └── termin/
    │       │   │                       │   │           ├── ErrorTerminProcess.java
    │       │   │                       │   │           ├── NormalTerminProcess.java
    │       │   │                       │   │           ├── TerminProcess.java
    │       │   │                       │   │           └── WarningTerminProcess.java
    │       │   │                       │   └── zookeeper/
    │       │   │                       │       ├── AsyncWatcher.java
    │       │   │                       │       ├── SessionExpiredNotification.java
    │       │   │                       │       ├── ZooKeeperClient.java
    │       │   │                       │       ├── ZooKeeperHeartBeatWorker.java
    │       │   │                       │       ├── ZooKeeperOperation.java
    │       │   │                       │       ├── ZooKeeperx.java
    │       │   │                       │       └── lock/
    │       │   │                       │           ├── DistributedLock.java
    │       │   │                       │           ├── DistributedReentrantLock.java
    │       │   │                       │           └── LockNode.java
    │       │   │                       └── model/
    │       │   │                           ├── EtlEventData.java
    │       │   │                           ├── EventData.java
    │       │   │                           ├── MainStemEventData.java
    │       │   │                           ├── PipelineEventData.java
    │       │   │                           ├── PositionEventData.java
    │       │   │                           ├── ProcessEventData.java
    │       │   │                           ├── ProcessNodeEventData.java
    │       │   │                           ├── RemedyIndexEventData.java
    │       │   │                           ├── SyncStatusEventData.java
    │       │   │                           └── TerminEventData.java
    │       │   └── resources/
    │       │       └── spring/
    │       │           ├── otter-arbitrate-alarm.xml
    │       │           ├── otter-arbitrate-common.xml
    │       │           ├── otter-arbitrate-communication.xml
    │       │           ├── otter-arbitrate-event.xml
    │       │           ├── otter-arbitrate-log.xml
    │       │           └── otter-arbitrate-manage.xml
    │       └── test/
    │           ├── java/
    │           │   └── com/
    │           │       └── alibaba/
    │           │           └── otter/
    │           │               └── shared/
    │           │                   └── arbitrate/
    │           │                       ├── BaseEventTest.java
    │           │                       ├── BaseOtterTest.java
    │           │                       ├── demo/
    │           │                       │   ├── ArbitrateAllTest.java
    │           │                       │   ├── multi/
    │           │                       │   │   ├── ArbitrateForwardIntegration.java
    │           │                       │   │   ├── ArbitrateOppositeIntegration.java
    │           │                       │   │   └── ChannelArbitrateEventIntegration.java
    │           │                       │   └── servcie/
    │           │                       │       ├── ExtractServiceDemo.java
    │           │                       │       ├── LoadServiceDemo.java
    │           │                       │       ├── MainStemServiceDemo.java
    │           │                       │       ├── PipelineLifeCycle.java
    │           │                       │       ├── ProcessViewDemo.java
    │           │                       │       ├── SelectServiceDemo.java
    │           │                       │       ├── TerminProcessDemo.java
    │           │                       │       └── TransformServiceDemo.java
    │           │                       ├── manage/
    │           │                       │   ├── ArbitrateViewServiceTest.java
    │           │                       │   ├── ChannelArbitrateEventTest.java
    │           │                       │   ├── NodeArbitrateEventTest.java
    │           │                       │   └── PipelineArbitrateEventTest.java
    │           │                       ├── setl/
    │           │                       │   ├── BaseStageTest.java
    │           │                       │   ├── event/
    │           │                       │   │   ├── BaseArbitrateEventTest.java
    │           │                       │   │   ├── MainStemArbitrateEventTest.java
    │           │                       │   │   ├── ToolArbitrateEventTest.java
    │           │                       │   │   ├── memory/
    │           │                       │   │   │   ├── MemoryArbitrateEventTest.java
    │           │                       │   │   │   └── TerminMemoryArbitrateEventTest.java
    │           │                       │   │   ├── rpc/
    │           │                       │   │   │   └── RpcArbitrateEventTest.java
    │           │                       │   │   └── zookeeper/
    │           │                       │   │       ├── ExtractArbitrateEventTest.java
    │           │                       │   │       ├── LoadArbitrateEventTest.java
    │           │                       │   │       ├── SelectArbitrateEventTest.java
    │           │                       │   │       ├── TerminArbitrateEventTest.java
    │           │                       │   │       └── TransformArbitrateEventTest.java
    │           │                       │   ├── lb/
    │           │                       │   │   ├── BaseLoadBalanceTest.java
    │           │                       │   │   ├── RandomLoadBalanceTest.java
    │           │                       │   │   └── RoundRobinBalanceTest.java
    │           │                       │   └── monitor/
    │           │                       │       ├── MainStemMonitorTest.java
    │           │                       │       ├── PermitMonitorTest.java
    │           │                       │       ├── ProcessMonitorTest.java
    │           │                       │       ├── TerminMonitorTest.java
    │           │                       │       ├── node/
    │           │                       │       │   └── NodeMonitorTest.java
    │           │                       │       └── stage/
    │           │                       │           ├── ExtractStageListenerTest.java
    │           │                       │           ├── LoadStageListenerTest.java
    │           │                       │           ├── SelectStageListenerTest.java
    │           │                       │           ├── StageMonitorTest.java
    │           │                       │           └── TransformStageListenerTest.java
    │           │                       └── zookeeper/
    │           │                           ├── DistributedLockTest.java
    │           │                           ├── DistributedReentrantLockTest.java
    │           │                           ├── ZooKeeperCleanerIntegration.java
    │           │                           └── ZooKeeperClientTest.java
    │           └── resources/
    │               └── applicationContext.xml
    ├── common/
    │   ├── pom.xml
    │   └── src/
    │       ├── main/
    │       │   ├── java/
    │       │   │   └── com/
    │       │   │       ├── alibaba/
    │       │   │       │   └── otter/
    │       │   │       │       └── shared/
    │       │   │       │           └── common/
    │       │   │       │               ├── model/
    │       │   │       │               │   ├── autokeeper/
    │       │   │       │               │   │   ├── AutoKeeperCluster.java
    │       │   │       │               │   │   ├── AutoKeeperConnectionStat.java
    │       │   │       │               │   │   ├── AutoKeeperEphemeralStat.java
    │       │   │       │               │   │   ├── AutoKeeperQuorumType.java
    │       │   │       │               │   │   ├── AutoKeeperServerStat.java
    │       │   │       │               │   │   ├── AutoKeeperStat.java
    │       │   │       │               │   │   ├── AutoKeeperStateStat.java
    │       │   │       │               │   │   └── AutoKeeperWatchStat.java
    │       │   │       │               │   ├── config/
    │       │   │       │               │   │   ├── ConfigException.java
    │       │   │       │               │   │   ├── ConfigHelper.java
    │       │   │       │               │   │   ├── ModeValueFilter.java
    │       │   │       │               │   │   ├── Transient.java
    │       │   │       │               │   │   ├── alarm/
    │       │   │       │               │   │   │   ├── AlarmRule.java
    │       │   │       │               │   │   │   ├── AlarmRuleStatus.java
    │       │   │       │               │   │   │   └── MonitorName.java
    │       │   │       │               │   │   ├── channel/
    │       │   │       │               │   │   │   ├── Channel.java
    │       │   │       │               │   │   │   ├── ChannelParameter.java
    │       │   │       │               │   │   │   └── ChannelStatus.java
    │       │   │       │               │   │   ├── data/
    │       │   │       │               │   │   │   ├── Column.java
    │       │   │       │               │   │   │   ├── ColumnGroup.java
    │       │   │       │               │   │   │   ├── ColumnPair.java
    │       │   │       │               │   │   │   ├── ColumnPairMode.java
    │       │   │       │               │   │   │   ├── DataMatrix.java
    │       │   │       │               │   │   │   ├── DataMedia.java
    │       │   │       │               │   │   │   ├── DataMediaPair.java
    │       │   │       │               │   │   │   ├── DataMediaPairComparable.java
    │       │   │       │               │   │   │   ├── DataMediaSource.java
    │       │   │       │               │   │   │   ├── DataMediaType.java
    │       │   │       │               │   │   │   ├── ExtensionData.java
    │       │   │       │               │   │   │   ├── ExtensionDataType.java
    │       │   │       │               │   │   │   ├── db/
    │       │   │       │               │   │   │   │   ├── DbDataMedia.java
    │       │   │       │               │   │   │   │   └── DbMediaSource.java
    │       │   │       │               │   │   │   └── mq/
    │       │   │       │               │   │   │       ├── MqDataMedia.java
    │       │   │       │               │   │   │       └── MqMediaSource.java
    │       │   │       │               │   │   ├── enums/
    │       │   │       │               │   │   │   ├── AreaType.java
    │       │   │       │               │   │   │   └── StageType.java
    │       │   │       │               │   │   ├── node/
    │       │   │       │               │   │   │   ├── Node.java
    │       │   │       │               │   │   │   ├── NodeParameter.java
    │       │   │       │               │   │   │   └── NodeStatus.java
    │       │   │       │               │   │   ├── parameter/
    │       │   │       │               │   │   │   ├── Parameter.java
    │       │   │       │               │   │   │   └── SystemParameter.java
    │       │   │       │               │   │   ├── pipeline/
    │       │   │       │               │   │   │   ├── Pipeline.java
    │       │   │       │               │   │   │   └── PipelineParameter.java
    │       │   │       │               │   │   └── record/
    │       │   │       │               │   │       └── LogRecord.java
    │       │   │       │               │   ├── statistics/
    │       │   │       │               │   │   ├── delay/
    │       │   │       │               │   │   │   ├── DelayCount.java
    │       │   │       │               │   │   │   └── DelayStat.java
    │       │   │       │               │   │   ├── stage/
    │       │   │       │               │   │   │   ├── ProcessStat.java
    │       │   │       │               │   │   │   └── StageStat.java
    │       │   │       │               │   │   ├── table/
    │       │   │       │               │   │   │   └── TableStat.java
    │       │   │       │               │   │   └── throughput/
    │       │   │       │               │   │       ├── ThroughputStat.java
    │       │   │       │               │   │       └── ThroughputType.java
    │       │   │       │               │   └── user/
    │       │   │       │               │       ├── AuthorizeType.java
    │       │   │       │               │       └── User.java
    │       │   │       │               └── utils/
    │       │   │       │                   ├── AddressUtils.java
    │       │   │       │                   ├── Assert.java
    │       │   │       │                   ├── ByteUtils.java
    │       │   │       │                   ├── JsonUtils.java
    │       │   │       │                   ├── NioUtils.java
    │       │   │       │                   ├── OtterToStringStyle.java
    │       │   │       │                   ├── RegexUtils.java
    │       │   │       │                   ├── SecurityUtils.java
    │       │   │       │                   ├── TestUtils.java
    │       │   │       │                   ├── cache/
    │       │   │       │                   │   ├── ExtensionMemoryMirror.java
    │       │   │       │                   │   └── RefreshMemoryMirror.java
    │       │   │       │                   ├── cmd/
    │       │   │       │                   │   ├── Exec.java
    │       │   │       │                   │   ├── StreamAppender.java
    │       │   │       │                   │   ├── StreamCollector.java
    │       │   │       │                   │   └── StreamCopier.java
    │       │   │       │                   ├── code/
    │       │   │       │                   │   ├── Code.java
    │       │   │       │                   │   └── ResourceBundleUtil.java
    │       │   │       │                   ├── compile/
    │       │   │       │                   │   ├── JavaSourceCompiler.java
    │       │   │       │                   │   ├── exception/
    │       │   │       │                   │   │   ├── CompileExprException.java
    │       │   │       │                   │   │   └── JdkCompileException.java
    │       │   │       │                   │   ├── impl/
    │       │   │       │                   │   │   ├── JdkCompileTask.java
    │       │   │       │                   │   │   └── JdkCompiler.java
    │       │   │       │                   │   └── model/
    │       │   │       │                   │       ├── JavaFileManagerImpl.java
    │       │   │       │                   │       ├── JavaFileObjectImpl.java
    │       │   │       │                   │       ├── JavaSource.java
    │       │   │       │                   │       └── JdkCompilerClassLoader.java
    │       │   │       │                   ├── extension/
    │       │   │       │                   │   ├── DefaultExtensionFactory.java
    │       │   │       │                   │   ├── ExtensionFactory.java
    │       │   │       │                   │   ├── classpath/
    │       │   │       │                   │   │   ├── ClassFilter.java
    │       │   │       │                   │   │   ├── ClassNameUtils.java
    │       │   │       │                   │   │   ├── ClassScanner.java
    │       │   │       │                   │   │   ├── ClasspathClassScanner.java
    │       │   │       │                   │   │   ├── FileSystemClassLoader.java
    │       │   │       │                   │   │   └── FileSystemClassScanner.java
    │       │   │       │                   │   └── exceptions/
    │       │   │       │                   │       └── ExtensionLoadException.java
    │       │   │       │                   ├── lock/
    │       │   │       │                   │   └── BooleanMutex.java
    │       │   │       │                   ├── meta/
    │       │   │       │                   │   ├── DdlSchemaFilter.java
    │       │   │       │                   │   ├── DdlTableNameFilter.java
    │       │   │       │                   │   ├── DdlUtils.java
    │       │   │       │                   │   ├── DdlUtilsFilter.java
    │       │   │       │                   │   └── TableType.java
    │       │   │       │                   ├── sizeof/
    │       │   │       │                   │   ├── NaiveSizeOf.java
    │       │   │       │                   │   └── ObjectProfiler.java
    │       │   │       │                   ├── spring/
    │       │   │       │                   │   └── PropertyPlaceholderConfigurer.java
    │       │   │       │                   ├── test/
    │       │   │       │                   │   └── JTesterxClassPathXmlApplicationContext.java
    │       │   │       │                   ├── thread/
    │       │   │       │                   │   ├── ExecutorServiceFactoryBean.java
    │       │   │       │                   │   ├── ExecutorTemplate.java
    │       │   │       │                   │   ├── ExecutorTemplateGetter.java
    │       │   │       │                   │   └── NamedThreadFactory.java
    │       │   │       │                   ├── version/
    │       │   │       │                   │   ├── OtterVersionAnnotation.java
    │       │   │       │                   │   └── VersionInfo.java
    │       │   │       │                   └── zookeeper/
    │       │   │       │                       ├── ByteSerializer.java
    │       │   │       │                       ├── StringSerializer.java
    │       │   │       │                       ├── ZkClientx.java
    │       │   │       │                       ├── ZkEventThread.java
    │       │   │       │                       └── ZooKeeperx.java
    │       │   │       └── google/
    │       │   │           └── common/
    │       │   │               └── collect/
    │       │   │                   └── OtterMigrateMap.java
    │       │   └── resources/
    │       │       └── jtester.properties
    │       ├── saveVersion.sh
    │       └── test/
    │           ├── java/
    │           │   └── com/
    │           │       └── alibaba/
    │           │           └── otter/
    │           │               └── shared/
    │           │                   └── common/
    │           │                       ├── AddressUtilsTest.java
    │           │                       ├── BaseOtterPerformance.java
    │           │                       ├── BaseOtterTest.java
    │           │                       ├── InteAddressTest.java
    │           │                       ├── JsonUtilsTest.java
    │           │                       ├── config/
    │           │                       │   └── ConfigHelperTest.java
    │           │                       ├── sample/
    │           │                       │   ├── JtesterxSampleTest.java
    │           │                       │   ├── TestMockService1.java
    │           │                       │   ├── TestMockService2.java
    │           │                       │   ├── TestMockService3.java
    │           │                       │   └── TestService.java
    │           │                       └── utils/
    │           │                           ├── BooleanMutexTest.java
    │           │                           ├── ExecIntegration.java
    │           │                           ├── ExecutorTemplateTest.java
    │           │                           ├── JavaSourceCompilerTest.java
    │           │                           ├── NioUtilsPerformance.java
    │           │                           ├── NioUtilsTest.java
    │           │                           └── ResourceBundleUtilTest.java
    │           └── resources/
    │               ├── applicationContext.xml
    │               ├── code/
    │               │   └── ResourceBundleUtil.properties
    │               ├── compiler.txt
    │               ├── otter.properties
    │               └── spring/
    │                   └── otter-test-sample.xml
    ├── communication/
    │   ├── pom.xml
    │   └── src/
    │       ├── main/
    │       │   └── java/
    │       │       └── com/
    │       │           └── alibaba/
    │       │               └── otter/
    │       │                   └── shared/
    │       │                       └── communication/
    │       │                           ├── core/
    │       │                           │   ├── CommunicationClient.java
    │       │                           │   ├── CommunicationEndpoint.java
    │       │                           │   ├── CommunicationRegistry.java
    │       │                           │   ├── exception/
    │       │                           │   │   └── CommunicationException.java
    │       │                           │   ├── impl/
    │       │                           │   │   ├── AbstractCommunicationEndpoint.java
    │       │                           │   │   ├── DefaultCommunicationClientImpl.java
    │       │                           │   │   ├── connection/
    │       │                           │   │   │   ├── CommunicationConnection.java
    │       │                           │   │   │   ├── CommunicationConnectionFactory.java
    │       │                           │   │   │   ├── CommunicationConnectionPoolFactory.java
    │       │                           │   │   │   ├── CommunicationConnectionPoolable.java
    │       │                           │   │   │   └── CommunicationConnectionPoolableFactory.java
    │       │                           │   │   ├── dubbo/
    │       │                           │   │   │   ├── DubboCommunicationConnection.java
    │       │                           │   │   │   ├── DubboCommunicationConnectionFactory.java
    │       │                           │   │   │   └── DubboCommunicationEndpoint.java
    │       │                           │   │   └── rmi/
    │       │                           │   │       ├── RmiCommunicationClientImpl.java
    │       │                           │   │       ├── RmiCommunicationConnection.java
    │       │                           │   │       ├── RmiCommunicationConnectionFactory.java
    │       │                           │   │       └── RmiCommunicationEndpoint.java
    │       │                           │   └── model/
    │       │                           │       ├── Callback.java
    │       │                           │       ├── CommunicationParam.java
    │       │                           │       ├── Event.java
    │       │                           │       ├── EventType.java
    │       │                           │       └── heart/
    │       │                           │           └── HeartEvent.java
    │       │                           └── model/
    │       │                               ├── OtterRemoteException.java
    │       │                               ├── arbitrate/
    │       │                               │   ├── ArbitrateEventType.java
    │       │                               │   ├── NodeAlarmEvent.java
    │       │                               │   ├── StageSingleEvent.java
    │       │                               │   ├── StopChannelEvent.java
    │       │                               │   └── StopNodeEvent.java
    │       │                               ├── canal/
    │       │                               │   ├── CanalEventType.java
    │       │                               │   ├── FindCanalEvent.java
    │       │                               │   └── FindFilterEvent.java
    │       │                               ├── config/
    │       │                               │   ├── ConfigEventType.java
    │       │                               │   ├── FindChannelEvent.java
    │       │                               │   ├── FindMediaEvent.java
    │       │                               │   ├── FindNodeEvent.java
    │       │                               │   ├── FindTaskEvent.java
    │       │                               │   ├── NotifyChannelEvent.java
    │       │                               │   └── NotifyMediaEvent.java
    │       │                               └── statistics/
    │       │                                   ├── DelayCountEvent.java
    │       │                                   ├── StatisticsEventType.java
    │       │                                   ├── TableStatEvent.java
    │       │                                   └── ThroughputStatEvent.java
    │       └── test/
    │           ├── java/
    │           │   └── com/
    │           │       └── alibaba/
    │           │           └── otter/
    │           │               └── shared/
    │           │                   └── communication/
    │           │                       ├── BaseOtterTest.java
    │           │                       ├── CommunicationSpringIntegrateTest.java
    │           │                       ├── app/
    │           │                       │   ├── CommunicationAppService.java
    │           │                       │   ├── CommunicationAppServiceImpl.java
    │           │                       │   └── event/
    │           │                       │       ├── AppCreateEvent.java
    │           │                       │       ├── AppDeleteEvent.java
    │           │                       │       ├── AppEventType.java
    │           │                       │       ├── AppFindEvent.java
    │           │                       │       └── AppUpdateEvent.java
    │           │                       ├── dubbo/
    │           │                       │   ├── DubboCommunicationTest.java
    │           │                       │   └── DubboConnectionTest.java
    │           │                       └── rmi/
    │           │                           ├── RmiCommunicationTest.java
    │           │                           └── RmiConnectionTest.java
    │           └── resources/
    │               ├── applicationContext.xml
    │               └── spring/
    │                   └── otter-test-communication.xml
    ├── etl/
    │   ├── pom.xml
    │   └── src/
    │       └── main/
    │           └── java/
    │               └── com/
    │                   └── alibaba/
    │                       └── otter/
    │                           └── shared/
    │                               └── etl/
    │                                   ├── extend/
    │                                   │   ├── fileresolver/
    │                                   │   │   ├── FileInfo.java
    │                                   │   │   ├── FileResolver.java
    │                                   │   │   └── support/
    │                                   │   │       ├── RemoteDirectory.java
    │                                   │   │       ├── RemoteDirectoryFetcher.java
    │                                   │   │       └── RemoteDirectoryFetcherAware.java
    │                                   │   └── processor/
    │                                   │       ├── EventProcessor.java
    │                                   │       └── support/
    │                                   │           ├── DataSourceFetcher.java
    │                                   │           └── DataSourceFetcherAware.java
    │                                   └── model/
    │                                       ├── BatchObject.java
    │                                       ├── DbBatch.java
    │                                       ├── EventColumn.java
    │                                       ├── EventColumnIndexComparable.java
    │                                       ├── EventData.java
    │                                       ├── EventType.java
    │                                       ├── FileBatch.java
    │                                       ├── FileData.java
    │                                       ├── Identity.java
    │                                       ├── ObjectData.java
    │                                       └── RowBatch.java
    ├── pom.xml
    └── push/
        ├── pom.xml
        └── src/
            └── main/
                ├── java/
                │   └── com/
                │       └── alibaba/
                │           └── otter/
                │               └── common/
                │                   └── push/
                │                       ├── AbstractSubscribeManager.java
                │                       ├── PushException.java
                │                       ├── SubscribeCallback.java
                │                       ├── SubscribeManager.java
                │                       ├── SubscribeManagerFactory.java
                │                       ├── SubscribeType.java
                │                       ├── datasource/
                │                       │   ├── DataSourceHanlder.java
                │                       │   ├── DataSourceKey.java
                │                       │   └── media/
                │                       │       ├── MediaPushDataSource.java
                │                       │       └── MediaPushDataSourceHandler.java
                │                       ├── media/
                │                       │   └── MediaSubscribeManager.java
                │                       └── supplier/
                │                           ├── AbstractDatasourceSupplier.java
                │                           ├── DatasourceChangeCallback.java
                │                           ├── DatasourceInfo.java
                │                           ├── DatasourceSupplier.java
                │                           ├── HaDatasourceInfo.java
                │                           └── media/
                │                               └── MediaDatasourceSupplier.java
                └── resources/
                    └── spring/
                        └── otter-push-common.xml

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
.svn/
target/
test-output/
*.class
.classpath
.project
.settings/
tmp
temp
*.log
antx.properties
.idea/
*.iml
htdocs
package-info.java
.DS_Store
*.tar.gz
docker/data/


================================================
FILE: HEADER.txt
================================================
/*
 * Copyright (C) 2010-2101 Alibaba Group Holding Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     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.
 */


================================================
FILE: LICENSE.txt
================================================

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       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.


================================================
FILE: README.md
================================================
<h1>环境搭建 & 打包</h1>
<strong>环境搭建:</strong>
<ol>
<li>进入 $otter_home/lib 目录</li>
<li>执行:bash install.sh</li>
</ol>
<strong>打包:</strong>
<ol>
<li>进入$otter_home目录</li>
<li>执行:mvn clean install -Dmaven.test.skip -Denv=release</li>
<li>发布包位置:$otter_home/target</li>
</ol>

<h1>
<a name="%E9%A1%B9%E7%9B%AE%E8%83%8C%E6%99%AF" class="anchor" href="#%E9%A1%B9%E7%9B%AE%E8%83%8C%E6%99%AF"><span class="octicon octicon-link"></span></a>项目背景</h1>
<p>
   &nbsp;&nbsp;&nbsp;阿里巴巴B2B公司,因为业务的特性,卖家主要集中在国内,买家主要集中在国外,所以衍生出了杭州和美国异地机房的需求,同时为了提升用户体验,整个机房的架构为双A,两边均可写,由此诞生了otter这样一个产品。 </p>
<p>
   &nbsp;&nbsp;&nbsp;otter第一版本可追溯到04~05年,此次外部开源的版本为第4版,开发时间从2011年7月份一直持续到现在,目前阿里巴巴B2B内部的本地/异地机房的同步需求基本全上了otter4。
</p>
<strong>目前同步规模:</strong>
<ol>
<li>同步数据量6亿</li>
<li>文件同步1.5TB(2000w张图片)</li>
<li>涉及200+个数据库实例之间的同步</li>
<li>80+台机器的集群规模</li>
</ol>
<h1>
<a name="%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D" class="anchor" href="#%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D"><span class="octicon octicon-link"></span></a>项目介绍</h1>
<p>名称:otter ['ɒtə(r)]</p>
<p>译意: 水獭,数据搬运工</p>
<p>语言: 纯java开发</p>
<p>定位: 基于数据库增量日志解析,准实时同步到本机房或异地机房的mysql/oracle数据库. 一个分布式数据库同步系统</p>
<p> </p>
<h1>
<a name="%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86" class="anchor" href="#%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86"><span class="octicon octicon-link"></span></a>工作原理</h1>
<p><img width="848" src="https://camo.githubusercontent.com/2988fbbc7ddfe94ed027cd71720b1ffa5912a635/687474703a2f2f646c322e69746579652e636f6d2f75706c6f61642f6174746163686d656e742f303038382f313138392f64343230636131342d326438302d336435352d383038312d6239303833363036613830312e6a7067" height="303" alt=""></p>
<p>原理描述:</p>
<p>1.   基于Canal开源产品,获取数据库增量日志数据。 什么是Canal,  请<a href="https://github.com/alibaba/canal">点击</a></p>
<p>2.   典型管理系统架构,manager(web管理)+node(工作节点)</p>
<p>       &nbsp;&nbsp;&nbsp; a.  manager运行时推送同步配置到node节点</p>
<p>       &nbsp;&nbsp;&nbsp; b.  node节点将同步状态反馈到manager上</p>
<p>3.  基于zookeeper,解决分布式状态调度的,允许多node节点之间协同工作. </p>
<h3>
<a name="%E4%BB%80%E4%B9%88%E6%98%AFcanal-" class="anchor" href="#%E4%BB%80%E4%B9%88%E6%98%AFcanal-"><span class="octicon octicon-link"></span></a>什么是canal? </h3>
otter之前开源的一个子项目,开源链接地址:<a href="http://github.com/alibaba/canal">http://github.com/alibaba/canal</a>
<p> </p>
<h1>
<a name="introduction" class="anchor" href="#introduction"><span class="octicon octicon-link"></span></a>Introduction</h1>
<p>See the page for introduction: <a class="internal present" href="https://github.com/alibaba/otter/wiki/Introduction">Introduction</a>.</p>
<h1>
<a name="quickstart" class="anchor" href="#quickstart"><span class="octicon octicon-link"></span></a>QuickStart</h1>
<p>See the page for quick start: <a class="internal present" href="https://github.com/alibaba/otter/wiki/QuickStart">QuickStart</a>.</p>
<p> </p>
<h1>
<a name="adminguide" class="anchor" href="#adminguide"><span class="octicon octicon-link"></span></a>AdminGuide</h1>
<p>See the page for admin deploy guide : <a class="internal present" href="https://github.com/alibaba/otter/wiki/Adminguide">AdminGuide</a></p>
<p> </p>
<h1>
<a name="%E7%9B%B8%E5%85%B3%E6%96%87%E6%A1%A3" class="anchor" href="#%E7%9B%B8%E5%85%B3%E6%96%87%E6%A1%A3"><span class="octicon octicon-link"></span></a>相关文档</h1>
<p>See the page for 文档: <a class="internal present" href="https://github.com/alibaba/otter/wiki/%E7%9B%B8%E5%85%B3ppt%26pdf">相关PPT&amp;PDF</a></p>
<p> </p>
<h1>
<a name="%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98" class="anchor" href="#%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98"><span class="octicon octicon-link"></span></a>常见问题</h1>
<p>See the page for FAQ: <a class="internal present" href="https://github.com/alibaba/otter/wiki/Faq">FAQ</a></p>
<p> </p>

<h1>
<a name="%E7%89%88%E6%9C%AC%E7%9B%B8%E5%85%B3-" class="anchor" href="#%E7%89%88%E6%9C%AC%E7%9B%B8%E5%85%B3-"><span class="octicon octicon-link"></span></a>版本相关: </h1>
<p>1. 建议版本:4.2.15  (otter开源版本从内部演变而来,所以初始版本直接从4.x开始) </p>
<p>2. 下载发布包:<a href="https://github.com/alibaba/otter/releases">download </a></p>
<p>3. maven依赖 : 暂无 </p>

<h1>相关开源</h1>
<ol>
<li>阿里巴巴mysql数据库binlog的增量订阅&消费组件:<a href="http://github.com/alibaba/canal">http://github.com/alibaba/canal</a></li>
<li>阿里巴巴去Oracle数据迁移同步工具(目标支持MySQL/DRDS):<a href="http://github.com/alibaba/yugong">http://github.com/alibaba/yugong</a></li>
</ol>

<p> </p>
<h1>
<a name="%E9%97%AE%E9%A2%98%E5%8F%8D%E9%A6%88" class="anchor" href="#%E9%97%AE%E9%A2%98%E5%8F%8D%E9%A6%88"><span class="octicon octicon-link"></span></a>问题反馈</h1>
<h3>
<a name="%E6%B3%A8%E6%84%8Fcanalotter-qq%E8%AE%A8%E8%AE%BA%E7%BE%A4%E5%B7%B2%E7%BB%8F%E5%BB%BA%E7%AB%8B%E7%BE%A4%E5%8F%B7161559791-%E6%AC%A2%E8%BF%8E%E5%8A%A0%E5%85%A5%E8%BF%9B%E8%A1%8C%E6%8A%80%E6%9C%AF%E8%AE%A8%E8%AE%BA" class="anchor" href="#%E6%B3%A8%E6%84%8Fcanalotter-qq%E8%AE%A8%E8%AE%BA%E7%BE%A4%E5%B7%B2%E7%BB%8F%E5%BB%BA%E7%AB%8B%E7%BE%A4%E5%8F%B7161559791-%E6%AC%A2%E8%BF%8E%E5%8A%A0%E5%85%A5%E8%BF%9B%E8%A1%8C%E6%8A%80%E6%9C%AF%E8%AE%A8%E8%AE%BA"><span class="octicon octicon-link"></span></a>注意:canal&amp;otter QQ讨论群已经建立,群号:161559791 ,欢迎加入进行技术讨论。</h3>

<p>1.  <span>qq交流群: 161559791</span></p>
<p><span>2.  </span><span>邮件交流: jianghang115@gmail.com</span></p>
<p><span>3.  </span><span>新浪微博: agapple0002</span></p>
<p><span>4.  </span><span>报告issue:</span><a href="https://github.com/alibaba/otter/issues">issues</a></p>
<p> </p>


================================================
FILE: codeformat.xml
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<profiles version="12">
<profile kind="CodeFormatterProfile" name="otter-format" version="12">
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="18"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="84"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
<setting id="org.eclipse.jdt.core.compiler.source" value="1.7"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="84"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="84"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
<setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="18"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="18"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="84"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.compiler.compliance" value="1.7"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="84"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="18"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode" value="enabled"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="18"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="18"/>
<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="18"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="18"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.7"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="18"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="true"/>
</profile>
</profiles>


================================================
FILE: codetemplates.xml
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?><templates><template autoinsert="true" context="gettercomment_context" deleted="false" description="Comment for getter method" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name="gettercomment">/**
 * @return the ${bare_field_name}
 */</template><template autoinsert="true" context="settercomment_context" deleted="false" description="Comment for setter method" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.settercomment" name="settercomment">/**
 * @param ${param} the ${bare_field_name} to set
 */</template><template autoinsert="true" context="constructorcomment_context" deleted="false" description="Comment for created constructors" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name="constructorcomment">/**
 * ${tags}
 */</template><template autoinsert="false" context="filecomment_context" deleted="false" description="Comment for created Java files" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.filecomment" name="filecomment"/><template autoinsert="false" context="typecomment_context" deleted="false" description="Comment for created types" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.typecomment" name="typecomment">/**
 * @author ${user} ${date} ${time}
 * @since 1.0.0
 */</template><template autoinsert="true" context="fieldcomment_context" deleted="false" description="Comment for fields" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name="fieldcomment">/**
 * 
 */</template><template autoinsert="true" context="methodcomment_context" deleted="false" description="Comment for non-overriding methods" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name="methodcomment">/**
 * ${tags}
 */</template><template autoinsert="false" context="overridecomment_context" deleted="false" description="Comment for overriding methods" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name="overridecomment"/><template autoinsert="true" context="delegatecomment_context" deleted="false" description="Comment for delegate methods" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name="delegatecomment">/**
 * ${tags}
 * ${see_to_target}
 */</template><template autoinsert="false" context="newtype_context" deleted="false" description="Newly created files" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.newtype" name="newtype">${filecomment}
${package_declaration}
${typecomment}
${type_declaration}</template><template autoinsert="true" context="classbody_context" deleted="false" description="Code in new class type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.classbody" name="classbody">
</template><template autoinsert="true" context="interfacebody_context" deleted="false" description="Code in new interface type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name="interfacebody">
</template><template autoinsert="true" context="enumbody_context" deleted="false" description="Code in new enum type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.enumbody" name="enumbody">
</template><template autoinsert="true" context="annotationbody_context" deleted="false" description="Code in new annotation type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name="annotationbody">
</template><template autoinsert="true" context="catchblock_context" deleted="false" description="Code in new catch blocks" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.catchblock" name="catchblock">// ${todo} Auto-generated catch block
${exception_var}.printStackTrace();</template><template autoinsert="true" context="methodbody_context" deleted="false" description="Code in created method stubs" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.methodbody" name="methodbody">// ${todo} Auto-generated method stub
${body_statement}</template><template autoinsert="true" context="constructorbody_context" deleted="false" description="Code in created constructor stubs" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name="constructorbody">${body_statement}
// ${todo} Auto-generated constructor stub</template><template autoinsert="true" context="getterbody_context" deleted="false" description="Code in created getters" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.getterbody" name="getterbody">return ${field};</template><template autoinsert="true" context="setterbody_context" deleted="false" description="Code in created setters" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.setterbody" name="setterbody">${field} = ${param};</template></templates>


================================================
FILE: docker/Dockerfile
================================================
FROM canal/otter-osbase:v1

MAINTAINER agapple (jianghang115@gmail.com)

# install otter
COPY image/ /tmp/docker/
COPY manager.deployer-*.tar.gz /home/admin/
COPY node.deployer-*.tar.gz /home/admin/

RUN \
    cp -R /tmp/docker/alidata /alidata && \
    chmod +x /alidata/bin/* && \
    mkdir -p /home/admin && \
    cp -R /tmp/docker/admin/* /home/admin/  && \
    /bin/cp -f alidata/bin/lark-wait /usr/bin/lark-wait && \
    mkdir -p /home/admin/manager && \
    tar -xzvf /home/admin/manager.deployer-*.tar.gz -C /home/admin/manager && \
    /bin/rm -f /home/admin/manager.deployer-*.tar.gz && \
    mkdir -p /home/admin/node && \
    tar -xzvf /home/admin/node.deployer-*.tar.gz -C /home/admin/node && \
    /bin/rm -f /home/admin/node.deployer-*.tar.gz && \
    mkdir -p home/admin/manager/logs  && \
    mkdir -p home/admin/node/logs  && \
    mkdir -p home/admin/zkData  && \
    chmod +x /home/admin/*.sh  && \
    chmod +x /home/admin/bin/*.sh  && \
    chown admin: -R /home/admin && \
    yum clean all && \
    true

ENV DOCKER_DEPLOY_TYPE=VM PATH=$PATH:/usr/local/mysql/bin:/usr/local/mysql/scripts

WORKDIR /home/admin

ENTRYPOINT [ "/alidata/bin/main.sh" ]
CMD [ "/home/admin/app.sh" ]


================================================
FILE: docker/base/Dockerfile
================================================
FROM canal/osbase:v1

MAINTAINER agapple (jianghang115@gmail.com)

RUN \
    groupadd -r mysql && useradd -r -g mysql mysql && \
    yum -y install wget mysql-server --nogpgcheck && \
    yum clean all && \
    wget -q https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz -O /home/admin/zookeeper-3.4.13.tar.gz && \
    tar -xzvf /home/admin/zookeeper-*.tar.gz -C /home/admin && \
    /bin/cp -rf /home/admin/zookeeper-3.4.13/conf/zoo_sample.cfg /home/admin/zookeeper-3.4.13/conf/zoo.cfg && \
    sed -i -e 's/^dataDir=\/tmp\/zookeeper$/dataDir=\/home\/admin\/zkData/' /home/admin/zookeeper-3.4.13/conf/zoo.cfg && \
    sed -i -e 's/^#autopurge/autopurge/' /home/admin/zookeeper-3.4.13/conf/zoo.cfg && \
    /bin/rm -f /home/admin/zookeeper-3.4.13.tar.gz && \
    true

CMD ["/bin/bash"]


================================================
FILE: docker/build.sh
================================================
#!/bin/bash

current_path=`pwd`
case "`uname`" in
    Darwin)
        bin_abs_path=`cd $(dirname $0); pwd`
        ;;
    Linux)
        bin_abs_path=$(readlink -f $(dirname $0))
        ;;
    *)
        bin_abs_path=`cd $(dirname $0); pwd`
        ;;
esac
BASE=${bin_abs_path}

if [ "$1" == "base" ] ; then
    docker build --no-cache -t canal/otter-osbase $BASE/base
else 
    rm -rf $BASE/node.*.tar.gz ; 
    rm -rf $BASE/manager.*.tar.gz ; 
    cd $BASE/../ && mvn clean package -Dmaven.test.skip -Denv=release && cd $current_path ;
    cp $BASE/../target/node.deployer-*.tar.gz $BASE/
    cp $BASE/../target/manager.deployer-*.tar.gz $BASE/
    docker build --no-cache -t canal/otter-all $BASE/
fi



================================================
FILE: docker/image/admin/app.sh
================================================
#!/bin/bash
set -e

source /etc/profile
export JAVA_HOME=/usr/java/latest
export PATH=$JAVA_HOME/bin:$PATH
touch /tmp/start.log
chown admin: /tmp/start.log
chown admin: /home/admin/manager
chown admin: /home/admin/node
chown admin: /home/admin/zkData
host=`hostname -i`

# default config
if [ -z "${RUN_MODE}" ]; then
    RUN_MODE="ALL"
fi

if [ -z "${MYSQL_USER_PASSWORD}" ]; then
    MYSQL_USER_PASSWORD="otter"
fi
if [ -z "${OTTER_MANAGER_MYSQL}" ]; then
    OTTER_MANAGER_MYSQL="127.0.0.1:3306"
fi
# waitterm
#   wait TERM/INT signal.
#   see: http://veithen.github.io/2014/11/16/sigterm-propagation.html
waitterm() {
        local PID
        # any process to block
        tail -f /dev/null &
        PID="$!"
        # setup trap, could do nothing, or just kill the blocker
        trap "kill -TERM ${PID}" TERM INT
        # wait for signal, ignore wait exit code
        wait "${PID}" || true
        # clear trap
        trap - TERM INT
        # wait blocker, ignore blocker exit code
        wait "${PID}" 2>/dev/null || true
}

# waittermpid "${PIDFILE}".
#   monitor process by pidfile && wait TERM/INT signal.
#   if the process disappeared, return 1, means exit with ERROR.
#   if TERM or INT signal received, return 0, means OK to exit.
waittermpid() {
        local PIDFILE PID do_run error
        PIDFILE="${1?}"
        do_run=true
        error=0
        trap "do_run=false" TERM INT
        while "${do_run}" ; do
                PID="$(cat "${PIDFILE}")"
                if ! ps -p "${PID}" >/dev/null 2>&1 ; then
                        do_run=false
                        error=1
                else
                        sleep 1
                fi
        done
        trap - TERM INT
        return "${error}"
}


function checkStart() {
    local name=$1
    local cmd=$2
    local timeout=$3
    cost=5
    while [ $timeout -gt 0 ]; do
        ST=`eval $cmd`
        if [ "$ST" == "0" ]; then
            sleep 1
            let timeout=timeout-1
            let cost=cost+1
        elif [ "$ST" == "" ]; then
            sleep 1
            let timeout=timeout-1
            let cost=cost+1
        else
            break
        fi
    done
    echo "$name start successful"
}

function start_zookeeper() {
    echo "start zookeeper ..."
    # start zookeeper
    rm -f /home/admin/zkData/myid
    sed -i '/^server\..*/d' /home/admin/zookeeper-3.4.13/conf/zoo.cfg
    su admin -c "mkdir -p /home/admin/zkData; cd /home/admin/zkData; /home/admin/zookeeper-3.4.13/bin/zkServer.sh start >> /home/admin/zkData/zookeeper.log 2>&1"
    sleep 5
    #check start
    checkStart "zookeeper" "echo stat | nc 127.0.0.1 2181 | grep -c Outstanding" 30
}

function stop_zookeeper() {
    # stop zookeeper
    echo "stop zookeeper"
    su admin -c 'mkdir -p /home/admin/zkData; cd /home/admin/zkData; /home/admin/zookeeper-3.4.13/bin/zkServer.sh stop >> /home/admin/zkData/zookeeper.log 2>&1'
    echo "stop zookeeper successful ..."
}

function start_manager() {
    echo "start manager ..."
    # start manager
    if [ -n "${OTTER_MANAGER_MYSQL}" ] ; then
        cmd="sed -i -e 's/^otter.database.driver.url.*$/otter.database.driver.url = jdbc:mysql:\/\/${OTTER_MANAGER_MYSQL}\/otter/' /home/admin/manager/conf/otter.properties"
        eval $cmd
        cmd="sed -i -e 's/^otter.database.driver.username.*$/otter.database.driver.username = ${MYSQL_USER}/' /home/admin/manager/conf/otter.properties"
        eval $cmd
        cmd="sed -i -e 's/^otter.database.driver.password.*$/otter.database.driver.password = ${MYSQL_USER_PASSWORD}/' /home/admin/manager/conf/otter.properties"
        eval $cmd
        cmd="sed -i -e 's/^otter.communication.manager.port.*$/otter.communication.manager.port = 8081/' /home/admin/manager/conf/otter.properties"
        eval $cmd
        cmd="sed -i -e 's/^otter.domainName.*$/otter.domainName = ${host}/' /home/admin/manager/conf/otter.properties"
        eval $cmd
    fi
    su admin -c "cd /home/admin/manager/bin ; sh startup.sh 1>>/tmp/start.log 2>&1"
    #check start
    sleep 5
    checkStart "manager" "nc 127.0.0.1 8080 -w 1 -z | wc -l" 60
}

function stop_manager() {
    # stop manager
    echo "stop manager"
    su admin -c 'cd /home/admin/manager/bin; sh stop.sh 1>>/tmp/start.log 2>&1'
    echo "stop manager successful ..."
}

function start_node() {
    echo "start node ..."
    # start node
    cmd="sed -i -e 's/^otter.manager.address.*$/otter.manager.address = 127.0.0.1:8081/' /home/admin/node/conf/otter.properties"
    eval $cmd
    
    su admin -c 'cd /home/admin/node/bin/ && echo 1 > /home/admin/node/conf/nid && sh startup.sh 1>>/tmp/start.log 2>&1'
    sleep 5
    #check start
    checkStart "node" "nc 127.0.0.1 2088 -w 1 -z | wc -l" 30
}

function stop_node() {
    # stop node
    echo "stop node"
    su admin -c 'cd /home/admin/node/bin/ && sh stop.sh'
    echo "stop node successful ..."
}

function start_mysql() {
    echo "start mysql ..."
    # start mysql
    MYSQL_ROOT_PASSWORD=Hello1234
    MYSQL_USER=otter
    MYSQL_DATABASE=otter
    if [ -z "$(ls -A /var/lib/mysql)" ]; then
        mysql_install_db --user=mysql --datadir=/var/lib/mysql 1>>/tmp/start.log 2>&1
        # These statements _must_ be on individual lines, and _must_ end with
        # semicolons (no line breaks or comments are permitted).
        # TODO proper SQL escaping on ALL the things D:
        TEMP_FILE='/tmp/init.sql'
        echo "update mysql.user set password=password('${MYSQL_ROOT_PASSWORD}') where user='root';" >> $TEMP_FILE
        echo "grant all privileges on *.* to 'root'@'%' WITH GRANT OPTION ;" >> $TEMP_FILE
        echo "create database if not exists $MYSQL_DATABASE ;" >> $TEMP_FILE
        echo "create user $MYSQL_USER identified by '$MYSQL_USER_PASSWORD' ;" >> $TEMP_FILE
        echo "grant all privileges on $MYSQL_DATABASE.* to '$MYSQL_USER'@'%' identified by '$MYSQL_USER_PASSWORD' ;" >> $TEMP_FILE
        echo "grant all privileges on $MYSQL_DATABASE.* to '$MYSQL_USER'@'localhost' identified by '$MYSQL_USER_PASSWORD' ;" >> $TEMP_FILE
        echo "flush privileges;" >> $TEMP_FILE
        service mysqld start
        checkStart "mysql" "echo 'show status' | mysql -s -h127.0.0.1 -P3306 -uroot | grep -c Uptime" 30
        mysql -h127.0.0.1 -uroot -e "source $TEMP_FILE" 1>>/tmp/start.log 2>&1

        cmd="sed -i -e 's/#OTTER_MY_ZK#/127.0.0.1:2181/' /home/admin/bin/ddl.sql"
        eval $cmd
        cmd="sed -i -e 's/#OTTER_NODE_HOST#/127.0.0.1/' /home/admin/bin/ddl.sql"
        eval $cmd
        cmd="mysql -h127.0.0.1 -u$MYSQL_USER -p$MYSQL_USER_PASSWORD $MYSQL_DATABASE -e 'source /home/admin/bin/ddl.sql' 1>>/tmp/start.log 2>&1"
        eval $cmd
        /bin/rm -f /home/admin/bin/ddl.sql
    else
        chown -R mysql:mysql /var/lib/mysql
        service mysqld start
        #check start
        checkStart "mysql" "echo 'show status' | mysql -b -s  -h127.0.0.1 -P3306 -uroot -p$MYSQL_ROOT_PASSWORD | grep -c Uptime" 30
    fi
}

function stop_mysql() {
    echo "stop mysql ..."
    # stop mysql
    service mysqld stop
    echo "stop mysql successful ..."
}

echo "==> START ..."
start_mysql
start_zookeeper
start_manager
start_node
echo "you can visit manager link : http://$host:8080/ , just have fun !"

echo "==> START SUCCESSFUL ..."

tail -f /dev/null &
# wait TERM signal
waitterm

echo "==> STOP"

stop_node
stop_manager
stop_zookeeper
stop_zookeeper
stop_mysql

echo "==> STOP SUCCESSFUL ..."

================================================
FILE: docker/image/admin/bin/clean_log
================================================
# cron clean log once per minute
*/2 * * * * admin /home/admin/bin/clean_log.sh >>/tmp/clean_log.log 2>&1


================================================
FILE: docker/image/admin/bin/clean_log.sh
================================================
#!/bin/bash

# Global Settings
PATH="$HOME/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin"
export PATH

CUTOFF="85"
#获取磁盘使用率最高的分区
USAGE=$(df -h|awk 'NR>1 {gsub(/%$/,"",$5);print $5 }'|sort -nr|head -1)
before=$USAGE

baseClean(){
    #删除tmp目录15天前的文件。
    #更新文档时间戳
    if [ -d /tmp/hsperfdata_admin ]
    then
        touch /tmp/hsperfdata_admin
        touch /tmp/hsperfdata_admin/*
    fi

    find /tmp/ -type f -mtime +15 | xargs -t rm -rf >/dev/null 2>&1


    now=$(df -h|awk 'NR>1 {gsub(/%$/,"",$5);print $5 }'|sort -nr|head -1)
    echo "before:$before; now:$now"
}


MANAGER_DIR="/home/admin/manager/logs"
NODE_DIR="/home/admin/node/logs"
if [[ -d $MANAGER_DIR ]]; then
  USAGE=$(df -h|awk 'NR>1 {gsub(/%$/,"",$5);print $5 }'|sort -nr|head -1)
  if [[ $USAGE -ge 90 ]]; then
        find $MANAGER_DIR -type f -mtime +7 | xargs rm -rf {}
  fi
  USAGE=$(df -h|awk 'NR>1 {gsub(/%$/,"",$5);print $5 }'|sort -nr|head -1)
  if [[ $USAGE -ge 80 ]]; then
        find $MANAGER_DIR -type f -mtime +3 | xargs rm -rf {}
  fi
  USAGE=$(df -h|awk 'NR>1 {gsub(/%$/,"",$5);print $5 }'|sort -nr|head -1)
  if [[ $USAGE -ge 80 ]]; then
        find $MANAGER_DIR -type d -empty -mtime +3 | grep -v manager | xargs rm -rf {}
        find $MANAGER_DIR -type f -iname '*.tmp' | xargs rm -rf {}
  fi
  baseClean
  exit 0
fi

if [[ -d $NODE_DIR ]]; then
  USAGE=$(df -h|awk 'NR>1 {gsub(/%$/,"",$5);print $5 }'|sort -nr|head -1)
  if [[ $USAGE -ge 90 ]]; then
        find $NODE_DIR -type f -mtime +7 | xargs rm -rf {}
  fi
  USAGE=$(df -h|awk 'NR>1 {gsub(/%$/,"",$5);print $5 }'|sort -nr|head -1)
  if [[ $USAGE -ge 80 ]]; then
        find $NODE_DIR -type f -mtime +3 | xargs rm -rf {}
  fi
  USAGE=$(df -h|awk 'NR>1 {gsub(/%$/,"",$5);print $5 }'|sort -nr|head -1)
  if [[ $USAGE -ge 80 ]]; then
        find $NODE_DIR -type d -empty -mtime +3 | grep -v node | xargs rm -rf {}
        find $NODE_DIR -type f -iname '*.tmp' | xargs rm -rf {}
  fi
  baseClean
  exit 0
fi

================================================
FILE: docker/image/admin/bin/ddl.sql
================================================
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `otter` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */;

USE `otter`;

CREATE TABLE `ALARM_RULE` (
  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `MONITOR_NAME` varchar(1024) DEFAULT NULL,
  `RECEIVER_KEY` varchar(1024) DEFAULT NULL,
  `STATUS` varchar(32) DEFAULT NULL,
  `PIPELINE_ID` bigint(20) NOT NULL,
  `DESCRIPTION` varchar(256) DEFAULT NULL,
  `GMT_CREATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `GMT_MODIFIED` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `MATCH_VALUE` varchar(1024) DEFAULT NULL,
  `PARAMETERS` text DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `AUTOKEEPER_CLUSTER` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `CLUSTER_NAME` varchar(200) NOT NULL,
  `SERVER_LIST` varchar(1024) NOT NULL,
  `DESCRIPTION` varchar(200) DEFAULT NULL,
  `GMT_CREATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `GMT_MODIFIED` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `CANAL` (
  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `NAME` varchar(200) DEFAULT NULL,
  `DESCRIPTION` varchar(200) DEFAULT NULL,
  `PARAMETERS` text DEFAULT NULL,
  `GMT_CREATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `GMT_MODIFIED` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `CANALUNIQUE` (`NAME`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `CHANNEL` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `NAME` varchar(200) NOT NULL,
  `DESCRIPTION` varchar(200) DEFAULT NULL,
  `PARAMETERS` text DEFAULT NULL,
  `GMT_CREATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `GMT_MODIFIED` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `CHANNELUNIQUE` (`NAME`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `COLUMN_PAIR` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `SOURCE_COLUMN` varchar(200) DEFAULT NULL,
  `TARGET_COLUMN` varchar(200) DEFAULT NULL,
  `DATA_MEDIA_PAIR_ID` bigint(20) NOT NULL,
  `GMT_CREATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `GMT_MODIFIED` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`),
  KEY `idx_DATA_MEDIA_PAIR_ID` (`DATA_MEDIA_PAIR_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `COLUMN_PAIR_GROUP` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `DATA_MEDIA_PAIR_ID` bigint(20) NOT NULL,
  `COLUMN_PAIR_CONTENT` text DEFAULT NULL,
  `GMT_CREATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `GMT_MODIFIED` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`),
  KEY `idx_DATA_MEDIA_PAIR_ID` (`DATA_MEDIA_PAIR_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `DATA_MEDIA` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `NAME` varchar(200) NOT NULL,
  `NAMESPACE` varchar(200) NOT NULL,
  `PROPERTIES` varchar(1000) NOT NULL,
  `DATA_MEDIA_SOURCE_ID` bigint(20) NOT NULL,
  `GMT_CREATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `GMT_MODIFIED` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `DATAMEDIAUNIQUE` (`NAME`,`NAMESPACE`,`DATA_MEDIA_SOURCE_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `DATA_MEDIA_PAIR` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `PULLWEIGHT` bigint(20) DEFAULT NULL,
  `PUSHWEIGHT` bigint(20) DEFAULT NULL,
  `RESOLVER` text DEFAULT NULL,
  `FILTER` text DEFAULT NULL,
  `SOURCE_DATA_MEDIA_ID` bigint(20) DEFAULT NULL,
  `TARGET_DATA_MEDIA_ID` bigint(20) DEFAULT NULL,
  `PIPELINE_ID` bigint(20) NOT NULL,
  `COLUMN_PAIR_MODE` varchar(20) DEFAULT NULL,
  `GMT_CREATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `GMT_MODIFIED` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`),
  KEY `idx_PipelineID` (`PIPELINE_ID`,`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `DATA_MEDIA_SOURCE` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `NAME` varchar(200) NOT NULL,
  `TYPE` varchar(20) NOT NULL,
  `PROPERTIES` varchar(1000) NOT NULL,
  `GMT_CREATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `GMT_MODIFIED` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `DATAMEDIASOURCEUNIQUE` (`NAME`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `DELAY_STAT` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `DELAY_TIME` bigint(20) NOT NULL,
  `DELAY_NUMBER` bigint(20) NOT NULL,
  `PIPELINE_ID` bigint(20) NOT NULL,
  `GMT_CREATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `GMT_MODIFIED` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`),
  KEY `idx_PipelineID_GmtModified_ID` (`PIPELINE_ID`,`GMT_MODIFIED`,`ID`),
  KEY `idx_Pipeline_GmtCreate` (`PIPELINE_ID`,`GMT_CREATE`),
  KEY `idx_GmtCreate_id` (`GMT_CREATE`,`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `LOG_RECORD` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `NID` varchar(200) DEFAULT NULL,
  `CHANNEL_ID` varchar(200) NOT NULL,
  `PIPELINE_ID` varchar(200) NOT NULL,
  `TITLE` varchar(1000) DEFAULT NULL,
  `MESSAGE` text DEFAULT NULL,
  `GMT_CREATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `GMT_MODIFIED` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`),
  KEY `logRecord_pipelineId` (`PIPELINE_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `NODE` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `NAME` varchar(200) NOT NULL,
  `IP` varchar(200) NOT NULL,
  `PORT` bigint(20) NOT NULL,
  `DESCRIPTION` varchar(200) DEFAULT NULL,
  `PARAMETERS` text DEFAULT NULL,
  `GMT_CREATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `GMT_MODIFIED` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `NODEUNIQUE` (`NAME`,`IP`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `PIPELINE` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `NAME` varchar(200) NOT NULL,
  `DESCRIPTION` varchar(200) DEFAULT NULL,
  `PARAMETERS` text DEFAULT NULL,
  `CHANNEL_ID` bigint(20) NOT NULL,
  `GMT_CREATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `GMT_MODIFIED` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `PIPELINEUNIQUE` (`NAME`,`CHANNEL_ID`),
  KEY `idx_ChannelID` (`CHANNEL_ID`,`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `PIPELINE_NODE_RELATION` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `NODE_ID` bigint(20) NOT NULL,
  `PIPELINE_ID` bigint(20) NOT NULL,
  `LOCATION` varchar(20) NOT NULL,
  `GMT_CREATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `GMT_MODIFIED` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`),
  KEY `idx_PipelineID` (`PIPELINE_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `SYSTEM_PARAMETER` (
  `ID` bigint(20) unsigned NOT NULL,
  `VALUE` text DEFAULT NULL,
  `GMT_CREATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `GMT_MODIFIED` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `TABLE_HISTORY_STAT` (
  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `FILE_SIZE` bigint(20) DEFAULT NULL,
  `FILE_COUNT` bigint(20) DEFAULT NULL,
  `INSERT_COUNT` bigint(20) DEFAULT NULL,
  `UPDATE_COUNT` bigint(20) DEFAULT NULL,
  `DELETE_COUNT` bigint(20) DEFAULT NULL,
  `DATA_MEDIA_PAIR_ID` bigint(20) DEFAULT NULL,
  `PIPELINE_ID` bigint(20) DEFAULT NULL,
  `START_TIME` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `END_TIME` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `GMT_CREATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `GMT_MODIFIED` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`),
  KEY `idx_DATA_MEDIA_PAIR_ID_END_TIME` (`DATA_MEDIA_PAIR_ID`,`END_TIME`),
  KEY `idx_GmtCreate_id` (`GMT_CREATE`,`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `TABLE_STAT` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `FILE_SIZE` bigint(20) NOT NULL,
  `FILE_COUNT` bigint(20) NOT NULL,
  `INSERT_COUNT` bigint(20) NOT NULL,
  `UPDATE_COUNT` bigint(20) NOT NULL,
  `DELETE_COUNT` bigint(20) NOT NULL,
  `DATA_MEDIA_PAIR_ID` bigint(20) NOT NULL,
  `PIPELINE_ID` bigint(20) NOT NULL,
  `GMT_CREATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `GMT_MODIFIED` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`),
  KEY `idx_PipelineID_DataMediaPairID` (`PIPELINE_ID`,`DATA_MEDIA_PAIR_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `THROUGHPUT_STAT` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `TYPE` varchar(20) NOT NULL,
  `NUMBER` bigint(20) NOT NULL,
  `SIZE` bigint(20) NOT NULL,
  `PIPELINE_ID` bigint(20) NOT NULL,
  `START_TIME` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `END_TIME` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `GMT_CREATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `GMT_MODIFIED` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`),
  KEY `idx_PipelineID_Type_GmtCreate_ID` (`PIPELINE_ID`,`TYPE`,`GMT_CREATE`,`ID`),
  KEY `idx_PipelineID_Type_EndTime_ID` (`PIPELINE_ID`,`TYPE`,`END_TIME`,`ID`),
  KEY `idx_GmtCreate_id` (`GMT_CREATE`,`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `USER` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `USERNAME` varchar(20) NOT NULL,
  `PASSWORD` varchar(20) NOT NULL,
  `AUTHORIZETYPE` varchar(20) NOT NULL,
  `DEPARTMENT` varchar(20) NOT NULL,
  `REALNAME` varchar(20) NOT NULL,
  `GMT_CREATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `GMT_MODIFIED` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `USERUNIQUE` (`USERNAME`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE  `DATA_MATRIX` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `GROUP_KEY` varchar(200) DEFAULT NULL,
  `MASTER` varchar(200) DEFAULT NULL,
  `SLAVE` varchar(200) DEFAULT NULL,
  `DESCRIPTION` varchar(200) DEFAULT NULL,
  `GMT_CREATE` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `GMT_MODIFIED` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`),
  KEY `GROUPKEY` (`GROUP_KEY`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `meta_history` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `gmt_create` datetime NOT NULL COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL COMMENT '修改时间',
  `destination` varchar(128) DEFAULT NULL COMMENT '通道名称',
  `binlog_file` varchar(64) DEFAULT NULL COMMENT 'binlog文件名',
  `binlog_offest` bigint(20) DEFAULT NULL COMMENT 'binlog偏移量',
  `binlog_master_id` varchar(64) DEFAULT NULL COMMENT 'binlog节点id',
  `binlog_timestamp` bigint(20) DEFAULT NULL COMMENT 'binlog应用的时间戳',
  `use_schema` varchar(1024) DEFAULT NULL COMMENT '执行sql时对应的schema',
  `sql_schema` varchar(1024) DEFAULT NULL COMMENT '对应的schema',
  `sql_table` varchar(1024) DEFAULT NULL COMMENT '对应的table',
  `sql_text` longtext DEFAULT NULL COMMENT '执行的sql',
  `sql_type` varchar(256) DEFAULT NULL COMMENT 'sql类型',
  `extra` text DEFAULT NULL COMMENT '额外的扩展信息',
  PRIMARY KEY (`id`),
  UNIQUE KEY binlog_file_offest(`destination`,`binlog_master_id`,`binlog_file`,`binlog_offest`),
  KEY `destination` (`destination`),
  KEY `destination_timestamp` (`destination`,`binlog_timestamp`),
  KEY `gmt_modified` (`gmt_modified`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='表结构变化明细表';

CREATE TABLE IF NOT EXISTS `meta_snapshot` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `gmt_create` datetime NOT NULL COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL COMMENT '修改时间',
  `destination` varchar(128) DEFAULT NULL COMMENT '通道名称',
  `binlog_file` varchar(64) DEFAULT NULL COMMENT 'binlog文件名',
  `binlog_offest` bigint(20) DEFAULT NULL COMMENT 'binlog偏移量',
  `binlog_master_id` varchar(64) DEFAULT NULL COMMENT 'binlog节点id',
  `binlog_timestamp` bigint(20) DEFAULT NULL COMMENT 'binlog应用的时间戳',
  `data` longtext DEFAULT NULL COMMENT '表结构数据',
  `extra` text DEFAULT NULL COMMENT '额外的扩展信息',
  PRIMARY KEY (`id`),
  UNIQUE KEY binlog_file_offest(`destination`,`binlog_master_id`,`binlog_file`,`binlog_offest`),
  KEY `destination` (`destination`),
  KEY `destination_timestamp` (`destination`,`binlog_timestamp`),
  KEY `gmt_modified` (`gmt_modified`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='表结构记录表快照表';


insert into USER(ID,USERNAME,PASSWORD,AUTHORIZETYPE,DEPARTMENT,REALNAME,GMT_CREATE,GMT_MODIFIED) values(null,'admin','801fc357a5a74743894a','ADMIN','admin','admin',now(),now());
insert into USER(ID,USERNAME,PASSWORD,AUTHORIZETYPE,DEPARTMENT,REALNAME,GMT_CREATE,GMT_MODIFIED) values(null,'guest','471e02a154a2121dc577','OPERATOR','guest','guest',now(),now());

replace into AUTOKEEPER_CLUSTER(ID,CLUSTER_NAME,SERVER_LIST,DESCRIPTION,GMT_CREATE,GMT_MODIFIED) values(1,'default','["#OTTER_MY_ZK#"]',NULL,now(),now());
replace into NODE(ID,NAME,IP,PORT,DESCRIPTION,PARAMETERS,GMT_CREATE,GMT_MODIFIED) values(1,'default','#OTTER_NODE_HOST#',2088,NULL,'{"downloadPort":2089,"mbeanPort":2090,"useExternalIp":false,"zkCluster":{"clusterName":"default","id":1}}', now(), now());


================================================
FILE: docker/image/admin/health.sh
================================================
#!/bin/sh
CHECK_URL="http://127.0.0.1:8080/ok.htm"
CHECK_POINT="ok"
CHECK_COUNT=`curl -s --connect-timeout 7 --max-time 7 $CHECK_URL | grep -c $CHECK_POINT`
if [ $CHECK_COUNT -eq 0 ]; then
    echo "[FAILED]"
    status=0
	error=1
else
    echo "[  OK  ]"
    status=1
	error=0
fi

================================================
FILE: docker/image/alidata/bin/exec_rc_local.sh
================================================
#!/bin/bash

if [ "${SKIP_EXEC_RC_LOCAL}" = "YES" ] ; then
	echo "skip /etc/rc.local: SKIP_EXEC_RC_LOCAL=${SKIP_EXEC_RC_LOCAL}"
	exit
fi

if [ "${DOCKER_DEPLOY_TYPE}" = "HOST" ] ; then
	echo "skip /etc/rc.local: DOCKER_DEPLOY_TYPE=${DOCKER_DEPLOY_TYPE}"
	exit
fi

================================================
FILE: docker/image/alidata/bin/lark-wait
================================================
#!/bin/bash
set -e

chown admin: -R /home/admin/
source /alidata/lib/proc.sh
waitterm


================================================
FILE: docker/image/alidata/bin/main.sh
================================================
#!/bin/bash

[ -n "${DOCKER_DEPLOY_TYPE}" ] || DOCKER_DEPLOY_TYPE="VM"
echo "DOCKER_DEPLOY_TYPE=${DOCKER_DEPLOY_TYPE}"

# run init scripts
for e in $(ls /alidata/init/*) ; do
	[ -x "${e}" ] || continue
	echo "==> INIT $e"
	$e
	echo "==> EXIT CODE: $?"
done

echo "==> INIT DEFAULT"
service sshd start
service crond start

#echo "check hostname -i: `hostname -i`"
#hti_num=`hostname -i|awk '{print NF}'`
#if [ $hti_num -gt 1 ];then
#    echo "hostname -i result error:`hostname -i`"
#    exit 120
#fi

echo "==> INIT DONE"
echo "==> RUN ${*}"
exec "${@}"

================================================
FILE: docker/image/alidata/init/02init-sshd.sh
================================================
#!/bin/bash

# set port
if [ -z "${SSHD_PORT}" ] ; then
	SSHD_PORT=22
	[ "${DOCKER_DEPLOY_TYPE}" = "HOST" ] && SSHD_PORT=2222
fi

sed -r -i '/^OPTIONS=/ d' /etc/sysconfig/sshd
echo 'OPTIONS="-p '"${SSHD_PORT}"'"' >> /etc/sysconfig/sshd

# set admin ssh pulic key
if [ "${USE_ADMIN_PASSAGE}" = "YES" ] ; then
    echo "set admin passage"
    mkdir -p /home/admin/.ssh
    chown admin:admin /home/admin/.ssh
    chown admin:admin /home/admin/.ssh/authorized_keys
    chmod 644 /home/admin/.ssh/authorized_keys
fi


================================================
FILE: docker/image/alidata/init/fix-hosts.py
================================================
#!/usr/bin/python
# -*- coding: utf-8 -*-
#****************************************************************#
# Create Date: 2017-01-06 17:58
#***************************************************************#

import socket
import shutil
from time import gmtime, strftime

# get host_name
host_name = socket.gethostname()
tmp_file = "/tmp/.lark-fix-host.hosts"
host_file = "/etc/hosts"
bak_file_name = "/tmp/hosts-fix-bak.%s" % ( strftime("%Y-%m-%d_%H-%M-%S", gmtime()) )

# load /etc/hosts file context
FH = open(host_file,"r")
file_lines = [ i.rstrip() for i in FH.readlines()]
FH.close()
file_lines_reverse = file_lines[::-1]
new_lines = []
bad_lines = []
last_match_line = ""

for line in file_lines_reverse:
    if line.find(host_name) < 0:  # 不匹配的行直接跳过
        new_lines.append(line + "\n")
        continue

    cols = line.split()
    new_cols = []
    if cols[0].startswith("#"): # 跳过已经注释掉的行
        new_lines.append(line + "\n")
        continue
    for col in cols:
        if not col == host_name: # 跳过不匹配的列
            new_cols.append(col)
            continue

        if cols[0] == "127.0.0.1": # 如果第一列是 127.0.0.1 就跳过匹配的列, 防止 hostname -i 返回 127.0.0.1
            continue

        # 如果已经发现过匹配的列, 就丢掉重复的列
        if not len(last_match_line) == 0:
            continue

        new_cols.append(col)
        last_match_line = line

    # 跳过 xx.xx.xx.xx hostname 这样的重复列
    if len(new_cols) == 1:
        continue

    new_l = "%s\n" % " ".join(new_cols)
    new_lines.append(new_l)

# save tmp hosts

FH2=file(tmp_file,"w+")
FH2.writelines( new_lines[::-1])
FH2.close()

# mv to /etc/hosts
shutil.copy(host_file, bak_file_name)
shutil.move(tmp_file, host_file)


================================================
FILE: docker/image/alidata/lib/proc.sh
================================================
# waitterm
#   wait TERM/INT signal.
#   see: http://veithen.github.io/2014/11/16/sigterm-propagation.html
waitterm() {
	local PID
	# any process to block
	tail -f /dev/null &
	PID="$!"
	# setup trap, could do nothing, or just kill the blocker
	trap "kill -TERM ${PID}" TERM INT
	# wait for signal, ignore wait exit code
	wait "${PID}" || true
	# clear trap
	trap - TERM INT
	# wait blocker, ignore blocker exit code
	wait "${PID}" 2>/dev/null || true
}

# waittermpid "${PIDFILE}".
#   monitor process by pidfile && wait TERM/INT signal.
#   if the process disappeared, return 1, means exit with ERROR.
#   if TERM or INT signal received, return 0, means OK to exit.
waittermpid() {
	local PIDFILE PID do_run error
	PIDFILE="${1?}"
	do_run=true
	error=0
	trap "do_run=false" TERM INT
	while "${do_run}" ; do
		PID="$(cat "${PIDFILE}")"
		if ! ps -p "${PID}" >/dev/null 2>&1 ; then
			do_run=false
			error=1
		else
			sleep 1
		fi
	done
	trap - TERM INT
	return "${error}"
}


================================================
FILE: docker/run.sh
================================================
#!/bin/bash

function usage() {
    echo "Usage:"
    echo "  run.sh [CONFIG]"
    echo "example:"
    echo "  run.sh NODE -e OTTER_MANAGER=127.0.0.1:8080"
    exit
}

function check_port() {
    local port=$1
    local TL=$(which telnet)
    if [ -f $TL ]; then
        data=`echo quit | telnet 127.0.0.1 $port| grep -ic connected`
        echo $data
        return
    fi

    local NC=$(which nc)
    if [ -f $NC ]; then
        data=`nc -z -w 1 127.0.0.1 $port | grep -ic succeeded`
        echo $data
        return
    fi
    echo "0"
    return
}

function getMyIp() {
    case "`uname`" in
        Darwin)
         myip=`echo "show State:/Network/Global/IPv4" | scutil | grep PrimaryInterface | awk '{print $3}' | xargs ifconfig | grep inet | grep -v inet6 | awk '{print $2}'`
         ;;
        *)
         myip=`ip route get 1 | awk '{print $NF;exit}'`
         ;;
  esac
  echo $myip
}

NET_MODE=""
case "`uname`" in
    Darwin)
        bin_abs_path=`cd $(dirname $0); pwd`
        ;;
    Linux)
        bin_abs_path=$(readlink -f $(dirname $0))
        NET_MODE="--net=host"
        ;;
    *)
        NET_MODE="--net=host"
        bin_abs_path=`cd $(dirname $0); pwd`
        ;;
esac
BASE=${bin_abs_path}
if [ "$1" == "-h" ] ; then
    usage
elif [ "$1" == "help" ] ; then
    usage
fi

DATA="$BASE/data"
mkdir -p $DATA
RUN_MODE=$1
CONFIG=${@:2}
VOLUMNS="-v $DATA/mysql:/var/lib/mysql -v $DATA/zkData:/home/admin/zkData"
PORTLIST="8080 8081 2181 2088 2089 2090"

PORTS=""
for PORT in $PORTLIST ; do
    #exist=`check_port $PORT`
    exist="0"
    if [ "$exist" == "0" ]; then
        PORTS="$PORTS -p $PORT:$PORT"
    else
        echo "port $PORT is used , pls check"
        exit 1
    fi
done
MEMORY="-m 4096m"
LOCALHOST=`getMyIp`
cmd="docker run -d -it -h $LOCALHOST $CONFIG --name=otter-all $VOLUMNS $NET_MODE $PORTS $MEMORY canal/otter-all"
echo $cmd
eval $cmd


================================================
FILE: lib/install.bat
================================================
call mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.1.0.7.0 -Dpackaging=jar -Dfile=ojdbc6.jar -DgeneratePom=true
call mvn install:install-file -DgroupId=org.jtester -DartifactId=jtester -Dversion=1.1.8 -Dpackaging=jar -DpomFile=jtester-1.1.8.pom -Dfile=jtester-1.1.8.jar -Dsources=jtester-1.1.8-sources.jar
call mvn install:install-file -DgroupId=mockit -DartifactId=jmockit -Dversion=0.999.10 -Dpackaging=jar -DpomFile=jmockit-0.999.10.pom -Dfile=jmockit-0.999.10.jar -Dsources=jmockit-0.999.10-sources.jar


================================================
FILE: lib/install.sh
================================================
#!/bin/bash
mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.1.0.7.0 -Dpackaging=jar -Dfile=ojdbc6.jar -DgeneratePom=true
mvn install:install-file -DgroupId=org.jtester -DartifactId=jtester -Dversion=1.1.8 -Dpackaging=jar -DpomFile=jtester-1.1.8.pom -Dfile=jtester-1.1.8.jar -Dsources=jtester-1.1.8-sources.jar
mvn install:install-file -DgroupId=mockit -DartifactId=jmockit -Dversion=0.999.10 -Dpackaging=jar -DpomFile=jmockit-0.999.10.pom -Dfile=jmockit-0.999.10.jar -Dsources=jmockit-0.999.10-sources.jar


================================================
FILE: lib/jmockit-0.999.10.pom
================================================
<project
   xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
   
   <groupId>mockit</groupId>
   <artifactId>jmockit</artifactId>
   <version>0.999.10</version>
   <name>Main</name>

   <build>
      <resources>
         <resource>
            <directory>src</directory>
            <includes><include>jmockit.properties</include></includes>
         </resource>
      </resources>
      <plugins>
         <plugin>
            <artifactId>maven-jar-plugin</artifactId><version>2.2</version>
            <executions>
               <execution>
                  <phase>compile</phase>
                  <goals><goal>jar</goal></goals>
               </execution>
            </executions>
            <configuration>
               <archive>
                  <addMavenDescriptor>false</addMavenDescriptor>
                  <forced/><manifestFile>META-INF/MANIFEST.MF</manifestFile>
               </archive>
               <excludes><exclude>Temp.class</exclude></excludes>
            </configuration>
         </plugin>
         <plugin>
            <artifactId>maven-source-plugin</artifactId><version>2.1.2</version>
            <executions>
               <execution>
                  <id>attach-sources</id>
                  <goals><goal>jar</goal></goals>
               </execution>
            </executions>
         </plugin>
         <plugin>
            <artifactId>maven-surefire-plugin</artifactId><version>2.5</version>
            <configuration>
               <testNGArtifactName>none:none</testNGArtifactName>
               <argLine>-javaagent:"${project.build.directory}"/jmockit-${project.version}.jar</argLine>
               <excludes>
                  <exclude>**/*$*</exclude>
                  <exclude>**/Base*Test.class</exclude>
                  <exclude>**/testng/*Test.class</exclude>
                  <exclude>**/MockStateBetweenTestMethodsNGTest.class</exclude>
               </excludes>
            </configuration>
         </plugin>
      </plugins>
   </build>

   <dependencies>
      <dependency>
         <groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version>
         <optional>true</optional>
      </dependency>
      <dependency>
         <groupId>org.testng</groupId><artifactId>testng</artifactId><version>6.0.1</version>
         <optional>true</optional>
         <exclusions>
            <exclusion><groupId>org.beanshell</groupId><artifactId>bsh</artifactId></exclusion>
            <exclusion><groupId>com.google.inject</groupId><artifactId>guice</artifactId></exclusion>
            <exclusion><groupId>com.beust</groupId><artifactId>jcommander</artifactId></exclusion>
            <exclusion><groupId>org.yaml</groupId><artifactId>snakeyaml</artifactId></exclusion>
         </exclusions>
      </dependency>
      <dependency>
         <groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.1</version>
         <optional>true</optional>
      </dependency>
      <dependency>
         <groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.5.8</version>
         <optional>true</optional>
      </dependency>
      <dependency>
         <groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.15</version>
         <optional>true</optional>
         <exclusions>
            <exclusion><groupId>javax.jms</groupId><artifactId>jms</artifactId></exclusion>
            <exclusion><groupId>javax.mail</groupId><artifactId>mail</artifactId></exclusion>
            <exclusion><groupId>com.sun.jmx</groupId><artifactId>jmxri</artifactId></exclusion>
            <exclusion><groupId>com.sun.jdmk</groupId><artifactId>jmxtools</artifactId></exclusion>
         </exclusions>
      </dependency>
   </dependencies>
</project>


================================================
FILE: lib/jtester-1.1.8.pom
================================================
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>org.jtester</groupId>
	<artifactId>jtester</artifactId>
	<version>1.1.8</version>
	<packaging>jar</packaging>
	<name>jtester core</name>

	<dependencies>
		<dependency>
			<groupId>org.testng</groupId>
			<artifactId>testng</artifactId>
			<version>6.1.1</version>
		</dependency>
		<dependency>
			<groupId>mockit</groupId>
			<artifactId>jmockit</artifactId>
			<version>0.999.10</version>
		</dependency>
		<dependency>
			<groupId>commons-dbcp</groupId>
			<artifactId>commons-dbcp</artifactId>
			<version>1.2.2</version>
		</dependency>
		<dependency>
			<groupId>cglib</groupId>
			<artifactId>cglib-nodep</artifactId>
			<version>2.1_3</version>
		</dependency>
		<dependency>
			<groupId>org.fitnesse</groupId>
			<artifactId>fitnesse</artifactId>
			<version>20111025</version>
		</dependency>
		<dependency>
			<groupId>ognl</groupId>
			<artifactId>ognl</artifactId>
			<version>2.7.2</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring</artifactId>
			<version>2.5.4</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aspects</artifactId>
			<version>2.5.4</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.transaction</groupId>
			<artifactId>jta</artifactId>
			<version>1.1</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.ibatis</groupId>
			<artifactId>ibatis-sqlmap</artifactId>
			<version>2.3.4.726</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>2.5.4</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.annotation</groupId>
			<artifactId>jsr250-api</artifactId>
			<version>1.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.6</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>com.h2database</groupId>
			<artifactId>h2</artifactId>
			<version>1.1.107</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>com.oracle</groupId>
			<artifactId>ojdbc6</artifactId>
			<version>11.1.0.7.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.4</version>
			<scope>provided</scope>
		</dependency>
	</dependencies>

	<build>
		<sourceDirectory>src/main/java</sourceDirectory>
		<outputDirectory>target/classes</outputDirectory>
		<resources>
			<resource>
				<directory>src/main/resources</directory>
			</resource>
		</resources>

		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.0.2</version>
				<configuration>
					<source>1.5</source>
					<target>1.5</target>
					<encoding>utf-8</encoding>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<version>2.2</version>
				<!-- <configuration> -->
				<!-- <archive> -->
				<!-- <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile> -->
				<!-- </archive> -->
				<!-- </configuration> -->
			</plugin>
			<plugin>
				<artifactId>maven-source-plugin</artifactId>
				<executions>
					<execution>
						<id>attach-sources</id>
						<goals>
							<goal>jar</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>


================================================
FILE: manager/biz/pom.xml
================================================
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.alibaba.otter</groupId>
		<artifactId>manager</artifactId>
		<version>4.2.19-SNAPSHOT</version>
		<relativePath>../pom.xml</relativePath>
	</parent>
	<groupId>com.alibaba.otter</groupId>
	<artifactId>manager.biz</artifactId>
	<packaging>jar</packaging>
	<name>manager biz module for otter</name>
	<url>http://github.com/alibaba/otter</url>

	<dependencies>
		<dependency>
			<groupId>com.alibaba.otter</groupId>
			<artifactId>shared.common</artifactId>
			<version>${project.version}</version>
		</dependency>

		<dependency>
			<groupId>com.alibaba.otter</groupId>
			<artifactId>shared.push</artifactId>
			<version>${project.version}</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba.otter</groupId>
			<artifactId>canal.instance.manager</artifactId>
			<version>${otter_canal_version}</version>
			<exclusions>
				<exclusion>
					<groupId>org.springframework</groupId>
					<artifactId>spring</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>cglib</groupId>
			<artifactId>cglib-nodep</artifactId>
		</dependency>
		<dependency>
			<groupId>org.apache.ibatis</groupId>
			<artifactId>ibatis-sqlmap</artifactId>
		</dependency>
		<dependency>
			<groupId>commons-dbcp</groupId>
			<artifactId>commons-dbcp</artifactId>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
		<!-- oracle -->
		<dependency>
			<groupId>com.oracle</groupId>
			<artifactId>ojdbc6</artifactId>
		</dependency>

		<!-- spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
		</dependency>
		<dependency>
			<groupId>javax.mail</groupId>
			<artifactId>mail</artifactId>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
		</dependency>
		<dependency>
			<groupId>com.google.guava</groupId>
			<artifactId>guava</artifactId>
		</dependency>

		<!-- test dependency -->
		<dependency>
			<groupId>org.jtester</groupId>
			<artifactId>jtester</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>
</project>


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/autokeeper/AutoKeeperStatService.java
================================================
/*
 * Copyright (C) 2010-2101 Alibaba Group Holding Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     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.alibaba.otter.manager.biz.autokeeper;

import java.util.List;

import com.alibaba.otter.shared.common.model.autokeeper.AutoKeeperConnectionStat;
import com.alibaba.otter.shared.common.model.autokeeper.AutoKeeperServerStat;

/**
 * zookeeper状态查询接口
 * 
 * @author jianghang 2012-9-21 下午02:42:16
 * @version 4.1.0
 */
public interface AutoKeeperStatService {

    /**
     * 根据serverIp查询对应的统计信息,包括Connection/Watch/Ephemeral等统计信息
     * 
     * @param serverIp
     * @return
     */
    public AutoKeeperServerStat findServerStat(String serverIp);

    /**
     * 根据sessionId查询对应的统计信息,包括详细的Connection/Watch/Ephemeral等统计信息
     * 
     * @param sessionId
     * @return
     */
    public AutoKeeperServerStat findServerStatBySessionId(String sessionId);

    /**
     * 根据sessionId查询对应的connction链接
     * 
     * @param sessionId
     * @return
     */
    public AutoKeeperConnectionStat findConnectionBySessionId(String sessionId);

    /**
     * 根据临时节点路径查询对应的connection统计信息
     * 
     * @param path
     * @return
     */
    public AutoKeeperConnectionStat findConnectionByEphemeralPath(String path);

    /**
     * 根据watcher路径查询对应的connection统计信息
     * 
     * @param path
     * @return
     */
    public List<AutoKeeperConnectionStat> findConnectionByWatcherPath(String path);
}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/autokeeper/impl/AutoKeeperCollector.java
================================================
/*
 * Copyright (C) 2010-2101 Alibaba Group Holding Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     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.alibaba.otter.manager.biz.autokeeper.impl;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import javax.annotation.Resource;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.InitializingBean;

import com.alibaba.otter.manager.biz.common.exceptions.ManagerException;
import com.alibaba.otter.manager.biz.config.autokeeper.AutoKeeperClusterService;
import com.alibaba.otter.manager.biz.utils.RegexUtils;
import com.alibaba.otter.shared.common.model.autokeeper.AutoKeeperCluster;
import com.alibaba.otter.shared.common.model.autokeeper.AutoKeeperConnectionStat;
import com.alibaba.otter.shared.common.model.autokeeper.AutoKeeperEphemeralStat;
import com.alibaba.otter.shared.common.model.autokeeper.AutoKeeperQuorumType;
import com.alibaba.otter.shared.common.model.autokeeper.AutoKeeperServerStat;
import com.alibaba.otter.shared.common.model.autokeeper.AutoKeeperWatchStat;
import com.alibaba.otter.shared.common.utils.cmd.Exec;
import com.alibaba.otter.shared.common.utils.cmd.Exec.Result;
import com.alibaba.otter.shared.common.utils.thread.NamedThreadFactory;

/**
 * 对应的数据采集器
 * 
 * @author jianghang 2012-9-21 下午03:05:28
 * @version 4.1.0
 */
public class AutoKeeperCollector implements InitializingBean {

    @Resource(name = "autoKeeperClusterService")
    private AutoKeeperClusterService autoKeeperClusterService;

    private static final String      MODE_FOLLOWER            = "Mode: follower";
    private static final String      MODE_LEADERER            = "Mode: leader";
    private static final String      MODE_OBSERVER            = "Mode: observer";
    private static final String      MODE_STANDALONE          = "Mode: standalone";
    private static final String      NODE_COUNT               = "Node count:";
    private static final String      STRING_LATENCY           = "Latency min/avg/max:";
    private static final String      STRING_SENT              = "Sent:";
    private static final String      STRING_RECEIVED          = "Received:";
    private static final String      STRING_OUTSTANDING       = "Outstanding:";
    private static final String      COMMA                    = ",";
    private static final String      BRACKETS                 = ")";
    private static final String      COLON                    = ":";
    private static final String      WRAP                     = "\n";
    private static final String      CMD_STAT                 = "echo stat | nc %s %s";
    private static final String      CMD_CONS                 = "echo cons | nc %s %s";
    private static final String      CMD_DUMP                 = "echo dump | nc %s %s";
    private static final String      CMD_WCHC                 = "echo wchc | nc %s %s";
    private static final long        DEFAULT_COLLECT_INTERVAL = 300;
    private long                     delay                    = 1;
    private int                      singleSize               = 1;
    private long                     collectInterval          = DEFAULT_COLLECT_INTERVAL;

    private AutoKeeperData           autoKeeperData;
    private ScheduledExecutorService collectorExecutor;

    public void collectorConnectionStat(String address) {
        List<String> netAddress = splitAddress(address);
        if (netAddress.isEmpty()) {
            return;
        }
        String ip = netAddress.get(0);
        String port = netAddress.get(1);
        String[] cmd = { "/bin/bash", "-c", String.format(CMD_CONS, ip, port) };
        String cmdresult = collector(cmd);
        String[] result = cmdresult.split(WRAP);
        List<AutoKeeperConnectionStat> summary = new ArrayList<AutoKeeperConnectionStat>();

        for (String line : result) {

            if (StringUtils.isBlank(line)) {
                continue;
            }

            String[] lineArray = line.split(":");
            if (2 != lineArray.length) {
                continue;
            }

            AutoKeeperConnectionStat autoKeeperConnectionStat = new AutoKeeperConnectionStat();
            autoKeeperConnectionStat.setOriginalContent(line);
            String clientIp = StringUtils.trimToEmpty(line.split(":")[0].replace("/", ""));
            String sessionId = StringUtils.trimToEmpty(RegexUtils.findFirst(line.split(":")[1], "sid=(?s).*?[,)]")).replace("sid=",
                                                                                                                            StringUtils.EMPTY).replace(COMMA,
                                                                                                                                                       StringUtils.EMPTY).replace(BRACKETS,
                                                                                                                                                                                  StringUtils.EMPTY);
            String queued = StringUtils.trimToEmpty(RegexUtils.findFirst(line.split(":")[1], "queued=(?s).*?[,)]")).replace("queued=",
                                                                                                                            StringUtils.EMPTY).replace(COMMA,
                                                                                                                                                       StringUtils.EMPTY).replace(BRACKETS,
                                                                                                                                                                                  StringUtils.EMPTY);
            String receive = StringUtils.trimToEmpty(RegexUtils.findFirst(line.split(":")[1], "recved=(?s).*?[,)]")).replace("recved=",
                                                                                                                             StringUtils.EMPTY).replace(COMMA,
                                                                                                                                                        StringUtils.EMPTY).replace(BRACKETS,
                                                                                                                                                                                   StringUtils.EMPTY);
            String sent = StringUtils.trimToEmpty(RegexUtils.findFirst(line.split(":")[1], "sent=(?s).*?[,)]")).replace("sent=",
                                                                                                                        StringUtils.EMPTY).replace(COMMA,
                                                                                                                                                   StringUtils.EMPTY).replace(BRACKETS,
                                                                                                                                                                              StringUtils.EMPTY);
            String minlat = StringUtils.trimToEmpty(RegexUtils.findFirst(line.split(":")[1], "minlat=(?s).*?[,)]")).replace("minlat=",
                                                                                                                            StringUtils.EMPTY).replace(COMMA,
                                                                                                                                                       StringUtils.EMPTY).replace(BRACKETS,
                                                                                                                                                                                  StringUtils.EMPTY);
            String avglat = StringUtils.trimToEmpty(RegexUtils.findFirst(line.split(":")[1], "avglat=(?s).*?[,)]")).replace("avglat=",
                                                                                                                            StringUtils.EMPTY).replace(COMMA,
                                                                                                                                                       StringUtils.EMPTY).replace(BRACKETS,
                                                                                                                                                                                  StringUtils.EMPTY);
            String maxlat = StringUtils.trimToEmpty(RegexUtils.findFirst(line.split(":")[1], "maxlat=(?s).*?[,)]")).replace("maxlat=",
                                                                                                                            StringUtils.EMPTY).replace(COMMA,
                                                                                                                                                       StringUtils.EMPTY).replace(BRACKETS,
                                                                                                                                                                                  StringUtils.EMPTY);
            autoKeeperConnectionStat.setServerAddress(ip);
            autoKeeperConnectionStat.setClientAddress(clientIp);
            autoKeeperConnectionStat.setSessionId(sessionId);
            if (StringUtils.isNotEmpty(queued)) {
                autoKeeperConnectionStat.setQueued(Long.parseLong(queued));
            }
            if (StringUtils.isNotEmpty(receive)) {
                autoKeeperConnectionStat.setRecved(Long.parseLong(receive));
            }
            if (StringUtils.isNotEmpty(sent)) {
                autoKeeperConnectionStat.setSent(Long.parseLong(sent));
            }
            if (StringUtils.isNotEmpty(minlat)) {
                autoKeeperConnectionStat.setMinLatency(Long.parseLong(minlat));
            }
            if (StringUtils.isNotEmpty(avglat)) {
                autoKeeperConnectionStat.setAvgLatency(Long.parseLong(avglat));
            }
            if (StringUtils.isNotEmpty(maxlat)) {
                autoKeeperConnectionStat.setMaxLatency(Long.parseLong(maxlat));
            }

            summary.add(autoKeeperConnectionStat);
        }
        autoKeeperData.joinConnection(address, summary);
    }

    public void collectorServerStat(String address) {
        List<String> netAddress = splitAddress(address);
        if (netAddress.isEmpty()) {
            return;
        }
        String ip = netAddress.get(0);
        String port = netAddress.get(1);
        String[] cmd = { "/bin/bash", "-c", String.format(CMD_STAT, ip, port) };
        String cmdresult = collector(cmd);
        String[] result = cmdresult.split(WRAP);
        AutoKeeperServerStat summary = new AutoKeeperServerStat();
        summary.setOriginalContent(cmdresult);
        for (String line : result) {

            if (line.contains(MODE_FOLLOWER)) {
                summary.setQuorumType(AutoKeeperQuorumType.FOLLOWER);
            } else if (line.contains(MODE_LEADERER)) {
                summary.setQuorumType(AutoKeeperQuorumType.LEADER);
            } else if (line.contains(MODE_STANDALONE)) {
                summary.setQuorumType(AutoKeeperQuorumType.STANDALONE);
            } else if (line.contains(MODE_OBSERVER)) {
                summary.setQuorumType(AutoKeeperQuorumType.OBSERVER);
            } else if (line.contains(STRING_LATENCY)) {
                List<String> latency = Arrays.asList(StringUtils.trimToEmpty(line.replace(STRING_LATENCY,
                                                                                          StringUtils.EMPTY)).split("/"));
                summary.setMinLatency(Long.parseLong(latency.get(0)));
                summary.setAvgLatency(Long.parseLong(latency.get(1)));
                summary.setMaxLatency(Long.parseLong(latency.get(2)));
            } else if (line.contains(STRING_OUTSTANDING)) {
                summary.setQueued(Long.parseLong(StringUtils.trimToEmpty(line.replace(STRING_OUTSTANDING,
                                                                                      StringUtils.EMPTY))));
            } else if (line.contains(NODE_COUNT)) {
                summary.setNodeCount(Long.parseLong(StringUtils.trimToEmpty(line.replace(NODE_COUNT, StringUtils.EMPTY))));
            } else if (line.contains(STRING_SENT)) {
                summary.setSent(Long.parseLong(StringUtils.trimToEmpty(line.replace(STRING_SENT, StringUtils.EMPTY))));
            } else if (line.contains(STRING_RECEIVED)) {
                summary.setRecved(Long.parseLong(StringUtils.trimToEmpty(line.replace(STRING_RECEIVED,
                                                                                      StringUtils.EMPTY))));
            }
        }

        autoKeeperData.joinServer(address, summary);
    }

    public void collectorEphemeralStat(String address) {
        List<String> netAddress = splitAddress(address);
        if (netAddress.isEmpty()) {
            return;
        }
        String ip = netAddress.get(0);
        String port = netAddress.get(1);
        String[] cmd = { "/bin/bash", "-c", String.format(CMD_DUMP, ip, port) };
        String cmdresult = collector(cmd);

        Map<String, List<String>> pathMap = groupSessionPath(cmdresult);

        List<AutoKeeperEphemeralStat> autoKeeperEphemeralStats = new ArrayList<AutoKeeperEphemeralStat>();
        for (Map.Entry<String, List<String>> entry : pathMap.entrySet()) {
            AutoKeeperEphemeralStat autoKeeperEphemeralStat = new AutoKeeperEphemeralStat();
            autoKeeperEphemeralStat.setSessionId(entry.getKey());
            autoKeeperEphemeralStat.setPaths(entry.getValue());
            autoKeeperEphemeralStats.add(autoKeeperEphemeralStat);
        }

        autoKeeperData.joinEphemeral(address, autoKeeperEphemeralStats);

    }

    public void collectorWatchStat(String address) {
        List<String> netAddress = splitAddress(address);
        if (netAddress.isEmpty()) {
            return;
        }
        String ip = netAddress.get(0);
        String port = netAddress.get(1);
        String[] cmd = { "/bin/bash", "-c", String.format(CMD_WCHC, ip, port) };
        String cmdresult = collector(cmd);

        Map<String, List<String>> pathMap = groupSessionPath(cmdresult);

        List<AutoKeeperWatchStat> autoKeeperWatchStats = new ArrayList<AutoKeeperWatchStat>();
        for (Map.Entry<String, List<String>> entry : pathMap.entrySet()) {
            AutoKeeperWatchStat autoKeeperWatchStat = new AutoKeeperWatchStat();
            autoKeeperWatchStat.setSessionId(entry.getKey());
            autoKeeperWatchStat.setPaths(entry.getValue());
            autoKeeperWatchStats.add(autoKeeperWatchStat);
        }

        autoKeeperData.joinWatch(address, autoKeeperWatchStats);

    }

    public static String collector(String[] command) {
        Result result = null;
        try {
            result = Exec.execute(command);
            if (result.getExitCode() == 0) {
                return result.getStdout();
            } else {
                return result.getStderr();
            }
        } catch (Exception e) {
            throw new ManagerException(e);
        }
    }

    private List<String> splitAddress(String address) {
        List<String> ipPort = Arrays.asList(address.split(":"));
        if (ipPort.size() != 2) {
            return new ArrayList<String>();
        }
        return ipPort;
    }

    /**
     * <pre>
     * key=sessionId
     * value=pathList
     * </pre>
     */
    private Map<String, List<String>> groupSessionPath(String cmdresult) {
        String[] result = cmdresult.split(WRAP);

        Map<String, List<String>> pathMap = new HashMap<String, List<String>>();
        String sessionId = StringUtils.EMPTY;
        for (String line : result) {
            line = StringUtils.trimToEmpty(line);
            if (StringUtils.isBlank(line)) {
                continue;
            }
            if (line.startsWith("0x")) {
                sessionId = line.replace(COLON, StringUtils.EMPTY);
                pathMap.put(sessionId, new ArrayList<String>());
            } else if (line.startsWith("/")) {
                List<String> paths = pathMap.get(sessionId);
                paths.add(line);
            }
        }
        return pathMap;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        collectorExecutor = Executors.newScheduledThreadPool(singleSize, new NamedThreadFactory("collector-thread",
                                                                                                true));
        startCollect();
    }

    private void startCollect() {

        // 启动定时工作任务
        collectorExecutor.scheduleAtFixedRate(new Runnable() {

            @Override
            public void run() {
                List<AutoKeeperCluster> autoKeeperClusters = autoKeeperClusterService.listAutoKeeperClusters();
                if (!autoKeeperClusters.isEmpty()) {
                    autoKeeperData.persist();
                    for (AutoKeeperCluster autoKeeperCluster : autoKeeperClusters) {
                        List<String> servers = autoKeeperCluster.getServerList();
                        for (String address : servers) {
                            collectorServerStat(address);
                            collectorConnectionStat(address);
                            collectorWatchStat(address);
                            collectorEphemeralStat(address);
                        }
                    }
                }
            }
        }, delay, collectInterval, TimeUnit.SECONDS);

    }

    public void setAutoKeeperClusterService(AutoKeeperClusterService autoKeeperClusterService) {
        this.autoKeeperClusterService = autoKeeperClusterService;
    }

    public void setAutoKeeperData(AutoKeeperData autoKeeperData) {
        this.autoKeeperData = autoKeeperData;
    }

    public void setCollectInterval(long collectInterval) {
        this.collectInterval = collectInterval;
    }

}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/autokeeper/impl/AutoKeeperData.java
================================================
/*
 * Copyright (C) 2010-2101 Alibaba Group Holding Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     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.alibaba.otter.manager.biz.autokeeper.impl;

import java.util.List;
import java.util.Map;

import com.alibaba.otter.shared.common.model.autokeeper.AutoKeeperConnectionStat;
import com.alibaba.otter.shared.common.model.autokeeper.AutoKeeperEphemeralStat;
import com.alibaba.otter.shared.common.model.autokeeper.AutoKeeperServerStat;
import com.alibaba.otter.shared.common.model.autokeeper.AutoKeeperWatchStat;
import com.google.common.collect.MapMaker;

/**
 * join server之间的统计数据,提供当前最新和完整的数据结构方便数据查询
 * 
 * <pre>
 * server -> 
 *        connection -> 
 *               ->  watcher
 *               ->  ephemeral
 * </pre>
 * 
 * @author jianghang 2012-9-21 下午03:02:00
 * @version 4.1.0
 */
public class AutoKeeperData implements AutoKeeperPersist {

    private Map<String, AutoKeeperServerStat>     serverStats     = new MapMaker().makeMap(); // serverIp和server的对应关系
    private Map<String, AutoKeeperConnectionStat> connectionStats = new MapMaker().makeMap(); // sessionId和connection的对应关系

    public void joinServer(String address, AutoKeeperServerStat summary) {
        serverStats.put(address, summary);
    }

    public void joinConnection(String address, List<AutoKeeperConnectionStat> connections) {
        // 记录connection引用
        for (AutoKeeperConnectionStat connection : connections) {
            connectionStats.put(connection.getSessionId(), connection);
        }

        // 添加引用到server中
        if (serverStats.containsKey(address)) {
            serverStats.get(address).getConnectionStats().addAll(connections);
        }
    }

    public void joinEphemeral(String address, List<AutoKeeperEphemeralStat> ephemerals) {
        for (AutoKeeperEphemeralStat ephemeral : ephemerals) {
            if (connectionStats.containsKey(ephemeral.getSessionId())) {
                // 找到对应的connection进行关联,填充数据
                connectionStats.get(ephemeral.getSessionId()).getEphemeralStats().add(ephemeral);
            }
        }
    }

    public void joinWatch(String address, List<AutoKeeperWatchStat> watches) {
        for (AutoKeeperWatchStat watch : watches) {
            if (connectionStats.containsKey(watch.getSessionId())) {
                // 找到对应的connection进行关联,填充数据
                connectionStats.get(watch.getSessionId()).getWatchStats().add(watch);
            }
        }
    }

    public void persist() {
        serverStats.clear();
        connectionStats.clear();
    }

    public Map<String, AutoKeeperServerStat> getServerStats() {
        return serverStats;
    }

    public Map<String, AutoKeeperConnectionStat> getConnectionStats() {
        return connectionStats;
    }

}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/autokeeper/impl/AutoKeeperPersist.java
================================================
/*
 * Copyright (C) 2010-2101 Alibaba Group Holding Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     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.alibaba.otter.manager.biz.autokeeper.impl;

/**
 * 数据持久化接口,会有持久化调度器定时触发
 * 
 * @author jianghang 2012-9-21 下午03:04:37
 * @version 4.1.0
 */
public interface AutoKeeperPersist {

    /**
     * 会有
     */
    public void persist();
}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/autokeeper/impl/AutoKeeperStatServiceImpl.java
================================================
/*
 * Copyright (C) 2010-2101 Alibaba Group Holding Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     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.alibaba.otter.manager.biz.autokeeper.impl;

import java.util.ArrayList;
import java.util.List;

import com.alibaba.otter.manager.biz.autokeeper.AutoKeeperStatService;
import com.alibaba.otter.shared.common.model.autokeeper.AutoKeeperConnectionStat;
import com.alibaba.otter.shared.common.model.autokeeper.AutoKeeperEphemeralStat;
import com.alibaba.otter.shared.common.model.autokeeper.AutoKeeperServerStat;
import com.alibaba.otter.shared.common.model.autokeeper.AutoKeeperWatchStat;

/**
 * 提供autokeeper相关的数据查询接口
 * 
 * @author simon 2012-9-28 上午11:00:07
 * @version 4.1.0
 */
public class AutoKeeperStatServiceImpl implements AutoKeeperStatService {

    private AutoKeeperData autoKeeperData;

    public AutoKeeperServerStat findServerStat(String serverAddress) {
        return autoKeeperData.getServerStats().get(serverAddress);
    }

    public AutoKeeperServerStat findServerStatBySessionId(String sessionId) {
        String serverAddress = autoKeeperData.getConnectionStats().get(sessionId).getServerAddress();
        return findServerStat(serverAddress);
    }

    public AutoKeeperConnectionStat findConnectionBySessionId(String sessionId) {
        return autoKeeperData.getConnectionStats().get(sessionId);
    }

    public AutoKeeperConnectionStat findConnectionByEphemeralPath(String path) {
        for (AutoKeeperConnectionStat connection : autoKeeperData.getConnectionStats().values()) {
            for (AutoKeeperEphemeralStat ephemeral : connection.getEphemeralStats()) {
                if (ephemeral.getPaths().contains(path)) {
                    return connection;
                }
            }
        }

        return null;
    }

    public List<AutoKeeperConnectionStat> findConnectionByWatcherPath(String path) {
        List<AutoKeeperConnectionStat> connections = new ArrayList<AutoKeeperConnectionStat>();
        for (AutoKeeperConnectionStat connection : autoKeeperData.getConnectionStats().values()) {
            for (AutoKeeperWatchStat watch : connection.getWatchStats()) {
                if (watch.getPaths().contains(path)) {
                    connections.add(connection);
                }
            }
        }

        return connections;
    }

    public void setAutoKeeperData(AutoKeeperData autoKeeperData) {
        this.autoKeeperData = autoKeeperData;
    }

}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/DataSourceCreator.java
================================================
/*
 * Copyright (C) 2010-2101 Alibaba Group Holding Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     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.alibaba.otter.manager.biz.common;

import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;

import com.alibaba.otter.common.push.datasource.DataSourceHanlder;
import com.alibaba.otter.shared.common.model.config.data.DataMediaSource;
import com.alibaba.otter.shared.common.model.config.data.DataMediaType;
import com.alibaba.otter.shared.common.model.config.data.db.DbMediaSource;

public class DataSourceCreator implements DisposableBean {

    private static final Logger     logger                        = LoggerFactory.getLogger(DataSourceCreator.class);

    private int                     maxWait                       = 60 * 1000;

    private int                     minIdle                       = 0;

    private int                     initialSize                   = 1;

    private int                     maxActive                     = 5;

    private int                     maxIdle                       = 1;

    private int                     numTestsPerEvictionRun        = -1;

    private int                     timeBetweenEvictionRunsMillis = 60 * 1000;

    private int                     removeAbandonedTimeout        = 10 * 60;

    private int                     minEvictableIdleTimeMillis    = 30 * 60 * 1000;

    private List<DataSourceHanlder> dataSourceHandlers;

    /**
     * 直接创建数据源,不做cache
     */
    public DataSource createDataSource(DataMediaSource dataMediaSource) {
        Assert.notNull(dataMediaSource);
        DbMediaSource dbMediaSource = (DbMediaSource) dataMediaSource;

        // 扩展功能,可以自定义一些自己实现的 dataSource
        DataSource customDataSource = preCreate(0L, dbMediaSource);
        if (customDataSource != null) {
            return customDataSource;
        }

        return createDataSource(dbMediaSource.getUrl(),
            dbMediaSource.getUsername(),
            dbMediaSource.getPassword(),
            dbMediaSource.getDriver(),
            dbMediaSource.getType(),
            dbMediaSource.getEncode());
    }

    public void destroyDataSource(DataSource dataSource) {
        try {
            // for filter to destroy custom datasource
            if (letHandlerDestroyIfSupport(0L, dataSource)) {
                return;
            }

            if (dataSource == null) {
                return;
            }

            BasicDataSource basicDataSource = (BasicDataSource) dataSource;
            basicDataSource.close();
        } catch (SQLException e) {
            logger.error("ERROR ## close the datasource has an error", e);
        }
    }

    public void destroy() throws Exception {
    }

    /**
     * 扩展功能,可以自定义一些自己实现的 dataSource
     */
    private DataSource preCreate(Long pipelineId, DbMediaSource dbMediaSource) {

        if (CollectionUtils.isEmpty(dataSourceHandlers)) {
            return null;
        }

        DataSource dataSource = null;
        for (DataSourceHanlder handler : dataSourceHandlers) {
            if (handler.support(dbMediaSource)) {
                dataSource = handler.create(pipelineId, dbMediaSource);
                if (dataSource != null) {
                    return dataSource;
                }
            }
        }
        return null;
    }

    public boolean letHandlerDestroyIfSupport(Long pipelineId, DataSource source) {
        boolean destroied = false;

        if (CollectionUtils.isEmpty(this.dataSourceHandlers)) {
            return destroied;
        }

        for (DataSourceHanlder handler : this.dataSourceHandlers) {
            if (handler.support(source)) {
                handler.destory(pipelineId);
                destroied = true;
                return destroied;
            }
        }
        return destroied;

    }

    private DataSource createDataSource(String url, String userName, String password, String driverClassName,
                                        DataMediaType dataMediaType, String encoding) {
        BasicDataSource dbcpDs = new BasicDataSource();

        dbcpDs.setInitialSize(initialSize);// 初始化连接池时创建的连接数
        dbcpDs.setMaxActive(maxActive);// 连接池允许的最大并发连接数,值为非正数时表示不限制
        dbcpDs.setMaxIdle(maxIdle);// 连接池中的最大空闲连接数,超过时,多余的空闲连接将会被释放,值为负数时表示不限制
        dbcpDs.setMinIdle(minIdle);// 连接池中的最小空闲连接数,低于此数值时将会创建所欠缺的连接,值为0时表示不创建
        dbcpDs.setMaxWait(maxWait);// 以毫秒表示的当连接池中没有可用连接时等待可用连接返回的时间,超时则抛出异常,值为-1时表示无限等待
        dbcpDs.setRemoveAbandoned(true);// 是否清除已经超过removeAbandonedTimeout设置的无效连接
        dbcpDs.setLogAbandoned(true);// 当清除无效链接时是否在日志中记录清除信息的标志
        dbcpDs.setRemoveAbandonedTimeout(removeAbandonedTimeout); // 以秒表示清除无效链接的时限
        dbcpDs.setNumTestsPerEvictionRun(numTestsPerEvictionRun);// 确保连接池中没有已破损的连接
        dbcpDs.setTestOnBorrow(false);// 指定连接被调用时是否经过校验
        dbcpDs.setTestOnReturn(false);// 指定连接返回到池中时是否经过校验
        dbcpDs.setTestWhileIdle(true);// 指定连接进入空闲状态时是否经过空闲对象驱逐进程的校验
        dbcpDs.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); // 以毫秒表示空闲对象驱逐进程由运行状态进入休眠状态的时长,值为非正数时表示不运行任何空闲对象驱逐进程
        dbcpDs.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); // 以毫秒表示连接被空闲对象驱逐进程驱逐前在池中保持空闲状态的最小时间

        // 动态的参数
        dbcpDs.setDriverClassName(driverClassName);
        dbcpDs.setUrl(url);
        dbcpDs.setUsername(userName);
        dbcpDs.setPassword(password);

        if (dataMediaType.isOracle()) {
            dbcpDs.addConnectionProperty("restrictGetTables", "true");
            // dbcpDs.setValidationQuery("select 1 from dual");
        } else if (dataMediaType.isMysql()) {
            // open the batch mode for mysql since 5.1.8
            dbcpDs.addConnectionProperty("useServerPrepStmts", "false");
            dbcpDs.addConnectionProperty("rewriteBatchedStatements", "true");
            dbcpDs.addConnectionProperty("zeroDateTimeBehavior", "convertToNull");// 将0000-00-00的时间类型返回null
            dbcpDs.addConnectionProperty("yearIsDateType", "false");// 直接返回字符串,不做year转换date处理
            dbcpDs.addConnectionProperty("noDatetimeStringSync", "true");// 返回时间类型的字符串,不做时区处理
            if (StringUtils.isNotEmpty(encoding)) {
                if (StringUtils.equalsIgnoreCase(encoding, "utf8mb4")) {
                    dbcpDs.addConnectionProperty("characterEncoding", "utf8");
                    dbcpDs.setConnectionInitSqls(Arrays.asList("set names utf8mb4"));
                } else {
                    dbcpDs.addConnectionProperty("characterEncoding", encoding);
                }
            }
            // dbcpDs.setValidationQuery("select 1");
        } else {
            logger.error("ERROR ## Unknow database type");
        }

        return dbcpDs;
    }

    public void setMaxWait(int maxWait) {
        this.maxWait = maxWait;
    }

    public void setMinIdle(int minIdle) {
        this.minIdle = minIdle;
    }

    public void setInitialSize(int initialSize) {
        this.initialSize = initialSize;
    }

    public void setMaxActive(int maxActive) {
        this.maxActive = maxActive;
    }

    public void setMaxIdle(int maxIdle) {
        this.maxIdle = maxIdle;
    }

    public void setNumTestsPerEvictionRun(int numTestsPerEvictionRun) {
        this.numTestsPerEvictionRun = numTestsPerEvictionRun;
    }

    public void setTimeBetweenEvictionRunsMillis(int timeBetweenEvictionRunsMillis) {
        this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
    }

    public void setRemoveAbandonedTimeout(int removeAbandonedTimeout) {
        this.removeAbandonedTimeout = removeAbandonedTimeout;
    }

    public void setMinEvictableIdleTimeMillis(int minEvictableIdleTimeMillis) {
        this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
    }

    public void setDataSourceHandlers(List<DataSourceHanlder> dataSourceHandlers) {
        this.dataSourceHandlers = dataSourceHandlers;
    }

}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/alarm/AbstractAlarmService.java
================================================
/*
 * Copyright (C) 2010-2101 Alibaba Group Holding Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     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.alibaba.otter.manager.biz.common.alarm;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

/**
 * 报警服务实现
 * 
 * @author jianghang 2011-11-3 上午11:12:16
 * @version 4.0.0
 */
public abstract class AbstractAlarmService implements AlarmService, InitializingBean, DisposableBean {

    private static final Logger         logger = LoggerFactory.getLogger(AbstractAlarmService.class);

    private BlockingQueue<AlarmMessage> queue  = new LinkedBlockingQueue<AlarmMessage>(3 * 3 * 3600);
    private ExecutorService             executor;
    private int                         period = 150;                                                // milliseconds

    public void sendAlarm(AlarmMessage data) {
        try {
            if (!queue.offer(data, 2, TimeUnit.SECONDS)) {
                logger.error(String.format("alarm sent to queue error : [%s]", data.toString()));
            }
        } catch (Exception e) {
            logger.error(String.format("send alarm [%s] to drgoon agent error!", data.toString()), e);
        }
    }

    private void sendAlarmInternal() {
        AlarmMessage data = null;
        try {
            data = queue.take();
            doSend(data);
            logger.info(String.format("has sent alarm [%s] to drgoon agent.", data.toString()));
        } catch (InterruptedException e) {
            logger.warn("otter-sendAlarm-worker was interrupted", e);
        } catch (Exception e) {
            logger.error(String.format("send alarm [%s] to drgoon agent error!", data.toString()), e);
        }
    }

    protected abstract void doSend(AlarmMessage data) throws Exception;

    public void afterPropertiesSet() throws Exception {
        executor = Executors.newFixedThreadPool(1);
        executor.submit(new Runnable() {

            public void run() {
                while (!Thread.currentThread().isInterrupted()) {
                    sendAlarmInternal();
                    LockSupport.parkNanos(period * 1000L * 1000L);
                }
            }
        });
    }

    @Override
    public void destroy() throws Exception {
        if (executor != null && !executor.isShutdown()) {
            executor.shutdown();
            executor.awaitTermination(2, TimeUnit.SECONDS);
        }
        if (!queue.isEmpty()) {
            int size = queue.size();
            logger.warn(String.format("there are %d alarms wait to be sent \n %s", size, dumpQueue()));
        }
    }

    protected String dumpQueue() {
        if (queue.isEmpty()) {
            return StringUtils.EMPTY;
        }
        StringBuilder sb = new StringBuilder();
        for (AlarmMessage data : queue) {
            sb.append(data.toString()).append("\n");
        }

        return sb.toString();
    }

    // ============= setter ===============

    public void setPeriod(int period) {
        this.period = period;
    }

}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/alarm/AlarmMessage.java
================================================
package com.alibaba.otter.manager.biz.common.alarm;

import java.io.Serializable;

import org.apache.commons.lang.builder.ToStringBuilder;

import com.alibaba.otter.shared.common.utils.OtterToStringStyle;

public class AlarmMessage implements Serializable {

    private static final long serialVersionUID = 6110474591366995515L;
    private String            message;
    private String            receiveKey;

    public AlarmMessage(){

    }

    public AlarmMessage(String message, String receiveKey){
        this.message = message;
        this.receiveKey = receiveKey;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getReceiveKey() {
        return receiveKey;
    }

    public void setReceiveKey(String receiveKey) {
        this.receiveKey = receiveKey;
    }

    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this, OtterToStringStyle.DEFAULT_STYLE);
    }

}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/alarm/AlarmService.java
================================================
/*
 * Copyright (C) 2010-2101 Alibaba Group Holding Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     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.alibaba.otter.manager.biz.common.alarm;


/**
 * 报警服务service定义,暂时先简单实现:利用dragoon的报警推送机制进行短信,邮件,旺旺信息等报警
 * 
 * @author jianghang 2011-9-26 下午10:27:44
 * @version 4.0.0
 */
public interface AlarmService {

    /**
     * 发送基于kv的报警信息
     * 
     * <pre>
     * Map内容;
     * 1. message : 报警内容
     * 2. receiveKey : 报警接收者信息
     * </pre>
     * 
     * @param data
     */
    public void sendAlarm(AlarmMessage data);

}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/alarm/DefaultAlarmService.java
================================================
package com.alibaba.otter.manager.biz.common.alarm;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;

import com.alibaba.otter.manager.biz.config.parameter.SystemParameterService;
import com.alibaba.otter.shared.common.model.config.parameter.SystemParameter;

/**
 * 发送邮件进行报警
 * 
 * @author jianghang 2013-9-6 上午11:42:04
 * @since 4.2.2
 */
public class DefaultAlarmService extends AbstractAlarmService {

    private static final String    TITLE = "alarm_from_otter";
    private String                 username;
    private JavaMailSender         mailSender;
    private SystemParameterService systemParameterService;

    public void doSend(AlarmMessage data) throws Exception {
        SimpleMailMessage mail = new SimpleMailMessage(); // 只发送纯文本
        mail.setFrom(username);
        mail.setSubject(TITLE);// 主题
        mail.setText(data.getMessage());// 邮件内容
        String receiveKeys[] = StringUtils.split(StringUtils.replace(data.getReceiveKey(), ";", ","), ",");

        SystemParameter systemParameter = systemParameterService.find();
        List<String> mailAddress = new ArrayList<String>();
        for (String receiveKey : receiveKeys) {
            String receiver = convertToReceiver(systemParameter, receiveKey);
            String strs[] = StringUtils.split(StringUtils.replace(receiver, ";", ","), ",");
            for (String str : strs) {
                if (isMail(str)) {
                    if (str != null) {
                        mailAddress.add(str);
                    }
                } else if (isSms(str)) {
                    // do nothing
                }
            }
        }

        if (!mailAddress.isEmpty()) {
            mail.setTo(mailAddress.toArray(new String[mailAddress.size()]));
            doSendMail(mail);
        }
    }

    private void doSendMail(SimpleMailMessage mail) {
        if (mailSender instanceof JavaMailSenderImpl) {
            JavaMailSenderImpl mailSenderImpl = (JavaMailSenderImpl) mailSender;
            if (StringUtils.isNotEmpty(mailSenderImpl.getUsername())
                && StringUtils.isNotEmpty(mailSenderImpl.getPassword())) {
                // 正确设置了账户/密码,才尝试发送邮件
                mailSender.send(mail);
            }
        }
    }

    private boolean isMail(String receiveKey) {
        return StringUtils.contains(receiveKey, '@');
    }

    private boolean isSms(String receiveKey) {
        return false;
    }

    private String convertToReceiver(SystemParameter systemParameter, String receiveKey) {
        if (StringUtils.equalsIgnoreCase(systemParameter.getDefaultAlarmReceiveKey(), receiveKey)) {
            return systemParameter.getDefaultAlarmReceiver();
        } else {
            return systemParameter.getAlarmReceiver().get(receiveKey);
        }
    }

    public void setMailSender(JavaMailSender mailSender) {
        this.mailSender = mailSender;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setSystemParameterService(SystemParameterService systemParameterService) {
        this.systemParameterService = systemParameterService;
    }

}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/arbitrate/ArbitrateConfigImpl.java
================================================
/*
 * Copyright (C) 2010-2101 Alibaba Group Holding Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     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.alibaba.otter.manager.biz.common.arbitrate;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.InitializingBean;

import com.alibaba.otter.manager.biz.config.channel.ChannelService;
import com.alibaba.otter.manager.biz.config.node.NodeService;
import com.alibaba.otter.shared.arbitrate.impl.config.ArbitrateConfig;
import com.alibaba.otter.shared.arbitrate.impl.config.ArbitrateConfigRegistry;
import com.alibaba.otter.shared.common.model.config.ConfigException;
import com.alibaba.otter.shared.common.model.config.channel.Channel;
import com.alibaba.otter.shared.common.model.config.node.Node;
import com.alibaba.otter.shared.common.model.config.pipeline.Pipeline;
import com.alibaba.otter.shared.common.utils.cache.RefreshMemoryMirror;
import com.alibaba.otter.shared.common.utils.cache.RefreshMemoryMirror.ComputeFunction;
import com.google.common.base.Function;
import com.google.common.collect.OtterMigrateMap;

/**
 * manager下的基于db查询的{@linkplain ArbitrateConfig}实现
 * 
 * @author jianghang 2011-11-3 上午11:09:24
 * @version 4.0.0
 */
public class ArbitrateConfigImpl implements ArbitrateConfig, InitializingBean {

    private static final Long                  DEFAULT_PERIOD = 60 * 1000L;
    private Long                               timeout        = DEFAULT_PERIOD;
    private RefreshMemoryMirror<Long, Channel> channelCache;
    private Map<Long, Long>                    channelMapping;
    private ChannelService                     channelService;
    private NodeService                        nodeService;
    private RefreshMemoryMirror<Long, Node>    nodeCache;

    public ArbitrateConfigImpl(){
        // 注册自己到arbitrate模块
        ArbitrateConfigRegistry.regist(this);
    }

    public Node currentNode() {
        return null;
    }

    public Node findNode(Long nid) {
        return nodeCache.get(nid);
    }

    public Channel findChannel(Long channelId) {
        return channelCache.get(channelId);
    }

    public Channel findChannelByPipelineId(Long pipelineId) {
        Long channelId = channelMapping.get(pipelineId);
        return channelCache.get(channelId);
    }

    public Pipeline findOppositePipeline(Long pipelineId) {
        Long channelId = channelMapping.get(pipelineId);
        Channel channel = channelCache.get(channelId);
        List<Pipeline> pipelines = channel.getPipelines();
        for (Pipeline pipeline : pipelines) {
            if (pipeline.getId().equals(pipelineId) == false) {// 这里假定pipeline只有两个
                return pipeline;
            }
        }

        return null;
    }

    public Pipeline findPipeline(Long pipelineId) {
        Long channelId = channelMapping.get(pipelineId);
        Channel channel = channelCache.get(channelId);
        List<Pipeline> pipelines = channel.getPipelines();
        for (Pipeline pipeline : pipelines) {
            if (pipeline.getId().equals(pipelineId)) {
                return pipeline;
            }
        }

        throw new ConfigException("no pipeline for pipelineId[" + pipelineId + "]");
    }

    public void afterPropertiesSet() throws Exception {
        // 获取一下nid变量
        channelMapping = OtterMigrateMap.makeComputingMap(new Function<Long, Long>() {

            public Long apply(Long pipelineId) {
                // 处理下pipline -> channel映射关系不存在的情况
                Channel channel = channelService.findByPipelineId(pipelineId);
                if (channel == null) {
                    throw new ConfigException("No Such Channel by pipelineId[" + pipelineId + "]");
                }

                updateMapping(channel, pipelineId);// 排除下自己
                channelCache.put(channel.getId(), channel);// 更新下channelCache
                return channel.getId();

            }
        });

        channelCache = new RefreshMemoryMirror<Long, Channel>(timeout, new ComputeFunction<Long, Channel>() {

            public Channel apply(Long key, Channel oldValue) {
                Channel channel = channelService.findById(key);
                if (channel == null) {
                    // 其他情况直接返回内存中的旧值
                    return oldValue;
                } else {
                    updateMapping(channel, null);// 排除下自己
                    return channel;
                }
            }
        });

        nodeCache = new RefreshMemoryMirror<Long, Node>(timeout, new ComputeFunction<Long, Node>() {

            public Node apply(Long key, Node oldValue) {
                Node node = nodeService.findById(key);
                if (node == null) {
                    return oldValue;
                } else {
                    return node;
                }
            }
        });
    }

    private void updateMapping(Channel channel, Long excludeId) {
        Long channelId = channel.getId();
        List<Pipeline> pipelines = channel.getPipelines();
        for (Pipeline pipeline : pipelines) {
            if (excludeId == null || !pipeline.getId().equals(excludeId)) {
                channelMapping.put(pipeline.getId(), channelId);
            }
        }
    }

    public void setChannelService(ChannelService channelService) {
        this.channelService = channelService;
    }

    public void setNodeService(NodeService nodeService) {
        this.nodeService = nodeService;
    }

}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/arbitrate/DeadNodeListener.java
================================================
/*
 * Copyright (C) 2010-2101 Alibaba Group Holding Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     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.alibaba.otter.manager.biz.common.arbitrate;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

import com.alibaba.otter.manager.biz.config.channel.ChannelService;
import com.alibaba.otter.manager.biz.monitor.PassiveMonitor;
import com.alibaba.otter.shared.arbitrate.ArbitrateManageService;
import com.alibaba.otter.shared.arbitrate.impl.setl.monitor.NodeMonitor;
import com.alibaba.otter.shared.arbitrate.impl.setl.monitor.listener.NodeListener;
import com.alibaba.otter.shared.common.model.config.alarm.MonitorName;
import com.alibaba.otter.shared.common.model.config.channel.Channel;
import com.alibaba.otter.shared.common.model.config.channel.ChannelStatus;
import com.alibaba.otter.shared.communication.model.arbitrate.NodeAlarmEvent;
import com.google.common.collect.Lists;

/**
 * 默认的死亡节点处理
 * 
 * @author jianghang 2011-9-26 下午10:37:40
 * @version 4.0.0
 */
public class DeadNodeListener implements NodeListener, InitializingBean, DisposableBean {

    private static final Logger                  logger       = LoggerFactory.getLogger(DeadNodeListener.class);
    private volatile DelayQueue<DeadNodeDelayed> queue        = new DelayQueue<DeadNodeDelayed>();
    private NodeMonitor                          nodeMonitor;
    private ArbitrateManageService               arbitrateManageService;
    private PassiveMonitor                       exceptionRuleMonitor;
    private ChannelService                       channelService;
    private ExecutorService                      executor;
    private long                                 checkTime    = 60 * 1000L;                                     // 30秒
    private volatile List<Long>                  currentNodes = new ArrayList<Long>();                          // 当前存活节点

    public DeadNodeListener(){
    }

    public void afterPropertiesSet() throws Exception {
        nodeMonitor.addListener(this);
        executor = Executors.newFixedThreadPool(1);
        executor.submit(new Runnable() {

            public void run() {
                while (true) {
                    DeadNodeDelayed delay = null;
                    try {
                        delay = queue.take();
                        processDead(delay.getNid());
                    } catch (Throwable e) {
                        logger.error(String.format("error happened with [%s]", delay.toString()), e);
                    }
                }
            }
        });
    }

    public synchronized void processChanged(List<Long> nodes) {
        Set<Long> deadNodes = new HashSet<Long>();
        for (Long node : currentNodes) {
            if (!nodes.contains(node)) {
                deadNodes.add(node);
            }
        }

        currentNodes = nodes;// 切换引用,需设置为volatile保证线程安全&可见性
        // 处理下dead node
        if (deadNodes.size() > 0) {
            for (Long nid : deadNodes) {
                Delayed delayed = new DeadNodeDelayed(nid, checkTime);
                if (!queue.contains(delayed)) {// 不重复添加
                    queue.add(new DeadNodeDelayed(nid, checkTime));
                }
            }
        }
    }

    private void processDead(Long deadNode) {
        List<Long> aliveNodes = nodeMonitor.getAliveNodes(true);
        // 需要考虑一种网络瞬断的情况,会导致node所有出现重连,导致出现restart风暴,执行restart时需要重新check下是否存活
        if (aliveNodes.contains(deadNode)) {
            logger.warn("dead node[{}] happend just one moment , check it's alived", deadNode);
            return;
        }

        // 发送一条报警信息
        List<Long> channelIds = Lists.newArrayList();
        List<Channel> channels = channelService.listByNodeId(deadNode, ChannelStatus.START);
        for (Channel channel : channels) {
            channelIds.add(channel.getId());
        }
        Collections.sort(channelIds);

        NodeAlarmEvent alarm = new NodeAlarmEvent();
        alarm.setPipelineId(-1L);
        alarm.setTitle(MonitorName.EXCEPTION.name());
        alarm.setMessage(String.format("nid:%s is dead and restart cids:%s", String.valueOf(deadNode),
                                       channelIds.toString()));
        try {
            exceptionRuleMonitor.feed(alarm, alarm.getPipelineId());
        } catch (Exception e) {
            logger.error(String.format("ERROR # exceptionRuleMonitor error for %s", alarm.toString()), e);
        }

        for (Long channelId : channelIds) {// 重启一下对应的channel
            boolean result = arbitrateManageService.channelEvent().restart(channelId);
            if (result) {
                channelService.notifyChannel(channelId);// 推送一下配置
            }
        }

    }

    public void destroy() throws Exception {
        nodeMonitor.removeListener(this);
        executor.shutdownNow();
    }

    /**
     * 构建一个基于时间的delay queue,解决一个问题:node出现网络闪段,其jvm并不是真实关闭,可以间隔几秒后check一下是否存活再判断是否进行RESTART操作
     * 
     * @author jianghang 2012-8-29 下午01:42:47
     * @version 4.1.0
     */
    public static class DeadNodeDelayed implements Delayed {

        // init time for nano
        private static final long MILL_ORIGIN = System.currentTimeMillis();
        private long              nid;
        private long              now;                                     // 记录具体的now的偏移时间点,单位ms
        private long              timeout;                                 // 记录具体需要被delayed处理的偏移时间点,单位ms

        public DeadNodeDelayed(long nid, long timeout){
            this.nid = nid;
            this.timeout = timeout;
            this.now = System.currentTimeMillis() - MILL_ORIGIN;
        }

        public long getNid() {
            return nid;
        }

        public long getNow() {
            return now;
        }

        public long getDelay(TimeUnit unit) {
            long currNow = System.currentTimeMillis() - MILL_ORIGIN;
            long d = unit.convert(now + timeout - currNow, TimeUnit.MILLISECONDS);
            return d;
        }

        public int compareTo(Delayed other) {
            if (other == this) { // compare zero ONLY if same object
                return 0;
            } else if (other instanceof DeadNodeDelayed) {
                DeadNodeDelayed x = (DeadNodeDelayed) other;
                long diff = now + timeout - (x.now + x.timeout);
                return (diff == 0) ? 0 : ((diff < 0) ? 1 : -1); // 时间越小的,越应该排在前面
            } else {
                long d = (getDelay(TimeUnit.MILLISECONDS) - other.getDelay(TimeUnit.MILLISECONDS));
                return (d == 0) ? 0 : ((d < 0) ? 1 : -1);
            }
        }

        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + (int) (nid ^ (nid >>> 32));
            return result;
        }

        public boolean equals(Object obj) {
            if (this == obj) {
                return true;
            }
            if (obj == null) {
                return false;
            }
            if (!(obj instanceof DeadNodeDelayed)) {
                return false;
            }
            DeadNodeDelayed other = (DeadNodeDelayed) obj;
            if (nid != other.nid) {
                return false;
            }
            return true;
        }

    }

    public void setNodeMonitor(NodeMonitor nodeMonitor) {
        this.nodeMonitor = nodeMonitor;
    }

    public void setArbitrateManageService(ArbitrateManageService arbitrateManageService) {
        this.arbitrateManageService = arbitrateManageService;
    }

    public void setChannelService(ChannelService channelService) {
        this.channelService = channelService;
    }

    public void setExceptionRuleMonitor(PassiveMonitor exceptionRuleMonitor) {
        this.exceptionRuleMonitor = exceptionRuleMonitor;
    }

}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/basedao/GenericDAO.java
================================================
/*
 * Copyright (C) 2010-2101 Alibaba Group Holding Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     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.alibaba.otter.manager.biz.common.basedao;

import java.util.List;
import java.util.Map;

/**
 * @author simon 2011-10-31 上午09:40:47
 */
public interface GenericDAO<T> {

    public T insert(T entityObj);

    public void delete(Long identity);

    public void update(T entityObj);

    public List<T> listAll();

    public List<T> listByCondition(Map condition);

    public List<T> listByMultiId(Long... identities);

    public T findById(Long identity);

    public int getCount();

    public int getCount(Map condition);

    public boolean checkUnique(T entityObj);

}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/baseservice/GenericService.java
================================================
/*
 * Copyright (C) 2010-2101 Alibaba Group Holding Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     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.alibaba.otter.manager.biz.common.baseservice;

import java.util.List;
import java.util.Map;

/**
 * @author simon 2011-10-31 上午10:34:17
 */
public interface GenericService<T> {

    public void create(T entityObj);

    public void remove(Long identity);

    public void modify(T entityObj);

    public T findById(Long identity);

    public List<T> listByIds(Long... identities);

    public List<T> listAll();

    public List<T> listByCondition(Map condition);

    public int getCount();

    public int getCount(Map condition);
}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/exceptions/InvalidConfigureException.java
================================================
package com.alibaba.otter.manager.biz.common.exceptions;

public class InvalidConfigureException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    public static enum INVALID_TYPE {
        DDL, HOME
    }

    private INVALID_TYPE type;

    public InvalidConfigureException(INVALID_TYPE type){
        super(type.name());
        this.type = type;
    }

    public INVALID_TYPE getType() {
        return type;
    }

}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/exceptions/ManagerException.java
================================================
/*
 * Copyright (C) 2010-2101 Alibaba Group Holding Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     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.alibaba.otter.manager.biz.common.exceptions;

/**
 * ManagerException for Manager Model
 * 
 * @author simon 2011-11-13 下午07:38:47
 */
public class ManagerException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    public ManagerException(String cause){
        super(cause);
    }

    public ManagerException(Throwable t){
        super(t);
    }

    public ManagerException(String cause, Throwable t){
        super(cause, t);
    }

}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/exceptions/RepeatConfigureException.java
================================================
/*
 * Copyright (C) 2010-2101 Alibaba Group Holding Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     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.alibaba.otter.manager.biz.common.exceptions;

/**
 * @author simon 2011-11-14 下午11:04:32
 */
public class RepeatConfigureException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    public RepeatConfigureException(String cause){
        super(cause);
    }

    public RepeatConfigureException(Throwable t){
        super(t);
    }

    public RepeatConfigureException(String cause, Throwable t){
        super(cause, t);
    }

}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/alarm/AlarmRuleService.java
================================================
/*
 * Copyright (C) 2010-2101 Alibaba Group Holding Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     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.alibaba.otter.manager.biz.config.alarm;

import java.util.List;
import java.util.Map;

import com.alibaba.otter.shared.common.model.config.alarm.AlarmRule;
import com.alibaba.otter.shared.common.model.config.alarm.AlarmRuleStatus;

/**
 * @author simon 2012-8-24 上午5:27:35
 * @author zebin.xuzb
 * @version 4.1.0
 */
public interface AlarmRuleService {

    void create(AlarmRule alarmRule);

    void modify(AlarmRule alarmRule);

    void remove(Long alarmRuleId);

    public void enableMonitor(Long alarmRuleId);

    public void disableMonitor(Long alarmRuleId);

    public void disableMonitor(Long alarmRuleId, String pauseTime);

    List<AlarmRule> getAllAlarmRules(AlarmRuleStatus status);

    AlarmRule getAlarmRuleById(Long AlarmRuleId);

    /**
     * 获取所有状态为 status 的 {@linkplain AlarmRule},并且按照pipelineId分区
     * 
     * @param status
     * @return
     */
    Map<Long, List<AlarmRule>> getAlarmRules(AlarmRuleStatus status);

    List<AlarmRule> getAlarmRules(Long pipelineId);

    List<AlarmRule> getAlarmRules(Long pipelineId, AlarmRuleStatus status);

    List<AlarmRule> listAllAlarmRules(Map condition);

    public int getCount();

}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/alarm/dal/AlarmRuleDAO.java
================================================
/*
 * Copyright (C) 2010-2101 Alibaba Group Holding Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     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.alibaba.otter.manager.biz.config.alarm.dal;

import java.util.List;
import java.util.Map;

import com.alibaba.otter.manager.biz.config.alarm.dal.dataobject.AlarmRuleDO;
import com.alibaba.otter.shared.common.model.config.alarm.AlarmRuleStatus;

/**
 * @author simon 2012-8-24 上午5:17:00
 * @version 4.1.0
 */
public interface AlarmRuleDAO {

    public AlarmRuleDO insert(AlarmRuleDO entityObj);

    public void update(AlarmRuleDO entityObj);

    public void delete(Long id);

    public AlarmRuleDO findById(Long alarmRuleId);

    public List<AlarmRuleDO> listByPipelineId(Long pipelineId);

    public List<AlarmRuleDO> listByPipelineId(Long pipelineId, AlarmRuleStatus status);

    public List<AlarmRuleDO> listAll();

    public List<AlarmRuleDO> listAllByPipeline(Map condition);

    public List<AlarmRuleDO> listByStatus(AlarmRuleStatus status);

    public int getCount();

}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/alarm/dal/dataobject/AlarmRuleDO.java
================================================
/*
 * Copyright (C) 2010-2101 Alibaba Group Holding Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     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.alibaba.otter.manager.biz.config.alarm.dal.dataobject;

import java.io.Serializable;
import java.util.Date;

import com.alibaba.otter.shared.common.model.config.alarm.AlarmRuleStatus;
import com.alibaba.otter.shared.common.model.config.alarm.MonitorName;

/**
 * @author simon 2012-8-22 下午3:42:34
 * @version 4.1.0
 */
public class AlarmRuleDO implements Serializable {

    private static final long  serialVersionUID   = -1284784362325347636L;
    private Long               id;
    private Long               pipelineId;
    private AlarmRuleStatus    status;
    private MonitorName        monitorName;
    private String             receiverKey;
    private String             matchValue;
    private AlarmRuleParameter alarmRuleParameter = new AlarmRuleParameter();
    private String             description;
    private Date               gmtCreate;
    private Date               gmtModified;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getPipelineId() {
        return pipelineId;
    }

    public void setPipelineId(Long pipelineId) {
        this.pipelineId = pipelineId;
    }

    public AlarmRuleStatus getStatus() {
        return status;
    }

    public void setStatus(AlarmRuleStatus status) {
        this.status = status;
    }

    public MonitorName getMonitorName() {
        return monitorName;
    }

    public void setMonitorName(MonitorName monitorName) {
        this.monitorName = monitorName;
    }

    public String getReceiverKey() {
        return receiverKey;
    }

    public void setReceiverKey(String receiverKey) {
        this.receiverKey = receiverKey;
    }

    public String getMatchValue() {
        return matchValue;
    }

    public void setMatchValue(String matchValue) {
        this.matchValue = matchValue;
    }

    public AlarmRuleParameter getAlarmRuleParameter() {
        return alarmRuleParameter;
    }

    public void setAlarmRuleParameter(AlarmRuleParameter alarmRuleParameter) {
        this.alarmRuleParameter = alarmRuleParameter;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Date getGmtCreate() {
        return gmtCreate;
    }

    public void setGmtCreate(Date gmtCreate) {
        this.gmtCreate = gmtCreate;
    }

    public Date getGmtModified() {
        return gmtModified;
    }

    public void setGmtModified(Date gmtModified) {
        this.gmtModified = gmtModified;
    }

}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/alarm/dal/dataobject/AlarmRuleParameter.java
================================================
/*
 * Copyright (C) 2010-2101 Alibaba Group Holding Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     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.alibaba.otter.manager.biz.config.alarm.dal.dataobject;

import java.io.Serializable;

/**
 * @author simon 2012-9-12 上午10:35:13
 * @version 4.1.0
 */
public class AlarmRuleParameter implements Serializable {

    private static final long serialVersionUID = 1570395344191530689L;
    private Long              intervalTime     = 1800L;
    private String            pauseTime;
    private Integer           recoveryThresold = 3;
    private Boolean           autoRecovery     = false;

    public Long getIntervalTime() {
        return intervalTime;
    }

    public void setIntervalTime(Long intervalTime) {
        this.intervalTime = intervalTime;
    }

    public String getPauseTime() {
        return pauseTime;
    }

    public void setPauseTime(String pauseTime) {
        this.pauseTime = pauseTime;
    }

    public Boolean getAutoRecovery() {
        return autoRecovery;
    }

    public void setAutoRecovery(Boolean autoRecovery) {
        this.autoRecovery = autoRecovery;
    }

    public Integer getRecoveryThresold() {
        return recoveryThresold;
    }

    public void setRecoveryThresold(Integer recoveryThresold) {
        this.recoveryThresold = recoveryThresold;
    }

}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/alarm/dal/ibatis/AlarmRuleParameterTypeHandler.java
================================================
/*
 * Copyright (C) 2010-2101 Alibaba Group Holding Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     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.alibaba.otter.manager.biz.config.alarm.dal.ibatis;

import java.sql.SQLException;

import com.alibaba.otter.manager.biz.config.alarm.dal.dataobject.AlarmRuleParameter;
import com.alibaba.otter.shared.common.utils.JsonUtils;
import com.ibatis.sqlmap.client.extensions.ParameterSetter;
import com.ibatis.sqlmap.client.extensions.ResultGetter;
import com.ibatis.sqlmap.client.extensions.TypeHandlerCallback;

/**
 * 用于AlarmRuleParameter的解析
 * 
 * @author simon
 */
public class AlarmRuleParameterTypeHandler implements TypeHandlerCallback {

    @Override
    public void setParameter(ParameterSetter setter, Object parameter) throws SQLException {
        setter.setString(JsonUtils.marshalToString(parameter));
    }

    @Override
    public Object getResult(ResultGetter getter) throws SQLException {
        return JsonUtils.unmarshalFromString(getter.getString(), AlarmRuleParameter.class);
    }

    public Object valueOf(String s) {
        return JsonUtils.unmarshalFromString(s, AlarmRuleParameter.class);
    }

}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/alarm/dal/ibatis/IbatisAlarmRuleDAO.java
================================================
/*
 * Copyright (C) 2010-2101 Alibaba Group Holding Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     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.alibaba.otter.manager.biz.config.alarm.dal.ibatis;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

import com.alibaba.otter.shared.common.utils.Assert;
import com.alibaba.otter.manager.biz.config.alarm.dal.AlarmRuleDAO;
import com.alibaba.otter.manager.biz.config.alarm.dal.dataobject.AlarmRuleDO;
import com.alibaba.otter.shared.common.model.config.alarm.AlarmRuleStatus;

/**
 * @author simon
 */
public class IbatisAlarmRuleDAO extends SqlMapClientDaoSupport implements AlarmRuleDAO {

    public AlarmRuleDO insert(AlarmRuleDO entityObj) {
        Assert.assertNotNull(entityObj);
        getSqlMapClientTemplate().insert("insertAlarmRule", entityObj);
        return entityObj;
    }

    public void update(AlarmRuleDO entityObj) {
        Assert.assertNotNull(entityObj);
        getSqlMapClientTemplate().update("updateAlarmRule", entityObj);
    }

    public void delete(Long id) {
        Assert.assertNotNull(id);
        getSqlMapClientTemplate().update("deleteAlarmRuleById", id);
    }

    public AlarmRuleDO findById(Long alarmRuleId) {
        Assert.assertNotNull(alarmRuleId);
        AlarmRuleDO alarmRuleDo = (AlarmRuleDO) getSqlMapClientTemplate().queryForObject("findByRuleId", alarmRuleId);
        return alarmRuleDo;
    }

    public List<AlarmRuleDO> listByPipelineId(Long pipelineId) {
        Assert.assertNotNull(pipelineId);
        List<AlarmRuleDO> alarmRuleDos = getSqlMapClientTemplate().queryForList("listAlarmByPipelineId", pipelineId);
        return alarmRuleDos;
    }

    public List<AlarmRuleDO> listByPipelineId(Long pipelineId, AlarmRuleStatus status) {
        List<AlarmRuleDO> alarmRuleDos = listByPipelineId(pipelineId);
        List<AlarmRuleDO> result = new ArrayList<AlarmRuleDO>();
        for (AlarmRuleDO alarmRuleDo : alarmRuleDos) {
            if (alarmRuleDo.getStatus().equals(status)) {
                result.add(alarmRuleDo);
            }
        }
        return result;
    }

    public List<AlarmRuleDO> listAll() {
        List<AlarmRuleDO> alarmRuleDos = getSqlMapClientTemplate().queryForList("listAllAlarmRule");
        return alarmRuleDos;
    }

    public List<AlarmRuleDO> listAllByPipeline(Map condition) {
        List<AlarmRuleDO> alarmRuleDos = getSqlMapClientTemplate().queryForList("listAllAlarmOrderByPipeline",
                                                                                condition);
        return alarmRuleDos;
    }

    public List<AlarmRuleDO> listByStatus(AlarmRuleStatus status) {
        List<AlarmRuleDO> alarmRuleDos = getSqlMapClientTemplate().queryForList("listAlarmByStatus", status);
        return alarmRuleDos;
    }

    public int getCount() {
        Integer count = (Integer) getSqlMapClientTemplate().queryForObject("getAlarmRuleCount");
        return count.intValue();
    }

}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/alarm/impl/AlarmRuleServiceImpl.java
================================================
/*
 * Copyright (C) 2010-2101 Alibaba Group Holding Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     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.alibaba.otter.manager.biz.config.alarm.impl;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.otter.manager.biz.common.exceptions.ManagerException;
import com.alibaba.otter.manager.biz.config.alarm.AlarmRuleService;
import com.alibaba.otter.manager.biz.config.alarm.dal.AlarmRuleDAO;
import com.alibaba.otter.manager.biz.config.alarm.dal.dataobject.AlarmRuleDO;
import com.alibaba.otter.manager.biz.config.alarm.dal.dataobject.AlarmRuleParameter;
import com.alibaba.otter.shared.common.model.config.alarm.AlarmRule;
import com.alibaba.otter.shared.common.model.config.alarm.AlarmRuleStatus;
import com.alibaba.otter.shared.common.utils.Assert;

/**
 * @author simon 2012-8-24 上午5:29:55
 * @version 4.1.0
 */
public class AlarmRuleServiceImpl implements AlarmRuleService {

    private static final Logger logger           = LoggerFactory.getLogger(AlarmRuleServiceImpl.class);
    public static final String  TIMESTAMP_FORMAT = "yyyy-MM-dd HH:mm:ss";
    private AlarmRuleDAO        alarmRuleDao;

    public void create(AlarmRule alarmRule) {
        Assert.assertNotNull(alarmRule);
        alarmRuleDao.insert(modelToDo(alarmRule));
    }

    public void modify(AlarmRule alarmRule) {
        AlarmRuleDO alarmRuleDo = modelToDo(alarmRule);
        alarmRuleDao.update(alarmRuleDo);

    }

    public void remove(Long alarmRuleId) {
        alarmRuleDao.delete(alarmRuleId);
    }

    private void switchAlarmRuleStatus(Long alarmRuleId, AlarmRuleStatus alarmRuleStatus, String pauseTime) {
        AlarmRuleDO alarmRuleDo = alarmRuleDao.findById(alarmRuleId);

        if (null == alarmRuleDo) {
            String exceptionCause = "query alarmRule:" + alarmRuleId + " return null.";
            logger.error("ERROR ## " + exceptionCause);
            throw new ManagerException(exceptionCause);
        }

        alarmRuleDo.setStatus(alarmRuleStatus);
        if (alarmRuleDo.getAlarmRuleParameter() != null) {
            alarmRuleDo.getAlarmRuleParameter().setPauseTime(pauseTime);
        } else if (StringUtils.isNotEmpty(pauseTime)) {
            alarmRuleDo.setAlarmRuleParameter(new AlarmRuleParameter());
            alarmRuleDo.getAlarmRuleParameter().setPauseTime(pauseTime);
        }
        alarmRuleDao.update(alarmRuleDo);
    }

    public void enableMonitor(Long alarmRuleId) {
        switchAlarmRuleStatus(alarmRuleId, AlarmRuleStatus.ENABLE, null);
    }

    public void disableMonitor(Long alarmRuleId) {
        switchAlarmRuleStatus(alarmRuleId, AlarmRuleStatus.DISABLE, null);
    }

    public void disableMonitor(Long alarmRuleId, String pauseTime) {
        switchAlarmRuleStatus(alarmRuleId, AlarmRuleStatus.ENABLE, pauseTime);
    }

    public AlarmRule getAlarmRuleById(Long AlarmRuleId) {
        Assert.assertNotNull(AlarmRuleId);
        return doToModel(alarmRuleDao.findById(AlarmRuleId));
    }

    public List<AlarmRule> getAllAlarmRules(AlarmRuleStatus status) {
        Assert.assertNotNull(status);
        List<AlarmRuleDO> alarmRuleDos = alarmRuleDao.listByStatus(status);
        return doToModel(alarmRuleDos);
    }

    public Map<Long, List<AlarmRule>> getAlarmRules(AlarmRuleStatus status) {
        Assert.assertNotNull(status);
        List<AlarmRule> alarmRules = getAllAlarmRules(status);
        Map<Long, List<AlarmRule>> result = new HashMap<Long, List<AlarmRule>>();
        for (AlarmRule alarmRule : alarmRules) {
            List<AlarmRule> rules = result.get(alarmRule.getPipelineId());
            if (rules == null) {
                rules = new ArrayList<AlarmRule>();
            }
            if (!rules.contains(alarmRule)) {
                rules.add(alarmRule);
            }
            result.put(alarmRule.getPipelineId(), rules);
        }
        return result;
    }

    public List<AlarmRule> getAlarmRules(Long pipelineId) {
        Assert.assertNotNull(pipelineId);
        List<AlarmRuleDO> alarmRuleDos = alarmRuleDao.listByPipelineId(pipelineId);
        return doToModel(alarmRuleDos);
    }

    public List<AlarmRule> getAlarmRules(Long pipelineId, AlarmRuleStatus status) {
        Assert.assertNotNull(pipelineId);
        Assert.assertNotNull(status);
        List<AlarmRuleDO> alarmRuleDos = alarmRuleDao.listByPipelineId(pipelineId, status);

        return doToModel(alarmRuleDos);
    }

    public List<AlarmRule> listAllAlarmRules(Map condition) {
        List<AlarmRule> alarmRules = doToModel(alarmRuleDao.listAllByPipeline(condition));
        return alarmRules;
    }

    public int getCount() {
        return alarmRuleDao.getCount();
    }

    private AlarmRule doToModel(AlarmRuleDO alarmRuleDo) {
        AlarmRule alarmRule = new AlarmRule();
        alarmRule.setId(alarmRuleDo.getId());
        alarmRule.setMatchValue(alarmRuleDo.getMatchValue());
        alarmRule.setMonitorName(alarmRuleDo.getMonitorName());
        alarmRule.setReceiverKey(alarmRuleDo.getReceiverKey());
        // 如果数据库里面的数据为空,则返回默认值
        alarmRule.setIntervalTime(alarmRuleDo.getAlarmRuleParameter() == null ? 1800L : alarmRuleDo.getAlarmRuleParameter().getIntervalTime());
        String pauseTime = alarmRuleDo.getAlarmRuleParameter() == null ? null : alarmRuleDo.getAlarmRuleParameter().getPauseTime();
        if (StringUtils.isNotEmpty(pauseTime)) {
            SimpleDateFormat format = new SimpleDateFormat(TIMESTAMP_FORMAT);
            try {
                alarmRule.setPauseTime(format.parse(pauseTime));
            } catch (ParseException e) {
                throw new ManagerException(e);
            }
        }

        alarmRule.setAutoRecovery(alarmRuleDo.getAlarmRuleParameter() == null ? false : alarmRuleDo.getAlarmRuleParameter().getAutoRecovery());
        alarmRule.setRecoveryThresold(alarmRuleDo.getAlarmRuleParameter() == null ? 3 : alarmRuleDo.getAlarmRuleParameter().getRecoveryThresold());
        alarmRule.setPipelineId(alarmRuleDo.getPipelineId());
        alarmRule.setStatus(alarmRuleDo.getStatus());
        alarmRule.setDescription(alarmRuleDo.getDescription());
        alarmRule.setGmtCreate(alarmRuleDo.getGmtCreate());
        alarmRule.setGmtModified(alarmRuleDo.getGmtModified());
        return alarmRule;
    }

    private List<AlarmRule> doToModel(List<AlarmRuleDO> alarmRuleDos) {
        List<AlarmRule> alarmRules = new ArrayList<AlarmRule>();
        for (AlarmRuleDO alarmRuleDo : alarmRuleDos) {
            alarmRules.add(doToModel(alarmRuleDo));
        }
        return alarmRules;
    }

    private AlarmRuleDO modelToDo(AlarmRule alarmRule) {
        AlarmRuleDO alarmRuleDo = new AlarmRuleDO();
        alarmRuleDo.setId(alarmRule.getId());
        alarmRuleDo.setMatchValue(alarmRule.getMatchValue());
        alarmRuleDo.setMonitorName(alarmRule.getMonitorName());
        alarmRuleDo.setReceiverKey(alarmRule.getReceiverKey());
        alarmRuleDo.setPipelineId(alarmRule.getPipelineId());
        alarmRuleDo.setStatus(alarmRule.getStatus());
        alarmRuleDo.setDescription(alarmRule.getDescription());
        alarmRuleDo.setGmtCreate(alarmRule.getGmtCreate());
        alarmRuleDo.setGmtModified(alarmRule.getGmtModified());
        AlarmRuleParameter alarmRuleParameter = new AlarmRuleParameter();
        alarmRuleParameter.setIntervalTime(alarmRule.getIntervalTime());
        if (alarmRule.getPauseTime() != null) {
            SimpleDateFormat format = new SimpleDateFormat(TIMESTAMP_FORMAT);
            alarmRuleParameter.setPauseTime(format.format(alarmRule.getPauseTime()));
        }
        alarmRuleParameter.setAutoRecovery(alarmRule.getAutoRecovery());
        alarmRuleParameter.setRecoveryThresold(alarmRule.getRecoveryThresold());
        alarmRuleDo.setAlarmRuleParameter(alarmRuleParameter);

        return alarmRuleDo;
    }

    public void setAlarmRuleDao(AlarmRuleDAO alarmRuleDao) {
        this.alarmRuleDao = alarmRuleDao;
    }

}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/autokeeper/AutoKeeperClusterService.java
================================================
/*
 * Copyright (C) 2010-2101 Alibaba Group Holding Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     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.alibaba.otter.manager.biz.config.autokeeper;

import java.util.List;

import com.alibaba.otter.shared.common.model.autokeeper.AutoKeeperCluster;

/**
 * @author simon 2012-9-24 下午5:35:01
 * @version 4.1.0
 */
public interface AutoKeeperClusterService {

    public AutoKeeperCluster findAutoKeeperClusterById(Long id);

    public List<AutoKeeperCluster> listAutoKeeperClusters();

    public void modifyAutoKeeperCluster(AutoKeeperCluster autoKeeperCluster);

    public void createAutoKeeperCluster(AutoKeeperCluster autoKeeperCluster);

    public void removeAutoKeeperCluster(Long id);

    public Integer getCount();
}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/autokeeper/dal/AutoKeeperClusterDAO.java
================================================
/*
 * Copyright (C) 2010-2101 Alibaba Group Holding Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     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.alibaba.otter.manager.biz.config.autokeeper.dal;

import java.util.List;

import com.alibaba.otter.manager.biz.config.autokeeper.dal.dataobject.AutoKeeperClusterDO;

public interface AutoKeeperClusterDAO {

    public AutoKeeperClusterDO findAutoKeeperClusterById(Long id);

    public List<AutoKeeperClusterDO> listAutoKeeperClusters();

    public void updateAutoKeeperCluster(AutoKeeperClusterDO autoKeeperClusterDo);

    public void insertAutoKeeperClusterDO(AutoKeeperClusterDO autoKeeperClusterDo);

    public void delete(Long clusterId);

    public Integer getCount();

}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/autokeeper/dal/dataobject/AutoKeeperClusterDO.java
================================================
/*
 * Copyright (C) 2010-2101 Alibaba Group Holding Limited.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     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.alibaba.otter.manager.biz.config.autokeeper.dal.dataobject;

import java.util.Date;

import org.apache.commons.lang.builder.ToStringBuilder;

import com.alibaba.otter.shared.common.utils.OtterToStringStyle;

/**
 * zk集群监控对象
 * 
 * @author jianghang 2012-9-21 下午01:54:17
 * @version 4.1.0
 */
public class AutoKeeperClusterDO {

    private Long   id;
    private String clusterName;
    private String serverList; // 机器列表
    private String description; // 描述
    private Date   gmtCreate;
    private Date   gmtModified;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getClusterName() {
        return clusterName;
    }

    public void setClusterName(String clusterName) {
        this.clusterName = clusterName;
    }

    public String getServerList() {
        return serverList;
    }

    public void setServerList(String serverList) {
        this.serverList = serverList;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Date getGmtCreate() {
        return gmtCreate;
    }

    public void setGmtCreate(Date gmtCreate) {
        this.gmtCreate = gmtCreate;
    }

    public Date getGmtModified() {
        return gmtModified;
    }

    public void setGmtModified(Date gmtModified) {
        this.gmtModified = gmtModified;
    }

    public String toString() {
        return ToStringBuilder.reflectionToString(this, OtterToStringStyle.DEFAULT_STYLE);
    }

}


================================================
FILE: manager/biz/src/main/java/com/alibaba/otter/manager
Download .txt
gitextract_t6qjy73f/

├── .gitignore
├── HEADER.txt
├── LICENSE.txt
├── README.md
├── codeformat.xml
├── codetemplates.xml
├── docker/
│   ├── Dockerfile
│   ├── base/
│   │   └── Dockerfile
│   ├── build.sh
│   ├── image/
│   │   ├── admin/
│   │   │   ├── app.sh
│   │   │   ├── bin/
│   │   │   │   ├── clean_log
│   │   │   │   ├── clean_log.sh
│   │   │   │   └── ddl.sql
│   │   │   └── health.sh
│   │   └── alidata/
│   │       ├── bin/
│   │       │   ├── exec_rc_local.sh
│   │       │   ├── lark-wait
│   │       │   └── main.sh
│   │       ├── init/
│   │       │   ├── 02init-sshd.sh
│   │       │   └── fix-hosts.py
│   │       └── lib/
│   │           └── proc.sh
│   └── run.sh
├── lib/
│   ├── install.bat
│   ├── install.sh
│   ├── jmockit-0.999.10-sources.jar
│   ├── jmockit-0.999.10.jar
│   ├── jmockit-0.999.10.pom
│   ├── jtester-1.1.8-sources.jar
│   ├── jtester-1.1.8.jar
│   ├── jtester-1.1.8.pom
│   └── ojdbc6.jar
├── manager/
│   ├── biz/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── alibaba/
│   │       │   │           └── otter/
│   │       │   │               └── manager/
│   │       │   │                   └── biz/
│   │       │   │                       ├── autokeeper/
│   │       │   │                       │   ├── AutoKeeperStatService.java
│   │       │   │                       │   └── impl/
│   │       │   │                       │       ├── AutoKeeperCollector.java
│   │       │   │                       │       ├── AutoKeeperData.java
│   │       │   │                       │       ├── AutoKeeperPersist.java
│   │       │   │                       │       └── AutoKeeperStatServiceImpl.java
│   │       │   │                       ├── common/
│   │       │   │                       │   ├── DataSourceCreator.java
│   │       │   │                       │   ├── alarm/
│   │       │   │                       │   │   ├── AbstractAlarmService.java
│   │       │   │                       │   │   ├── AlarmMessage.java
│   │       │   │                       │   │   ├── AlarmService.java
│   │       │   │                       │   │   └── DefaultAlarmService.java
│   │       │   │                       │   ├── arbitrate/
│   │       │   │                       │   │   ├── ArbitrateConfigImpl.java
│   │       │   │                       │   │   └── DeadNodeListener.java
│   │       │   │                       │   ├── basedao/
│   │       │   │                       │   │   └── GenericDAO.java
│   │       │   │                       │   ├── baseservice/
│   │       │   │                       │   │   └── GenericService.java
│   │       │   │                       │   └── exceptions/
│   │       │   │                       │       ├── InvalidConfigureException.java
│   │       │   │                       │       ├── ManagerException.java
│   │       │   │                       │       └── RepeatConfigureException.java
│   │       │   │                       ├── config/
│   │       │   │                       │   ├── alarm/
│   │       │   │                       │   │   ├── AlarmRuleService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── AlarmRuleDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   ├── AlarmRuleDO.java
│   │       │   │                       │   │   │   │   └── AlarmRuleParameter.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       ├── AlarmRuleParameterTypeHandler.java
│   │       │   │                       │   │   │       └── IbatisAlarmRuleDAO.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       └── AlarmRuleServiceImpl.java
│   │       │   │                       │   ├── autokeeper/
│   │       │   │                       │   │   ├── AutoKeeperClusterService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── AutoKeeperClusterDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   └── AutoKeeperClusterDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       └── IbatisAutoKeeperClusterDAO.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       └── AutoKeeperClusterServiceImpl.java
│   │       │   │                       │   ├── canal/
│   │       │   │                       │   │   ├── CanalService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── CanalDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   └── CanalDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       ├── CanalParameterTypeHandler.java
│   │       │   │                       │   │   │       └── IbatisCanalDAO.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       └── CanalServiceImpl.java
│   │       │   │                       │   ├── channel/
│   │       │   │                       │   │   ├── ChannelService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── ChannelDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   └── ChannelDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       ├── ChannelParameterTypeHandler.java
│   │       │   │                       │   │   │       └── IbatisChannelDAO.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       └── ChannelServiceImpl.java
│   │       │   │                       │   ├── datacolumnpair/
│   │       │   │                       │   │   ├── DataColumnPairGroupService.java
│   │       │   │                       │   │   ├── DataColumnPairService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── DataColumnPairDAO.java
│   │       │   │                       │   │   │   ├── DataColumnPairGroupDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   ├── DataColumnPairDO.java
│   │       │   │                       │   │   │   │   └── DataColumnPairGroupDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       ├── IbatisDataColumnPairDAO.java
│   │       │   │                       │   │   │       └── IbatisDataColumnPairGroupDAO.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       ├── DataColumnPairGroupServiceImpl.java
│   │       │   │                       │   │       └── DataColumnPairServiceImpl.java
│   │       │   │                       │   ├── datamatrix/
│   │       │   │                       │   │   ├── DataMatrixService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── DataMatrixDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   └── DataMatrixDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       └── IbatisDataMatrixDAO.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       └── DataMatrixServiceImpl.java
│   │       │   │                       │   ├── datamedia/
│   │       │   │                       │   │   ├── DataMediaService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── DataMediaDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   └── DataMediaDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       └── IbatisDataMediaDAO.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       └── DataMediaServiceImpl.java
│   │       │   │                       │   ├── datamediapair/
│   │       │   │                       │   │   ├── DataMediaPairService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── DataMediaPairDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   └── DataMediaPairDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       └── IbatisDataMediaPairDAO.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       └── DataMediaPairServiceImpl.java
│   │       │   │                       │   ├── datamediasource/
│   │       │   │                       │   │   ├── DataMediaSourceService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── DataMediaSourceDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   └── DataMediaSourceDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       └── IbatisDataMediaSourceDAO.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       └── DataMediaSourceServiceImpl.java
│   │       │   │                       │   ├── node/
│   │       │   │                       │   │   ├── NodeService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── NodeDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   └── NodeDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       ├── IbatisNodeDAO.java
│   │       │   │                       │   │   │       └── NodeParameterTypeHandler.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       └── NodeServiceImpl.java
│   │       │   │                       │   ├── parameter/
│   │       │   │                       │   │   ├── SystemParameterService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── SystemParameterDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   └── SystemParameterDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       ├── IbatisSystemParameterDAO.java
│   │       │   │                       │   │   │       └── SystemParameterTypeHandler.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       └── SystemParameterServiceImpl.java
│   │       │   │                       │   ├── pipeline/
│   │       │   │                       │   │   ├── PipelineService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── PipelineDAO.java
│   │       │   │                       │   │   │   ├── PipelineNodeRelationDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   ├── PipelineDO.java
│   │       │   │                       │   │   │   │   └── PipelineNodeRelationDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       ├── IbatisPipelineDAO.java
│   │       │   │                       │   │   │       ├── IbatisPipelineNodeRelationDAO.java
│   │       │   │                       │   │   │       └── PipelineParameterTypeHandler.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       └── PipelineServiceImpl.java
│   │       │   │                       │   ├── record/
│   │       │   │                       │   │   ├── LogRecordService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── LogRecordDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   └── LogRecordDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       └── IbatisLogRecordDAO.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       └── LogRecordServiceImpl.java
│   │       │   │                       │   └── utils/
│   │       │   │                       │       ├── ListTypeHandler.java
│   │       │   │                       │       └── MapTypeHandler.java
│   │       │   │                       ├── monitor/
│   │       │   │                       │   ├── AlarmController.java
│   │       │   │                       │   ├── AlarmRecovery.java
│   │       │   │                       │   ├── Monitor.java
│   │       │   │                       │   ├── MonitorRuleExplorerRegisty.java
│   │       │   │                       │   ├── MonitorTimer.java
│   │       │   │                       │   ├── PassiveMonitor.java
│   │       │   │                       │   └── impl/
│   │       │   │                       │       ├── AbstractRuleMonitor.java
│   │       │   │                       │       ├── AlarmRecoveryDelayed.java
│   │       │   │                       │       ├── DefaultAlarmController.java
│   │       │   │                       │       ├── DelayStatRuleMonitor.java
│   │       │   │                       │       ├── ExceptionRuleMonitor.java
│   │       │   │                       │       ├── GlobalMonitor.java
│   │       │   │                       │       ├── PipelineMonitor.java
│   │       │   │                       │       ├── PipelineTimeoutRuleMonitor.java
│   │       │   │                       │       ├── PositionTimeoutRuleMonitor.java
│   │       │   │                       │       ├── ProcessTimeoutRuleMonitor.java
│   │       │   │                       │       ├── RestartAlarmRecovery.java
│   │       │   │                       │       └── SelfMonitor.java
│   │       │   │                       ├── remote/
│   │       │   │                       │   ├── ArbitrateRemoteService.java
│   │       │   │                       │   ├── CanalRemoteService.java
│   │       │   │                       │   ├── ConfigRemoteService.java
│   │       │   │                       │   ├── NodeRemoteService.java
│   │       │   │                       │   ├── StatsRemoteService.java
│   │       │   │                       │   ├── impl/
│   │       │   │                       │   │   ├── ArbitrateRemoteServiceImpl.java
│   │       │   │                       │   │   ├── CanalRemoteServiceImpl.java
│   │       │   │                       │   │   ├── ConfigRemoteServiceImpl.java
│   │       │   │                       │   │   ├── NodeMBeanServiceImpl.java
│   │       │   │                       │   │   └── StatsRemoteServiceImpl.java
│   │       │   │                       │   └── interceptor/
│   │       │   │                       │       └── RemoteExceptionLoggerInterceptor.java
│   │       │   │                       ├── statistics/
│   │       │   │                       │   ├── delay/
│   │       │   │                       │   │   ├── DelayCounter.java
│   │       │   │                       │   │   ├── DelayStatService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── DelayStatDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   └── DelayStatDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       └── IbatisDelayStatDAO.java
│   │       │   │                       │   │   ├── impl/
│   │       │   │                       │   │   │   └── DelayStatServiceImpl.java
│   │       │   │                       │   │   └── param/
│   │       │   │                       │   │       ├── DelayCountParam.java
│   │       │   │                       │   │       ├── DelayStatInfo.java
│   │       │   │                       │   │       ├── TimelineDelayCondition.java
│   │       │   │                       │   │       └── TopDelayStat.java
│   │       │   │                       │   ├── stage/
│   │       │   │                       │   │   ├── ProcessStatService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── ProcessDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   └── ProcessStatDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       └── IbatisProcessDAO.java
│   │       │   │                       │   │   └── impl/
│   │       │   │                       │   │       └── ProcessStatServiceImpl.java
│   │       │   │                       │   ├── table/
│   │       │   │                       │   │   ├── TableStatService.java
│   │       │   │                       │   │   ├── dal/
│   │       │   │                       │   │   │   ├── TableHistoryStatDAO.java
│   │       │   │                       │   │   │   ├── TableStatDAO.java
│   │       │   │                       │   │   │   ├── dataobject/
│   │       │   │                       │   │   │   │   ├── TableHistoryStatDO.java
│   │       │   │                       │   │   │   │   └── TableStatDO.java
│   │       │   │                       │   │   │   └── ibatis/
│   │       │   │                       │   │   │       ├── IbatisTableHistoryStatDAO.java
│   │       │   │                       │   │   │       └── IbatisTableStatDAO.java
│   │       │   │                       │   │   ├── impl/
│   │       │   │                       │   │   │   └── TableStatServiceImpl.java
│   │       │   │                       │   │   └── param/
│   │       │   │                       │   │       ├── BehaviorHistoryCondition.java
│   │       │   │                       │   │       ├── BehaviorHistoryInfo.java
│   │       │   │                       │   │       └── TimelineBehaviorHistoryCondition.java
│   │       │   │                       │   └── throughput/
│   │       │   │                       │       ├── ThroughputStatService.java
│   │       │   │                       │       ├── dal/
│   │       │   │                       │       │   ├── ThroughputDAO.java
│   │       │   │                       │       │   ├── dataobject/
│   │       │   │                       │       │   │   └── ThroughputStatDO.java
│   │       │   │                       │       │   └── ibatis/
│   │       │   │                       │       │       └── IbatisThroughputDAO.java
│   │       │   │                       │       ├── impl/
│   │       │   │                       │       │   └── ThroughputStatServiceImpl.java
│   │       │   │                       │       └── param/
│   │       │   │                       │           ├── AnalysisType.java
│   │       │   │                       │           ├── RealtimeThroughputCondition.java
│   │       │   │                       │           ├── ThroughputCondition.java
│   │       │   │                       │           ├── ThroughputInfo.java
│   │       │   │                       │           └── TimelineThroughputCondition.java
│   │       │   │                       ├── user/
│   │       │   │                       │   ├── UserService.java
│   │       │   │                       │   ├── dal/
│   │       │   │                       │   │   ├── UserDAO.java
│   │       │   │                       │   │   ├── dataobject/
│   │       │   │                       │   │   │   └── UserDO.java
│   │       │   │                       │   │   └── ibatis/
│   │       │   │                       │   │       └── IbatisUserDAO.java
│   │       │   │                       │   └── impl/
│   │       │   │                       │       └── UserServiceImpl.java
│   │       │   │                       └── utils/
│   │       │   │                           ├── DataSourceChecker.java
│   │       │   │                           └── RegexUtils.java
│   │       │   └── resources/
│   │       │       ├── spring/
│   │       │       │   ├── otter-manager-alarm.xml
│   │       │       │   ├── otter-manager-arbitrate.xml
│   │       │       │   ├── otter-manager-autokeeper.xml
│   │       │       │   ├── otter-manager-dal.xml
│   │       │       │   ├── otter-manager-datasource.xml
│   │       │       │   ├── otter-manager-monitor.xml
│   │       │       │   ├── otter-manager-remote.xml
│   │       │       │   └── otter-manager-service.xml
│   │       │       └── sqlmap/
│   │       │           ├── sqlmap-mapping-alarmRule.xml
│   │       │           ├── sqlmap-mapping-autokeeper.xml
│   │       │           ├── sqlmap-mapping-canal.xml
│   │       │           ├── sqlmap-mapping-channel.xml
│   │       │           ├── sqlmap-mapping-datacolumnpair.xml
│   │       │           ├── sqlmap-mapping-datacolumnpairgroup.xml
│   │       │           ├── sqlmap-mapping-datamatrix.xml
│   │       │           ├── sqlmap-mapping-datamedia.xml
│   │       │           ├── sqlmap-mapping-datamediapair.xml
│   │       │           ├── sqlmap-mapping-datamediasource.xml
│   │       │           ├── sqlmap-mapping-delayStat.xml
│   │       │           ├── sqlmap-mapping-logrecord.xml
│   │       │           ├── sqlmap-mapping-node.xml
│   │       │           ├── sqlmap-mapping-pipeline.xml
│   │       │           ├── sqlmap-mapping-pipelinenoderelation.xml
│   │       │           ├── sqlmap-mapping-systemParameter.xml
│   │       │           ├── sqlmap-mapping-tableHistoryStat.xml
│   │       │           ├── sqlmap-mapping-tableStat.xml
│   │       │           ├── sqlmap-mapping-throughputStat.xml
│   │       │           ├── sqlmap-mapping-user.xml
│   │       │           └── sqlmap.xml
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── alibaba/
│   │           │           └── otter/
│   │           │               └── manager/
│   │           │                   └── biz/
│   │           │                       ├── BaseOtterTest.java
│   │           │                       ├── autokeeper/
│   │           │                       │   └── impl/
│   │           │                       │       └── AutoKeeperCollectorTest.java
│   │           │                       ├── monitor/
│   │           │                       │   ├── AbstractRuleMonitorInPeriodTest.java
│   │           │                       │   ├── AlarmServiceTest.java
│   │           │                       │   ├── ExceptionRuleMonitorTest.java
│   │           │                       │   └── GlobalMonitorTest.java
│   │           │                       └── service/
│   │           │                           ├── NodeSerivceTest.java
│   │           │                           └── PipelineSerivceTest.java
│   │           └── resources/
│   │               └── applicationContext.xml
│   ├── deployer/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── assembly/
│   │           │   ├── component.xml
│   │           │   ├── dev.xml
│   │           │   ├── mvn.xml
│   │           │   └── release.xml
│   │           ├── bin/
│   │           │   ├── startup.bat
│   │           │   ├── startup.sh
│   │           │   └── stop.sh
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── alibaba/
│   │           │           └── otter/
│   │           │               └── manager/
│   │           │                   └── deployer/
│   │           │                       ├── JettyEmbedServer.java
│   │           │                       └── OtterManagerLauncher.java
│   │           └── resources/
│   │               ├── jetty.xml
│   │               ├── logback.xml
│   │               ├── otter.properties
│   │               ├── sql/
│   │               │   └── otter-manager-schema.sql
│   │               └── webapp/
│   │                   ├── META-INF/
│   │                   │   └── MANIFEST.MF
│   │                   ├── WEB-INF/
│   │                   │   ├── applicationContext.xml
│   │                   │   ├── common/
│   │                   │   │   ├── pipeline-exception.xml
│   │                   │   │   ├── pipeline.xml
│   │                   │   │   ├── resources.xml
│   │                   │   │   ├── uris.xml
│   │                   │   │   ├── webx-component-and-root.xml
│   │                   │   │   └── webx-component.xml
│   │                   │   ├── home/
│   │                   │   │   └── form.xml
│   │                   │   ├── web.xml
│   │                   │   ├── webx-home.xml
│   │                   │   └── webx.xml
│   │                   ├── css/
│   │                   │   ├── JSONFormatter.css
│   │                   │   ├── commons.css
│   │                   │   ├── otter.css
│   │                   │   └── skin.css
│   │                   ├── js/
│   │                   │   ├── JSONFormatter.js
│   │                   │   ├── My97DatePicker/
│   │                   │   │   ├── My97DatePicker.html
│   │                   │   │   ├── WdatePicker.js
│   │                   │   │   ├── calendar.js
│   │                   │   │   ├── config.js
│   │                   │   │   ├── lang/
│   │                   │   │   │   ├── en.js
│   │                   │   │   │   ├── zh-cn.js
│   │                   │   │   │   └── zh-tw.js
│   │                   │   │   └── skin/
│   │                   │   │       ├── WdatePicker.css
│   │                   │   │       ├── default/
│   │                   │   │       │   └── datepicker.css
│   │                   │   │       └── whyGreen/
│   │                   │   │           └── datepicker.css
│   │                   │   ├── analysisStatus.js
│   │                   │   ├── dbCheck.js
│   │                   │   ├── flot/
│   │                   │   │   ├── excanvas.js
│   │                   │   │   ├── jquery.colorhelpers.js
│   │                   │   │   ├── jquery.flot.crosshair.js
│   │                   │   │   ├── jquery.flot.fillbetween.js
│   │                   │   │   ├── jquery.flot.image.js
│   │                   │   │   ├── jquery.flot.js
│   │                   │   │   ├── jquery.flot.navigate.js
│   │                   │   │   ├── jquery.flot.pie.js
│   │                   │   │   ├── jquery.flot.resize.js
│   │                   │   │   ├── jquery.flot.selection.js
│   │                   │   │   ├── jquery.flot.stack.js
│   │                   │   │   ├── jquery.flot.symbol.js
│   │                   │   │   ├── jquery.flot.threshold.js
│   │                   │   │   └── jquery.js
│   │                   │   ├── gchartapi.js
│   │                   │   ├── jquery.simplemodal-1.4.js
│   │                   │   ├── nodeCheck.js
│   │                   │   ├── pop.js
│   │                   │   └── trcolor.js
│   │                   └── templates/
│   │                       └── home/
│   │                           ├── control/
│   │                           │   └── navigation.vm
│   │                           ├── layout/
│   │                           │   └── default.vm
│   │                           └── screen/
│   │                               ├── addAlarmRule.vm
│   │                               ├── addBatchDataMediaPair.vm
│   │                               ├── addCanal.vm
│   │                               ├── addChannel.vm
│   │                               ├── addColumnPair.vm
│   │                               ├── addColumnPairGroup.vm
│   │                               ├── addDataMatrix.vm
│   │                               ├── addDataMedia.vm
│   │                               ├── addDataMediaPair.vm
│   │                               ├── addDataSource.vm
│   │                               ├── addNode.vm
│   │                               ├── addPipeline.vm
│   │                               ├── addUser.vm
│   │                               ├── addZookeeper.vm
│   │                               ├── alarmRuleList.vm
│   │                               ├── alarmSystemList.vm
│   │                               ├── analysisDelayStat.vm
│   │                               ├── analysisStageStat.vm
│   │                               ├── analysisThroughputHistory.vm
│   │                               ├── analysisThroughputStat.vm
│   │                               ├── analysisTopStat.vm
│   │                               ├── autoKeeperClientPath.vm
│   │                               ├── autoKeeperClustersDetail.vm
│   │                               ├── autoKeeperClustersList.vm
│   │                               ├── behaviorHistoryCurve.vm
│   │                               ├── canalInfo.vm
│   │                               ├── canalList.vm
│   │                               ├── channelInfo.vm
│   │                               ├── channelList.vm
│   │                               ├── checkDelayStat.vm
│   │                               ├── dataMatrixInfo.vm
│   │                               ├── dataMatrixList.vm
│   │                               ├── dataMediaInfo.vm
│   │                               ├── dataMediaList.vm
│   │                               ├── dataMediaPairInfo.vm
│   │                               ├── dataMediaPairList.vm
│   │                               ├── dataSourceInfo.vm
│   │                               ├── dataSourceList.vm
│   │                               ├── editAlarmRule.vm
│   │                               ├── editAutoKeeper.vm
│   │                               ├── editCanal.vm
│   │                               ├── editChannel.vm
│   │                               ├── editDataMatrix.vm
│   │                               ├── editDataMedia.vm
│   │                               ├── editDataMediaPair.vm
│   │                               ├── editDataSource.vm
│   │                               ├── editNode.vm
│   │                               ├── editParameter.vm
│   │                               ├── editPipeline.vm
│   │                               ├── editUser.vm
│   │                               ├── error.vm
│   │                               ├── forbidden.vm
│   │                               ├── index.vm
│   │                               ├── initSql.vm
│   │                               ├── logRecordList.vm
│   │                               ├── logRecordTab.vm
│   │                               ├── login.vm
│   │                               ├── monitor/
│   │                               │   ├── getNodes.vm
│   │                               │   ├── monitorTrigger.vm
│   │                               │   └── ok.vm
│   │                               ├── nodeInfo.vm
│   │                               ├── nodeList.vm
│   │                               ├── pipelineInfo.vm
│   │                               ├── pipelineList.vm
│   │                               ├── selectCanal.vm
│   │                               ├── selectDataMedia.vm
│   │                               ├── selectDataSource.vm
│   │                               ├── systemParameter.vm
│   │                               ├── systemReduction.vm
│   │                               ├── userManager.vm
│   │                               ├── wikiGuide.vm
│   │                               └── zkError.vm
│   ├── pom.xml
│   └── web/
│       ├── pom.xml
│       └── src/
│           └── main/
│               └── java/
│                   └── com/
│                       └── alibaba/
│                           └── otter/
│                               └── manager/
│                                   └── web/
│                                       ├── common/
│                                       │   ├── CanalExtraParamUtil.java
│                                       │   ├── NumberFormatUtil.java
│                                       │   ├── WebConstant.java
│                                       │   ├── api/
│                                       │   │   ├── ApiAuthService.java
│                                       │   │   ├── DefaultApiAuthService.java
│                                       │   │   └── JsonResult.java
│                                       │   └── model/
│                                       │       ├── SeniorCanal.java
│                                       │       ├── SeniorChannel.java
│                                       │       ├── SeniorDataMatrix.java
│                                       │       ├── SeniorDataMedia.java
│                                       │       ├── SeniorDataMediaPair.java
│                                       │       ├── SeniorDataMediaSource.java
│                                       │       └── SeniorNode.java
│                                       ├── home/
│                                       │   └── module/
│                                       │       ├── action/
│                                       │       │   ├── AbstractAction.java
│                                       │       │   ├── AlarmRuleAction.java
│                                       │       │   ├── AutoKeeperClusterAction.java
│                                       │       │   ├── CanalAction.java
│                                       │       │   ├── ChannelAction.java
│                                       │       │   ├── ColumnPairAction.java
│                                       │       │   ├── ColumnPairGroupAction.java
│                                       │       │   ├── DataMatrixAction.java
│                                       │       │   ├── DataMediaAction.java
│                                       │       │   ├── DataMediaPairAction.java
│                                       │       │   ├── DataMediaSourceAction.java
│                                       │       │   ├── NodeAction.java
│                                       │       │   ├── PipelineAction.java
│                                       │       │   ├── PositionAction.java
│                                       │       │   ├── SwitchWarmupAction.java
│                                       │       │   ├── SystemParameterAction.java
│                                       │       │   └── UserAction.java
│                                       │       └── screen/
│                                       │           ├── AddAlarmRule.java
│                                       │           ├── AddBatchDataMediaPair.java
│                                       │           ├── AddCanal.java
│                                       │           ├── AddColumnPair.java
│                                       │           ├── AddColumnPairGroup.java
│                                       │           ├── AddDataMediaPair.java
│                                       │           ├── AddNode.java
│                                       │           ├── AddPipeline.java
│                                       │           ├── AddZookeeper.java
│                                       │           ├── AlarmRuleList.java
│                                       │           ├── AlarmSystemList.java
│                                       │           ├── AnalysisDelayStat.java
│                                       │           ├── AnalysisStageStat.java
│                                       │           ├── AnalysisThroughputHistory.java
│                                       │           ├── AnalysisThroughputStat.java
│                                       │           ├── AnalysisTopStat.java
│                                       │           ├── AutoKeeperClientPath.java
│                                       │           ├── AutoKeeperClustersDetail.java
│                                       │           ├── AutoKeeperClustersList.java
│                                       │           ├── BehaviorHistoryCurve.java
│                                       │           ├── CanalInfo.java
│                                       │           ├── CanalList.java
│                                       │           ├── ChannelInfo.java
│                                       │           ├── ChannelList.java
│                                       │           ├── CheckDelayStat.java
│                                       │           ├── DataMatrixInfo.java
│                                       │           ├── DataMatrixList.java
│                                       │           ├── DataMediaInfo.java
│                                       │           ├── DataMediaList.java
│                                       │           ├── DataMediaPairInfo.java
│                                       │           ├── DataMediaPairList.java
│                                       │           ├── DataSourceInfo.java
│                                       │           ├── DataSourceList.java
│                                       │           ├── EditAlarmRule.java
│                                       │           ├── EditAutoKeeper.java
│                                       │           ├── EditCanal.java
│                                       │           ├── EditChannel.java
│                                       │           ├── EditDataMatrix.java
│                                       │           ├── EditDataMedia.java
│                                       │           ├── EditDataMediaPair.java
│                                       │           ├── EditDataSource.java
│                                       │           ├── EditNode.java
│                                       │           ├── EditPipeline.java
│                                       │           ├── EditUser.java
│                                       │           ├── LogRecordList.java
│                                       │           ├── LogRecordTab.java
│                                       │           ├── NodeInfo.java
│                                       │           ├── NodeList.java
│                                       │           ├── Ok.java
│                                       │           ├── PipelineInfo.java
│                                       │           ├── PipelineList.java
│                                       │           ├── SelectCanal.java
│                                       │           ├── SelectDataMedia.java
│                                       │           ├── SelectDataSource.java
│                                       │           ├── SystemParameter.java
│                                       │           ├── SystemReduction.java
│                                       │           ├── UserManager.java
│                                       │           ├── api/
│                                       │           │   ├── AbstractJsonScreen.java
│                                       │           │   ├── ChannelCheck.java
│                                       │           │   ├── ChannelOp.java
│                                       │           │   ├── NodeOp.java
│                                       │           │   └── TopDelay.java
│                                       │           └── monitor/
│                                       │               └── MonitorTrigger.java
│                                       └── webx/
│                                           └── valve/
│                                               ├── AuthContextValve.java
│                                               ├── PrepareExceptionValve.java
│                                               └── auth/
│                                                   ├── AuthorizeProtected.java
│                                                   ├── RegExpURLAnalyze.java
│                                                   ├── action/
│                                                   │   ├── ActionPatternHolder.java
│                                                   │   ├── ActionProtected.java
│                                                   │   ├── ActionProtectedEditor.java
│                                                   │   └── ActionProtectedImpl.java
│                                                   └── url/
│                                                       ├── URLPatternHolder.java
│                                                       ├── URLProtected.java
│                                                       ├── URLProtectedEditor.java
│                                                       └── URLProtectedImpl.java
├── node/
│   ├── canal/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── alibaba/
│   │           │           └── otter/
│   │           │               └── canal/
│   │           │                   └── extend/
│   │           │                       ├── communication/
│   │           │                       │   ├── CanalCommmunicationClient.java
│   │           │                       │   └── CanalConfigClient.java
│   │           │                       └── ha/
│   │           │                           ├── AuthenticationInfoUtils.java
│   │           │                           └── MediaHAController.java
│   │           └── resources/
│   │               └── spring/
│   │                   ├── otter-canal-communication.xml
│   │                   └── tsdb/
│   │                       ├── mysql-tsdb.xml
│   │                       └── sql-map/
│   │                           ├── sqlmap-config.xml
│   │                           ├── sqlmap_history.xml
│   │                           └── sqlmap_snapshot.xml
│   ├── common/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── alibaba/
│   │       │   │           └── otter/
│   │       │   │               └── node/
│   │       │   │                   └── common/
│   │       │   │                       ├── communication/
│   │       │   │                       │   ├── NodeCommmunicationClient.java
│   │       │   │                       │   └── NodeCommunicationEndpoint.java
│   │       │   │                       ├── config/
│   │       │   │                       │   ├── ConfigClientService.java
│   │       │   │                       │   ├── NodeTaskListener.java
│   │       │   │                       │   ├── NodeTaskService.java
│   │       │   │                       │   ├── impl/
│   │       │   │                       │   │   ├── ConfigClientServiceImpl.java
│   │       │   │                       │   │   ├── InternalConfigClientService.java
│   │       │   │                       │   │   └── NodeTaskServiceImpl.java
│   │       │   │                       │   └── model/
│   │       │   │                       │       └── NodeTask.java
│   │       │   │                       └── statistics/
│   │       │   │                           ├── StatisticsClientService.java
│   │       │   │                           └── impl/
│   │       │   │                               └── StatisticsClientServiceImpl.java
│   │       │   └── resources/
│   │       │       └── spring/
│   │       │           ├── otter-node-communication.xml
│   │       │           ├── otter-node-config.xml
│   │       │           └── otter-node-statistics.xml
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── alibaba/
│   │           │           └── otter/
│   │           │               └── node/
│   │           │                   └── common/
│   │           │                       ├── ArbitrateRemoteServiceIntegration.java
│   │           │                       ├── BaseOtterTest.java
│   │           │                       ├── config/
│   │           │                       │   ├── ConfigClientServiceIntegration.java
│   │           │                       │   ├── ConfigClientServiceTest.java
│   │           │                       │   ├── NodeTaskServiceIntegration.java
│   │           │                       │   └── NodeTaskServiceTest.java
│   │           │                       └── statistics/
│   │           │                           └── StatisticsClientServiceIntegration.java
│   │           └── resources/
│   │               └── applicationContext.xml
│   ├── deployer/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── assembly/
│   │       │   │   ├── component.xml
│   │       │   │   ├── dev.xml
│   │       │   │   ├── mvn.xml
│   │       │   │   └── release.xml
│   │       │   ├── bin/
│   │       │   │   ├── startup.bat
│   │       │   │   ├── startup.sh
│   │       │   │   └── stop.sh
│   │       │   ├── java/
│   │       │   │   └── com/
│   │       │   │       └── alibaba/
│   │       │   │           └── otter/
│   │       │   │               └── node/
│   │       │   │                   └── deployer/
│   │       │   │                       └── OtterLauncher.java
│   │       │   └── resources/
│   │       │       ├── applicationContext.xml
│   │       │       ├── logback.xml
│   │       │       ├── otter.properties
│   │       │       └── sql/
│   │       │           ├── otter-system-ddl-mysql.sql
│   │       │           └── otter-system-ddl-oracle.sql
│   │       └── test/
│   │           └── java/
│   │               └── com/
│   │                   └── alibaba/
│   │                       └── otter/
│   │                           └── node/
│   │                               └── deployer/
│   │                                   └── OtterLauncherIntegration.java
│   ├── etl/
│   │   ├── pom.xml
│   │   └── src/
│   │       ├── main/
│   │       │   ├── java/
│   │       │   │   ├── Batch.proto
│   │       │   │   ├── com/
│   │       │   │   │   └── alibaba/
│   │       │   │   │       └── otter/
│   │       │   │   │           └── node/
│   │       │   │   │               └── etl/
│   │       │   │   │                   ├── OtterConstants.java
│   │       │   │   │                   ├── OtterContextLocator.java
│   │       │   │   │                   ├── OtterController.java
│   │       │   │   │                   ├── OtterControllerMBean.java
│   │       │   │   │                   ├── common/
│   │       │   │   │                   │   ├── datasource/
│   │       │   │   │                   │   │   ├── DataSourceService.java
│   │       │   │   │                   │   │   └── impl/
│   │       │   │   │                   │   │       └── DBDataSourceService.java
│   │       │   │   │                   │   ├── db/
│   │       │   │   │                   │   │   ├── dialect/
│   │       │   │   │                   │   │   │   ├── AbstractDbDialect.java
│   │       │   │   │                   │   │   │   ├── AbstractSqlTemplate.java
│   │       │   │   │                   │   │   │   ├── DbDialect.java
│   │       │   │   │                   │   │   │   ├── DbDialectFactory.java
│   │       │   │   │                   │   │   │   ├── DbDialectGenerator.java
│   │       │   │   │                   │   │   │   ├── SqlTemplate.java
│   │       │   │   │                   │   │   │   ├── mysql/
│   │       │   │   │                   │   │   │   │   ├── MysqlDialect.java
│   │       │   │   │                   │   │   │   │   └── MysqlSqlTemplate.java
│   │       │   │   │                   │   │   │   └── oracle/
│   │       │   │   │                   │   │   │       ├── OracleDialect.java
│   │       │   │   │                   │   │   │       └── OracleSqlTemplate.java
│   │       │   │   │                   │   │   ├── lob/
│   │       │   │   │                   │   │   │   ├── AutomaticJdbcExtractor.java
│   │       │   │   │                   │   │   │   └── LazyNativeJdbcExtractor.java
│   │       │   │   │                   │   │   └── utils/
│   │       │   │   │                   │   │       ├── ByteArrayConverter.java
│   │       │   │   │                   │   │       ├── DdlUtils.java
│   │       │   │   │                   │   │       ├── SqlTimestampConverter.java
│   │       │   │   │                   │   │       └── SqlUtils.java
│   │       │   │   │                   │   ├── io/
│   │       │   │   │                   │   │   ├── EncryptUtils.java
│   │       │   │   │                   │   │   ├── EncryptedData.java
│   │       │   │   │                   │   │   ├── compress/
│   │       │   │   │                   │   │   │   ├── Compressor.java
│   │       │   │   │                   │   │   │   ├── exception/
│   │       │   │   │                   │   │   │   │   └── CompressException.java
│   │       │   │   │                   │   │   │   └── impl/
│   │       │   │   │                   │   │   │       ├── AbstractCompressor.java
│   │       │   │   │                   │   │   │       ├── PackableObject.java
│   │       │   │   │                   │   │   │       ├── bzip2/
│   │       │   │   │                   │   │   │       │   └── BZip2Compressor.java
│   │       │   │   │                   │   │   │       └── gzip/
│   │       │   │   │                   │   │   │           └── GzipCompressor.java
│   │       │   │   │                   │   │   ├── crypto/
│   │       │   │   │                   │   │   │   ├── AESException.java
│   │       │   │   │                   │   │   │   └── AESUtils.java
│   │       │   │   │                   │   │   ├── download/
│   │       │   │   │                   │   │   │   ├── DataRetriever.java
│   │       │   │   │                   │   │   │   ├── DataRetrieverFactory.java
│   │       │   │   │                   │   │   │   ├── Download.java
│   │       │   │   │                   │   │   │   ├── DownloadStatus.java
│   │       │   │   │                   │   │   │   ├── exception/
│   │       │   │   │                   │   │   │   │   └── DataRetrieveException.java
│   │       │   │   │                   │   │   │   └── impl/
│   │       │   │   │                   │   │   │       ├── AbstractCommandDownload.java
│   │       │   │   │                   │   │   │       ├── AbstractCommandRetriever.java
│   │       │   │   │                   │   │   │       ├── FileRetriever.java
│   │       │   │   │                   │   │   │       ├── aria2c/
│   │       │   │   │                   │   │   │       │   ├── Aria2cConfig.java
│   │       │   │   │                   │   │   │       │   ├── Aria2cDownload.java
│   │       │   │   │                   │   │   │       │   ├── Aria2cRetriever.java
│   │       │   │   │                   │   │   │       │   └── Aria2cStat.java
│   │       │   │   │                   │   │   │       └── observer/
│   │       │   │   │                   │   │   │           ├── DefaultExceptionObserver.java
│   │       │   │   │                   │   │   │           ├── DefaultProgressObserver.java
│   │       │   │   │                   │   │   │           ├── DefaultStatusObserver.java
│   │       │   │   │                   │   │   │           ├── ExceptionObserver.java
│   │       │   │   │                   │   │   │           ├── ProgressObserver.java
│   │       │   │   │                   │   │   │           └── StatusObserver.java
│   │       │   │   │                   │   │   └── signature/
│   │       │   │   │                   │   │       ├── ChecksumException.java
│   │       │   │   │                   │   │       ├── ChecksumUtils.java
│   │       │   │   │                   │   │       └── Crc32C.java
│   │       │   │   │                   │   ├── jetty/
│   │       │   │   │                   │   │   └── JettyEmbedServer.java
│   │       │   │   │                   │   ├── jmx/
│   │       │   │   │                   │   │   ├── JmxConnectorServerFactoryBean.java
│   │       │   │   │                   │   │   ├── StageAggregation.java
│   │       │   │   │                   │   │   └── StageAggregationCollector.java
│   │       │   │   │                   │   ├── pipe/
│   │       │   │   │                   │   │   ├── Pipe.java
│   │       │   │   │                   │   │   ├── PipeDataType.java
│   │       │   │   │                   │   │   ├── PipeKey.java
│   │       │   │   │                   │   │   ├── exception/
│   │       │   │   │                   │   │   │   └── PipeException.java
│   │       │   │   │                   │   │   └── impl/
│   │       │   │   │                   │   │       ├── RowDataPipeDelegate.java
│   │       │   │   │                   │   │       ├── http/
│   │       │   │   │                   │   │       │   ├── AbstractHttpPipe.java
│   │       │   │   │                   │   │       │   ├── AttachmentHttpPipe.java
│   │       │   │   │                   │   │       │   ├── HttpPipeKey.java
│   │       │   │   │                   │   │       │   ├── LimitedInputStream.java
│   │       │   │   │                   │   │       │   ├── RemoteUrlBuilder.java
│   │       │   │   │                   │   │       │   ├── RowDataHttpPipe.java
│   │       │   │   │                   │   │       │   └── archive/
│   │       │   │   │                   │   │       │       ├── ArchiveBean.java
│   │       │   │   │                   │   │       │       ├── ArchiveException.java
│   │       │   │   │                   │   │       │       ├── ArchiveRetriverCallback.java
│   │       │   │   │                   │   │       │       └── LazyFileInputStream.java
│   │       │   │   │                   │   │       ├── memory/
│   │       │   │   │                   │   │       │   ├── AbstractMemoryPipe.java
│   │       │   │   │                   │   │       │   ├── MemoryPipeKey.java
│   │       │   │   │                   │   │       │   └── RowDataMemoryPipe.java
│   │       │   │   │                   │   │       └── rpc/
│   │       │   │   │                   │   │           ├── AbstractRpcPipe.java
│   │       │   │   │                   │   │           ├── RowDataRpcPipe.java
│   │       │   │   │                   │   │           └── RpcPipeKey.java
│   │       │   │   │                   │   └── task/
│   │       │   │   │                   │       └── GlobalTask.java
│   │       │   │   │                   ├── conflict/
│   │       │   │   │                   │   ├── FileBatchConflictDetectService.java
│   │       │   │   │                   │   ├── exception/
│   │       │   │   │                   │   │   └── ConflictException.java
│   │       │   │   │                   │   ├── impl/
│   │       │   │   │                   │   │   └── FileBatchConflictDetectServiceImpl.java
│   │       │   │   │                   │   └── model/
│   │       │   │   │                   │       ├── ConflictEventType.java
│   │       │   │   │                   │       └── FileConflictDetectEvent.java
│   │       │   │   │                   ├── extract/
│   │       │   │   │                   │   ├── ExtractTask.java
│   │       │   │   │                   │   ├── SetlFuture.java
│   │       │   │   │                   │   ├── exceptions/
│   │       │   │   │                   │   │   └── ExtractException.java
│   │       │   │   │                   │   └── extractor/
│   │       │   │   │                   │       ├── AbstractExtractor.java
│   │       │   │   │                   │       ├── DatabaseExtractor.java
│   │       │   │   │                   │       ├── FileExtractor.java
│   │       │   │   │                   │       ├── FreedomExtractor.java
│   │       │   │   │                   │       ├── GroupExtractor.java
│   │       │   │   │                   │       ├── OtterExtractor.java
│   │       │   │   │                   │       ├── OtterExtractorFactory.java
│   │       │   │   │                   │       ├── ProcessorExtractor.java
│   │       │   │   │                   │       └── ViewExtractor.java
│   │       │   │   │                   ├── load/
│   │       │   │   │                   │   ├── LoadTask.java
│   │       │   │   │                   │   ├── exception/
│   │       │   │   │                   │   │   └── LoadException.java
│   │       │   │   │                   │   └── loader/
│   │       │   │   │                   │       ├── AbstractLoadContext.java
│   │       │   │   │                   │       ├── LoadContext.java
│   │       │   │   │                   │       ├── LoadStatsTracker.java
│   │       │   │   │                   │       ├── OtterLoader.java
│   │       │   │   │                   │       ├── OtterLoaderFactory.java
│   │       │   │   │                   │       ├── db/
│   │       │   │   │                   │       │   ├── DataBatchLoader.java
│   │       │   │   │                   │       │   ├── DbLoadAction.java
│   │       │   │   │                   │       │   ├── DbLoadData.java
│   │       │   │   │                   │       │   ├── DbLoadDumper.java
│   │       │   │   │                   │       │   ├── DbLoadMerger.java
│   │       │   │   │                   │       │   ├── FileLoadAction.java
│   │       │   │   │                   │       │   ├── FileloadDumper.java
│   │       │   │   │                   │       │   ├── context/
│   │       │   │   │                   │       │   │   ├── DbLoadContext.java
│   │       │   │   │                   │       │   │   └── FileLoadContext.java
│   │       │   │   │                   │       │   └── interceptor/
│   │       │   │   │                   │       │       ├── log/
│   │       │   │   │                   │       │       │   └── LogLoadInterceptor.java
│   │       │   │   │                   │       │       ├── operation/
│   │       │   │   │                   │       │       │   ├── AbstractOperationInterceptor.java
│   │       │   │   │                   │       │       │   ├── CanalMysqlInterceptor.java
│   │       │   │   │                   │       │       │   ├── CanalOracleInterceptor.java
│   │       │   │   │                   │       │       │   └── OperationInterceptorFactory.java
│   │       │   │   │                   │       │       └── sql/
│   │       │   │   │                   │       │           └── SqlBuilderLoadInterceptor.java
│   │       │   │   │                   │       ├── interceptor/
│   │       │   │   │                   │       │   ├── AbstractLoadInterceptor.java
│   │       │   │   │                   │       │   ├── ChainLoadInterceptor.java
│   │       │   │   │                   │       │   └── LoadInterceptor.java
│   │       │   │   │                   │       └── weight/
│   │       │   │   │                   │           ├── WeightBarrier.java
│   │       │   │   │                   │           ├── WeightBuckets.java
│   │       │   │   │                   │           └── WeightController.java
│   │       │   │   │                   ├── model/
│   │       │   │   │                   │   └── protobuf/
│   │       │   │   │                   │       └── BatchProto.java
│   │       │   │   │                   ├── select/
│   │       │   │   │                   │   ├── SelectTask.java
│   │       │   │   │                   │   ├── exceptions/
│   │       │   │   │                   │   │   └── SelectException.java
│   │       │   │   │                   │   └── selector/
│   │       │   │   │                   │       ├── Message.java
│   │       │   │   │                   │       ├── MessageDumper.java
│   │       │   │   │                   │       ├── MessageParser.java
│   │       │   │   │                   │       ├── OtterSelector.java
│   │       │   │   │                   │       ├── OtterSelectorFactory.java
│   │       │   │   │                   │       └── canal/
│   │       │   │   │                   │           ├── CanalEmbedSelector.java
│   │       │   │   │                   │           ├── CanalFilterSupport.java
│   │       │   │   │                   │           ├── OtterAlarmHandler.java
│   │       │   │   │                   │           └── OtterDownStreamHandler.java
│   │       │   │   │                   └── transform/
│   │       │   │   │                       ├── TransformTask.java
│   │       │   │   │                       ├── exception/
│   │       │   │   │                       │   └── TransformException.java
│   │       │   │   │                       └── transformer/
│   │       │   │   │                           ├── AbstractOtterTransformer.java
│   │       │   │   │                           ├── FileDataTransformer.java
│   │       │   │   │                           ├── OtterTransformer.java
│   │       │   │   │                           ├── OtterTransformerContext.java
│   │       │   │   │                           ├── OtterTransformerFactory.java
│   │       │   │   │                           └── RowDataTransformer.java
│   │       │   │   └── protocol.txt
│   │       │   └── resources/
│   │       │       ├── jetty/
│   │       │       │   └── jetty.xml
│   │       │       └── spring/
│   │       │           ├── otter-node-common.xml
│   │       │           ├── otter-node-conflict.xml
│   │       │           ├── otter-node-database.xml
│   │       │           ├── otter-node-extension.xml
│   │       │           ├── otter-node-extract.xml
│   │       │           ├── otter-node-jmx.xml
│   │       │           ├── otter-node-load.xml
│   │       │           ├── otter-node-pipe.xml
│   │       │           ├── otter-node-select.xml
│   │       │           └── otter-node-transform.xml
│   │       └── test/
│   │           ├── java/
│   │           │   └── com/
│   │           │       └── alibaba/
│   │           │           └── otter/
│   │           │               └── node/
│   │           │                   └── etl/
│   │           │                       ├── ArbitrateRemoteServiceIntegration.java
│   │           │                       ├── BaseDbTest.java
│   │           │                       ├── BaseOtterTest.java
│   │           │                       ├── SqlUtilsTest.java
│   │           │                       ├── TestUtils.java
│   │           │                       ├── common/
│   │           │                       │   ├── datasource/
│   │           │                       │   │   ├── AbstractDbDialectTest.java
│   │           │                       │   │   ├── TestMysqlUnsignedInt.java
│   │           │                       │   │   └── TestMysqlUnsignedNumber.java
│   │           │                       │   ├── db/
│   │           │                       │   │   ├── BitTableIntegration.java
│   │           │                       │   │   ├── DbDialectIntegration.java
│   │           │                       │   │   ├── DbDialectTableTest.java
│   │           │                       │   │   ├── DbDialectTest.java
│   │           │                       │   │   ├── DbPerfIntergration.java
│   │           │                       │   │   ├── DdlUtilsTest.java
│   │           │                       │   │   ├── SqlTemplateTest.java
│   │           │                       │   │   └── TimeTableIntegration.java
│   │           │                       │   ├── io/
│   │           │                       │   │   ├── AESUtilsTest.java
│   │           │                       │   │   ├── ArchiveBeanIntegration.java
│   │           │                       │   │   ├── ArchiveBeanTest.java
│   │           │                       │   │   ├── Aria2cDownLoadIntegration.java
│   │           │                       │   │   ├── ChecksumUtilsTest.java
│   │           │                       │   │   └── CompressorTest.java
│   │           │                       │   ├── jetty/
│   │           │                       │   │   └── JettyEmbedIntegration.java
│   │           │                       │   ├── jmx/
│   │           │                       │   │   ├── JmxLoaderIntegration.java
│   │           │                       │   │   └── StageAggregationTest.java
│   │           │                       │   └── pipe/
│   │           │                       │       ├── HttpPipeIntegration.java
│   │           │                       │       ├── MemoryPipeTest.java
│   │           │                       │       └── RpcPipeTest.java
│   │           │                       ├── conflict/
│   │           │                       │   └── FileBatchConflictDetectServiceIntegration.java
│   │           │                       ├── extract/
│   │           │                       │   ├── DatabaseExtractorTest.java
│   │           │                       │   ├── EventProcessorFactoryIntegration.java
│   │           │                       │   └── FreedomExtractorTest.java
│   │           │                       ├── launcher/
│   │           │                       │   ├── ArbitrateInitIntegration.java
│   │           │                       │   └── OtterLoaderFactoryIntegration.java
│   │           │                       ├── load/
│   │           │                       │   ├── DbLoadActionTest.java
│   │           │                       │   ├── DbLoadMergerTest.java
│   │           │                       │   ├── FileLoadActionTest.java
│   │           │                       │   ├── LocalFileLoaderActionTest.java
│   │           │                       │   ├── WeightBarrierTest.java
│   │           │                       │   ├── WeightBucketTest.java
│   │           │                       │   └── WeightControllerTest.java
│   │           │                       ├── select/
│   │           │                       │   ├── CanalClientIntegration.java
│   │           │                       │   └── OtterDownStreamHandlerIntergration.java
│   │           │                       └── transform/
│   │           │                           └── OtterTransformerTest.java
│   │           └── resources/
│   │               ├── applicationContext.xml
│   │               ├── compress/
│   │               │   └── geo.protodata
│   │               └── sql/
│   │                   ├── mysql_init.sql
│   │                   └── oracle_init.sql
│   ├── extend/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── alibaba/
│   │                       └── otter/
│   │                           └── node/
│   │                               └── extend/
│   │                                   ├── fileresolver/
│   │                                   │   ├── AbstractFileResolver.java
│   │                                   │   └── TestFileResolver.java
│   │                                   └── processor/
│   │                                       ├── AbstractEventProcessor.java
│   │                                       ├── HintEventProcessor.java
│   │                                       └── TestEventProcessor.java
│   └── pom.xml
├── pom.xml
└── shared/
    ├── arbitrate/
    │   ├── pom.xml
    │   └── src/
    │       ├── main/
    │       │   ├── java/
    │       │   │   └── com/
    │       │   │       └── alibaba/
    │       │   │           └── otter/
    │       │   │               └── shared/
    │       │   │                   └── arbitrate/
    │       │   │                       ├── ArbitrateEventService.java
    │       │   │                       ├── ArbitrateManageService.java
    │       │   │                       ├── ArbitrateViewService.java
    │       │   │                       ├── exception/
    │       │   │                       │   └── ArbitrateException.java
    │       │   │                       ├── impl/
    │       │   │                       │   ├── ArbitrateConstants.java
    │       │   │                       │   ├── ArbitrateEvent.java
    │       │   │                       │   ├── ArbitrateEventServiceImpl.java
    │       │   │                       │   ├── ArbitrateManageServiceImpl.java
    │       │   │                       │   ├── ArbitrateViewServiceImpl.java
    │       │   │                       │   ├── alarm/
    │       │   │                       │   │   └── AlarmClientService.java
    │       │   │                       │   ├── communication/
    │       │   │                       │   │   └── ArbitrateCommmunicationClient.java
    │       │   │                       │   ├── config/
    │       │   │                       │   │   ├── ArbitrateConfig.java
    │       │   │                       │   │   ├── ArbitrateConfigRegistry.java
    │       │   │                       │   │   └── ArbitrateConfigUtils.java
    │       │   │                       │   ├── interceptor/
    │       │   │                       │   │   └── LogInterceptor.java
    │       │   │                       │   ├── manage/
    │       │   │                       │   │   ├── ChannelArbitrateEvent.java
    │       │   │                       │   │   ├── NodeArbitrateEvent.java
    │       │   │                       │   │   ├── NodeSessionExpired.java
    │       │   │                       │   │   ├── PipelineArbitrateEvent.java
    │       │   │                       │   │   ├── SystemArbitrateEvent.java
    │       │   │                       │   │   └── helper/
    │       │   │                       │   │       └── ManagePathUtils.java
    │       │   │                       │   ├── setl/
    │       │   │                       │   │   ├── ArbitrateFactory.java
    │       │   │                       │   │   ├── ArbitrateLifeCycle.java
    │       │   │                       │   │   ├── ExtractArbitrateEvent.java
    │       │   │                       │   │   ├── LoadArbitrateEvent.java
    │       │   │                       │   │   ├── MainStemArbitrateEvent.java
    │       │   │                       │   │   ├── SelectArbitrateEvent.java
    │       │   │                       │   │   ├── TerminArbitrateEvent.java
    │       │   │                       │   │   ├── ToolArbitrateEvent.java
    │       │   │                       │   │   ├── TransformArbitrateEvent.java
    │       │   │                       │   │   ├── delegate/
    │       │   │                       │   │   │   ├── AbstractDelegateArbitrateEvent.java
    │       │   │                       │   │   │   ├── ExtractDelegateArbitrateEvent.java
    │       │   │                       │   │   │   ├── LoadDelegateArbitrateEvent.java
    │       │   │                       │   │   │   ├── SelectDelegateArbitrateEvent.java
    │       │   │                       │   │   │   ├── TerminDelegateArbitrateEvent.java
    │       │   │                       │   │   │   └── TransformDelegateArbitrateEvent.java
    │       │   │                       │   │   ├── fastrpc/
    │       │   │                       │   │   │   ├── FastRpcStageController.java
    │       │   │                       │   │   │   └── FastRpcStageEventDispatcher.java
    │       │   │                       │   │   ├── helper/
    │       │   │                       │   │   │   ├── RemedyIndexComparator.java
    │       │   │                       │   │   │   ├── ReplyProcessQueue.java
    │       │   │                       │   │   │   ├── StageComparator.java
    │       │   │                       │   │   │   ├── StagePathUtils.java
    │       │   │                       │   │   │   ├── StageProgress.java
    │       │   │                       │   │   │   └── TerminProcessQueue.java
    │       │   │                       │   │   ├── lb/
    │       │   │                       │   │   │   ├── AbstractLoadBalance.java
    │       │   │                       │   │   │   ├── ExtractRandomLoadBanlance.java
    │       │   │                       │   │   │   ├── ExtractRoundRobinLoadBalance.java
    │       │   │                       │   │   │   ├── ExtractStickLoadBalance.java
    │       │   │                       │   │   │   ├── LoadBalance.java
    │       │   │                       │   │   │   ├── LoadBalanceFactory.java
    │       │   │                       │   │   │   ├── RandomLoadBalance.java
    │       │   │                       │   │   │   ├── RoundRobinLoadBalance.java
    │       │   │                       │   │   │   ├── StickLoadBalance.java
    │       │   │                       │   │   │   ├── TransformRandomLoadBanlance.java
    │       │   │                       │   │   │   ├── TransformRoundRobinLoadBalance.java
    │       │   │                       │   │   │   └── TransformStickLoadBalance.java
    │       │   │                       │   │   ├── memory/
    │       │   │                       │   │   │   ├── ExtractMemoryArbitrateEvent.java
    │       │   │                       │   │   │   ├── LoadMemoryArbitrateEvent.java
    │       │   │                       │   │   │   ├── MemoryStageController.java
    │       │   │                       │   │   │   ├── SelectMemoryArbitrateEvent.java
    │       │   │                       │   │   │   ├── TerminMemoryArbitrateEvent.java
    │       │   │                       │   │   │   └── TransformMemoryArbitrateEvent.java
    │       │   │                       │   │   ├── monitor/
    │       │   │                       │   │   │   ├── MainstemMonitor.java
    │       │   │                       │   │   │   ├── Monitor.java
    │       │   │                       │   │   │   ├── MonitorScheduler.java
    │       │   │                       │   │   │   ├── NodeMonitor.java
    │       │   │                       │   │   │   ├── PermitMonitor.java
    │       │   │                       │   │   │   ├── TerminMonitor.java
    │       │   │                       │   │   │   └── listener/
    │       │   │                       │   │   │       ├── MainstemListener.java
    │       │   │                       │   │   │       ├── NodeListener.java
    │       │   │                       │   │   │       └── PermitListener.java
    │       │   │                       │   │   ├── rpc/
    │       │   │                       │   │   │   ├── ExtractRpcArbitrateEvent.java
    │       │   │                       │   │   │   ├── LoadRpcArbitrateEvent.java
    │       │   │                       │   │   │   ├── RpcStageController.java
    │       │   │                       │   │   │   ├── RpcStageEventDispatcher.java
    │       │   │                       │   │   │   ├── SelectRpcArbitrateEvent.java
    │       │   │                       │   │   │   ├── TerminExecutor.java
    │       │   │                       │   │   │   ├── TerminRpcArbitrateEvent.java
    │       │   │                       │   │   │   ├── TransformRpcArbitrateEvent.java
    │       │   │                       │   │   │   └── monitor/
    │       │   │                       │   │   │       ├── AbstractProcessListener.java
    │       │   │                       │   │   │       ├── ProcessListener.java
    │       │   │                       │   │   │       ├── ProcessMonitor.java
    │       │   │                       │   │   │       └── SelectProcessListener.java
    │       │   │                       │   │   └── zookeeper/
    │       │   │                       │   │       ├── ExtractZooKeeperArbitrateEvent.java
    │       │   │                       │   │       ├── LoadZooKeeperArbitrateEvent.java
    │       │   │                       │   │       ├── SelectZooKeeperArbitrateEvent.java
    │       │   │                       │   │       ├── TerminZooKeeperArbitrateEvent.java
    │       │   │                       │   │       ├── TransformZooKeeperArbitrateEvent.java
    │       │   │                       │   │       ├── monitor/
    │       │   │                       │   │       │   ├── AbstractStageListener.java
    │       │   │                       │   │       │   ├── ExtractStageListener.java
    │       │   │                       │   │       │   ├── LoadStageListener.java
    │       │   │                       │   │       │   ├── SelectStageListener.java
    │       │   │                       │   │       │   ├── StageListener.java
    │       │   │                       │   │       │   ├── StageMonitor.java
    │       │   │                       │   │       │   └── TransformStageListener.java
    │       │   │                       │   │       └── termin/
    │       │   │                       │   │           ├── ErrorTerminProcess.java
    │       │   │                       │   │           ├── NormalTerminProcess.java
    │       │   │                       │   │           ├── TerminProcess.java
    │       │   │                       │   │           └── WarningTerminProcess.java
    │       │   │                       │   └── zookeeper/
    │       │   │                       │       ├── AsyncWatcher.java
    │       │   │                       │       ├── SessionExpiredNotification.java
    │       │   │                       │       ├── ZooKeeperClient.java
    │       │   │                       │       ├── ZooKeeperHeartBeatWorker.java
    │       │   │                       │       ├── ZooKeeperOperation.java
    │       │   │                       │       ├── ZooKeeperx.java
    │       │   │                       │       └── lock/
    │       │   │                       │           ├── DistributedLock.java
    │       │   │                       │           ├── DistributedReentrantLock.java
    │       │   │                       │           └── LockNode.java
    │       │   │                       └── model/
    │       │   │                           ├── EtlEventData.java
    │       │   │                           ├── EventData.java
    │       │   │                           ├── MainStemEventData.java
    │       │   │                           ├── PipelineEventData.java
    │       │   │                           ├── PositionEventData.java
    │       │   │                           ├── ProcessEventData.java
    │       │   │                           ├── ProcessNodeEventData.java
    │       │   │                           ├── RemedyIndexEventData.java
    │       │   │                           ├── SyncStatusEventData.java
    │       │   │                           └── TerminEventData.java
    │       │   └── resources/
    │       │       └── spring/
    │       │           ├── otter-arbitrate-alarm.xml
    │       │           ├── otter-arbitrate-common.xml
    │       │           ├── otter-arbitrate-communication.xml
    │       │           ├── otter-arbitrate-event.xml
    │       │           ├── otter-arbitrate-log.xml
    │       │           └── otter-arbitrate-manage.xml
    │       └── test/
    │           ├── java/
    │           │   └── com/
    │           │       └── alibaba/
    │           │           └── otter/
    │           │               └── shared/
    │           │                   └── arbitrate/
    │           │                       ├── BaseEventTest.java
    │           │                       ├── BaseOtterTest.java
    │           │                       ├── demo/
    │           │                       │   ├── ArbitrateAllTest.java
    │           │                       │   ├── multi/
    │           │                       │   │   ├── ArbitrateForwardIntegration.java
    │           │                       │   │   ├── ArbitrateOppositeIntegration.java
    │           │                       │   │   └── ChannelArbitrateEventIntegration.java
    │           │                       │   └── servcie/
    │           │                       │       ├── ExtractServiceDemo.java
    │           │                       │       ├── LoadServiceDemo.java
    │           │                       │       ├── MainStemServiceDemo.java
    │           │                       │       ├── PipelineLifeCycle.java
    │           │                       │       ├── ProcessViewDemo.java
    │           │                       │       ├── SelectServiceDemo.java
    │           │                       │       ├── TerminProcessDemo.java
    │           │                       │       └── TransformServiceDemo.java
    │           │                       ├── manage/
    │           │                       │   ├── ArbitrateViewServiceTest.java
    │           │                       │   ├── ChannelArbitrateEventTest.java
    │           │                       │   ├── NodeArbitrateEventTest.java
    │           │                       │   └── PipelineArbitrateEventTest.java
    │           │                       ├── setl/
    │           │                       │   ├── BaseStageTest.java
    │           │                       │   ├── event/
    │           │                       │   │   ├── BaseArbitrateEventTest.java
    │           │                       │   │   ├── MainStemArbitrateEventTest.java
    │           │                       │   │   ├── ToolArbitrateEventTest.java
    │           │                       │   │   ├── memory/
    │           │                       │   │   │   ├── MemoryArbitrateEventTest.java
    │           │                       │   │   │   └── TerminMemoryArbitrateEventTest.java
    │           │                       │   │   ├── rpc/
    │           │                       │   │   │   └── RpcArbitrateEventTest.java
    │           │                       │   │   └── zookeeper/
    │           │                       │   │       ├── ExtractArbitrateEventTest.java
    │           │                       │   │       ├── LoadArbitrateEventTest.java
    │           │                       │   │       ├── SelectArbitrateEventTest.java
    │           │                       │   │       ├── TerminArbitrateEventTest.java
    │           │                       │   │       └── TransformArbitrateEventTest.java
    │           │                       │   ├── lb/
    │           │                       │   │   ├── BaseLoadBalanceTest.java
    │           │                       │   │   ├── RandomLoadBalanceTest.java
    │           │                       │   │   └── RoundRobinBalanceTest.java
    │           │                       │   └── monitor/
    │           │                       │       ├── MainStemMonitorTest.java
    │           │                       │       ├── PermitMonitorTest.java
    │           │                       │       ├── ProcessMonitorTest.java
    │           │                       │       ├── TerminMonitorTest.java
    │           │                       │       ├── node/
    │           │                       │       │   └── NodeMonitorTest.java
    │           │                       │       └── stage/
    │           │                       │           ├── ExtractStageListenerTest.java
    │           │                       │           ├── LoadStageListenerTest.java
    │           │                       │           ├── SelectStageListenerTest.java
    │           │                       │           ├── StageMonitorTest.java
    │           │                       │           └── TransformStageListenerTest.java
    │           │                       └── zookeeper/
    │           │                           ├── DistributedLockTest.java
    │           │                           ├── DistributedReentrantLockTest.java
    │           │                           ├── ZooKeeperCleanerIntegration.java
    │           │                           └── ZooKeeperClientTest.java
    │           └── resources/
    │               └── applicationContext.xml
    ├── common/
    │   ├── pom.xml
    │   └── src/
    │       ├── main/
    │       │   ├── java/
    │       │   │   └── com/
    │       │   │       ├── alibaba/
    │       │   │       │   └── otter/
    │       │   │       │       └── shared/
    │       │   │       │           └── common/
    │       │   │       │               ├── model/
    │       │   │       │               │   ├── autokeeper/
    │       │   │       │               │   │   ├── AutoKeeperCluster.java
    │       │   │       │               │   │   ├── AutoKeeperConnectionStat.java
    │       │   │       │               │   │   ├── AutoKeeperEphemeralStat.java
    │       │   │       │               │   │   ├── AutoKeeperQuorumType.java
    │       │   │       │               │   │   ├── AutoKeeperServerStat.java
    │       │   │       │               │   │   ├── AutoKeeperStat.java
    │       │   │       │               │   │   ├── AutoKeeperStateStat.java
    │       │   │       │               │   │   └── AutoKeeperWatchStat.java
    │       │   │       │               │   ├── config/
    │       │   │       │               │   │   ├── ConfigException.java
    │       │   │       │               │   │   ├── ConfigHelper.java
    │       │   │       │               │   │   ├── ModeValueFilter.java
    │       │   │       │               │   │   ├── Transient.java
    │       │   │       │               │   │   ├── alarm/
    │       │   │       │               │   │   │   ├── AlarmRule.java
    │       │   │       │               │   │   │   ├── AlarmRuleStatus.java
    │       │   │       │               │   │   │   └── MonitorName.java
    │       │   │       │               │   │   ├── channel/
    │       │   │       │               │   │   │   ├── Channel.java
    │       │   │       │               │   │   │   ├── ChannelParameter.java
    │       │   │       │               │   │   │   └── ChannelStatus.java
    │       │   │       │               │   │   ├── data/
    │       │   │       │               │   │   │   ├── Column.java
    │       │   │       │               │   │   │   ├── ColumnGroup.java
    │       │   │       │               │   │   │   ├── ColumnPair.java
    │       │   │       │               │   │   │   ├── ColumnPairMode.java
    │       │   │       │               │   │   │   ├── DataMatrix.java
    │       │   │       │               │   │   │   ├── DataMedia.java
    │       │   │       │               │   │   │   ├── DataMediaPair.java
    │       │   │       │               │   │   │   ├── DataMediaPairComparable.java
    │       │   │       │               │   │   │   ├── DataMediaSource.java
    │       │   │       │               │   │   │   ├── DataMediaType.java
    │       │   │       │               │   │   │   ├── ExtensionData.java
    │       │   │       │               │   │   │   ├── ExtensionDataType.java
    │       │   │       │               │   │   │   ├── db/
    │       │   │       │               │   │   │   │   ├── DbDataMedia.java
    │       │   │       │               │   │   │   │   └── DbMediaSource.java
    │       │   │       │               │   │   │   └── mq/
    │       │   │       │               │   │   │       ├── MqDataMedia.java
    │       │   │       │               │   │   │       └── MqMediaSource.java
    │       │   │       │               │   │   ├── enums/
    │       │   │       │               │   │   │   ├── AreaType.java
    │       │   │       │               │   │   │   └── StageType.java
    │       │   │       │               │   │   ├── node/
    │       │   │       │               │   │   │   ├── Node.java
    │       │   │       │               │   │   │   ├── NodeParameter.java
    │       │   │       │               │   │   │   └── NodeStatus.java
    │       │   │       │               │   │   ├── parameter/
    │       │   │       │               │   │   │   ├── Parameter.java
    │       │   │       │               │   │   │   └── SystemParameter.java
    │       │   │       │               │   │   ├── pipeline/
    │       │   │       │               │   │   │   ├── Pipeline.java
    │       │   │       │               │   │   │   └── PipelineParameter.java
    │       │   │       │               │   │   └── record/
    │       │   │       │               │   │       └── LogRecord.java
    │       │   │       │               │   ├── statistics/
    │       │   │       │               │   │   ├── delay/
    │       │   │       │               │   │   │   ├── DelayCount.java
    │       │   │       │               │   │   │   └── DelayStat.java
    │       │   │       │               │   │   ├── stage/
    │       │   │       │               │   │   │   ├── ProcessStat.java
    │       │   │       │               │   │   │   └── StageStat.java
    │       │   │       │               │   │   ├── table/
    │       │   │       │               │   │   │   └── TableStat.java
    │       │   │       │               │   │   └── throughput/
    │       │   │       │               │   │       ├── ThroughputStat.java
    │       │   │       │               │   │       └── ThroughputType.java
    │       │   │       │               │   └── user/
    │       │   │       │               │       ├── AuthorizeType.java
    │       │   │       │               │       └── User.java
    │       │   │       │               └── utils/
    │       │   │       │                   ├── AddressUtils.java
    │       │   │       │                   ├── Assert.java
    │       │   │       │                   ├── ByteUtils.java
    │       │   │       │                   ├── JsonUtils.java
    │       │   │       │                   ├── NioUtils.java
    │       │   │       │                   ├── OtterToStringStyle.java
    │       │   │       │                   ├── RegexUtils.java
    │       │   │       │                   ├── SecurityUtils.java
    │       │   │       │                   ├── TestUtils.java
    │       │   │       │                   ├── cache/
    │       │   │       │                   │   ├── ExtensionMemoryMirror.java
    │       │   │       │                   │   └── RefreshMemoryMirror.java
    │       │   │       │                   ├── cmd/
    │       │   │       │                   │   ├── Exec.java
    │       │   │       │                   │   ├── StreamAppender.java
    │       │   │       │                   │   ├── StreamCollector.java
    │       │   │       │                   │   └── StreamCopier.java
    │       │   │       │                   ├── code/
    │       │   │       │                   │   ├── Code.java
    │       │   │       │                   │   └── ResourceBundleUtil.java
    │       │   │       │                   ├── compile/
    │       │   │       │                   │   ├── JavaSourceCompiler.java
    │       │   │       │                   │   ├── exception/
    │       │   │       │                   │   │   ├── CompileExprException.java
    │       │   │       │                   │   │   └── JdkCompileException.java
    │       │   │       │                   │   ├── impl/
    │       │   │       │                   │   │   ├── JdkCompileTask.java
    │       │   │       │                   │   │   └── JdkCompiler.java
    │       │   │       │                   │   └── model/
    │       │   │       │                   │       ├── JavaFileManagerImpl.java
    │       │   │       │                   │       ├── JavaFileObjectImpl.java
    │       │   │       │                   │       ├── JavaSource.java
    │       │   │       │                   │       └── JdkCompilerClassLoader.java
    │       │   │       │                   ├── extension/
    │       │   │       │                   │   ├── DefaultExtensionFactory.java
    │       │   │       │                   │   ├── ExtensionFactory.java
    │       │   │       │                   │   ├── classpath/
    │       │   │       │                   │   │   ├── ClassFilter.java
    │       │   │       │                   │   │   ├── ClassNameUtils.java
    │       │   │       │                   │   │   ├── ClassScanner.java
    │       │   │       │                   │   │   ├── ClasspathClassScanner.java
    │       │   │       │                   │   │   ├── FileSystemClassLoader.java
    │       │   │       │                   │   │   └── FileSystemClassScanner.java
    │       │   │       │                   │   └── exceptions/
    │       │   │       │                   │       └── ExtensionLoadException.java
    │       │   │       │                   ├── lock/
    │       │   │       │                   │   └── BooleanMutex.java
    │       │   │       │                   ├── meta/
    │       │   │       │                   │   ├── DdlSchemaFilter.java
    │       │   │       │                   │   ├── DdlTableNameFilter.java
    │       │   │       │                   │   ├── DdlUtils.java
    │       │   │       │                   │   ├── DdlUtilsFilter.java
    │       │   │       │                   │   └── TableType.java
    │       │   │       │                   ├── sizeof/
    │       │   │       │                   │   ├── NaiveSizeOf.java
    │       │   │       │                   │   └── ObjectProfiler.java
    │       │   │       │                   ├── spring/
    │       │   │       │                   │   └── PropertyPlaceholderConfigurer.java
    │       │   │       │                   ├── test/
    │       │   │       │                   │   └── JTesterxClassPathXmlApplicationContext.java
    │       │   │       │                   ├── thread/
    │       │   │       │                   │   ├── ExecutorServiceFactoryBean.java
    │       │   │       │                   │   ├── ExecutorTemplate.java
    │       │   │       │                   │   ├── ExecutorTemplateGetter.java
    │       │   │       │                   │   └── NamedThreadFactory.java
    │       │   │       │                   ├── version/
    │       │   │       │                   │   ├── OtterVersionAnnotation.java
    │       │   │       │                   │   └── VersionInfo.java
    │       │   │       │                   └── zookeeper/
    │       │   │       │                       ├── ByteSerializer.java
    │       │   │       │                       ├── StringSerializer.java
    │       │   │       │                       ├── ZkClientx.java
    │       │   │       │                       ├── ZkEventThread.java
    │       │   │       │                       └── ZooKeeperx.java
    │       │   │       └── google/
    │       │   │           └── common/
    │       │   │               └── collect/
    │       │   │                   └── OtterMigrateMap.java
    │       │   └── resources/
    │       │       └── jtester.properties
    │       ├── saveVersion.sh
    │       └── test/
    │           ├── java/
    │           │   └── com/
    │           │       └── alibaba/
    │           │           └── otter/
    │           │               └── shared/
    │           │                   └── common/
    │           │                       ├── AddressUtilsTest.java
    │           │                       ├── BaseOtterPerformance.java
    │           │                       ├── BaseOtterTest.java
    │           │                       ├── InteAddressTest.java
    │           │                       ├── JsonUtilsTest.java
    │           │                       ├── config/
    │           │                       │   └── ConfigHelperTest.java
    │           │                       ├── sample/
    │           │                       │   ├── JtesterxSampleTest.java
    │           │                       │   ├── TestMockService1.java
    │           │                       │   ├── TestMockService2.java
    │           │                       │   ├── TestMockService3.java
    │           │                       │   └── TestService.java
    │           │                       └── utils/
    │           │                           ├── BooleanMutexTest.java
    │           │                           ├── ExecIntegration.java
    │           │                           ├── ExecutorTemplateTest.java
    │           │                           ├── JavaSourceCompilerTest.java
    │           │                           ├── NioUtilsPerformance.java
    │           │                           ├── NioUtilsTest.java
    │           │                           └── ResourceBundleUtilTest.java
    │           └── resources/
    │               ├── applicationContext.xml
    │               ├── code/
    │               │   └── ResourceBundleUtil.properties
    │               ├── compiler.txt
    │               ├── otter.properties
    │               └── spring/
    │                   └── otter-test-sample.xml
    ├── communication/
    │   ├── pom.xml
    │   └── src/
    │       ├── main/
    │       │   └── java/
    │       │       └── com/
    │       │           └── alibaba/
    │       │               └── otter/
    │       │                   └── shared/
    │       │                       └── communication/
    │       │                           ├── core/
    │       │                           │   ├── CommunicationClient.java
    │       │                           │   ├── CommunicationEndpoint.java
    │       │                           │   ├── CommunicationRegistry.java
    │       │                           │   ├── exception/
    │       │                           │   │   └── CommunicationException.java
    │       │                           │   ├── impl/
    │       │                           │   │   ├── AbstractCommunicationEndpoint.java
    │       │                           │   │   ├── DefaultCommunicationClientImpl.java
    │       │                           │   │   ├── connection/
    │       │                           │   │   │   ├── CommunicationConnection.java
    │       │                           │   │   │   ├── CommunicationConnectionFactory.java
    │       │                           │   │   │   ├── CommunicationConnectionPoolFactory.java
    │       │                           │   │   │   ├── CommunicationConnectionPoolable.java
    │       │                           │   │   │   └── CommunicationConnectionPoolableFactory.java
    │       │                           │   │   ├── dubbo/
    │       │                           │   │   │   ├── DubboCommunicationConnection.java
    │       │                           │   │   │   ├── DubboCommunicationConnectionFactory.java
    │       │                           │   │   │   └── DubboCommunicationEndpoint.java
    │       │                           │   │   └── rmi/
    │       │                           │   │       ├── RmiCommunicationClientImpl.java
    │       │                           │   │       ├── RmiCommunicationConnection.java
    │       │                           │   │       ├── RmiCommunicationConnectionFactory.java
    │       │                           │   │       └── RmiCommunicationEndpoint.java
    │       │                           │   └── model/
    │       │                           │       ├── Callback.java
    │       │                           │       ├── CommunicationParam.java
    │       │                           │       ├── Event.java
    │       │                           │       ├── EventType.java
    │       │                           │       └── heart/
    │       │                           │           └── HeartEvent.java
    │       │                           └── model/
    │       │                               ├── OtterRemoteException.java
    │       │                               ├── arbitrate/
    │       │                               │   ├── ArbitrateEventType.java
    │       │                               │   ├── NodeAlarmEvent.java
    │       │                               │   ├── StageSingleEvent.java
    │       │                               │   ├── StopChannelEvent.java
    │       │                               │   └── StopNodeEvent.java
    │       │                               ├── canal/
    │       │                               │   ├── CanalEventType.java
    │       │                               │   ├── FindCanalEvent.java
    │       │                               │   └── FindFilterEvent.java
    │       │                               ├── config/
    │       │                               │   ├── ConfigEventType.java
    │       │                               │   ├── FindChannelEvent.java
    │       │                               │   ├── FindMediaEvent.java
    │       │                               │   ├── FindNodeEvent.java
    │       │                               │   ├── FindTaskEvent.java
    │       │                               │   ├── NotifyChannelEvent.java
    │       │                               │   └── NotifyMediaEvent.java
    │       │                               └── statistics/
    │       │                                   ├── DelayCountEvent.java
    │       │                                   ├── StatisticsEventType.java
    │       │                                   ├── TableStatEvent.java
    │       │                                   └── ThroughputStatEvent.java
    │       └── test/
    │           ├── java/
    │           │   └── com/
    │           │       └── alibaba/
    │           │           └── otter/
    │           │               └── shared/
    │           │                   └── communication/
    │           │                       ├── BaseOtterTest.java
    │           │                       ├── CommunicationSpringIntegrateTest.java
    │           │                       ├── app/
    │           │                       │   ├── CommunicationAppService.java
    │           │                       │   ├── CommunicationAppServiceImpl.java
    │           │                       │   └── event/
    │           │                       │       ├── AppCreateEvent.java
    │           │                       │       ├── AppDeleteEvent.java
    │           │                       │       ├── AppEventType.java
    │           │                       │       ├── AppFindEvent.java
    │           │                       │       └── AppUpdateEvent.java
    │           │                       ├── dubbo/
    │           │                       │   ├── DubboCommunicationTest.java
    │           │                       │   └── DubboConnectionTest.java
    │           │                       └── rmi/
    │           │                           ├── RmiCommunicationTest.java
    │           │                           └── RmiConnectionTest.java
    │           └── resources/
    │               ├── applicationContext.xml
    │               └── spring/
    │                   └── otter-test-communication.xml
    ├── etl/
    │   ├── pom.xml
    │   └── src/
    │       └── main/
    │           └── java/
    │               └── com/
    │                   └── alibaba/
    │                       └── otter/
    │                           └── shared/
    │                               └── etl/
    │                                   ├── extend/
    │                                   │   ├── fileresolver/
    │                                   │   │   ├── FileInfo.java
    │                                   │   │   ├── FileResolver.java
    │                                   │   │   └── support/
    │                                   │   │       ├── RemoteDirectory.java
    │                                   │   │       ├── RemoteDirectoryFetcher.java
    │                                   │   │       └── RemoteDirectoryFetcherAware.java
    │                                   │   └── processor/
    │                                   │       ├── EventProcessor.java
    │                                   │       └── support/
    │                                   │           ├── DataSourceFetcher.java
    │                                   │           └── DataSourceFetcherAware.java
    │                                   └── model/
    │                                       ├── BatchObject.java
    │                                       ├── DbBatch.java
    │                                       ├── EventColumn.java
    │                                       ├── EventColumnIndexComparable.java
    │                                       ├── EventData.java
    │                                       ├── EventType.java
    │                                       ├── FileBatch.java
    │                                       ├── FileData.java
    │                                       ├── Identity.java
    │                                       ├── ObjectData.java
    │                                       └── RowBatch.java
    ├── pom.xml
    └── push/
        ├── pom.xml
        └── src/
            └── main/
                ├── java/
                │   └── com/
                │       └── alibaba/
                │           └── otter/
                │               └── common/
                │                   └── push/
                │                       ├── AbstractSubscribeManager.java
                │                       ├── PushException.java
                │                       ├── SubscribeCallback.java
                │                       ├── SubscribeManager.java
                │                       ├── SubscribeManagerFactory.java
                │                       ├── SubscribeType.java
                │                       ├── datasource/
                │                       │   ├── DataSourceHanlder.java
                │                       │   ├── DataSourceKey.java
                │                       │   └── media/
                │                       │       ├── MediaPushDataSource.java
                │                       │       └── MediaPushDataSourceHandler.java
                │                       ├── media/
                │                       │   └── MediaSubscribeManager.java
                │                       └── supplier/
                │                           ├── AbstractDatasourceSupplier.java
                │                           ├── DatasourceChangeCallback.java
                │                           ├── DatasourceInfo.java
                │                           ├── DatasourceSupplier.java
                │                           ├── HaDatasourceInfo.java
                │                           └── media/
                │                               └── MediaDatasourceSupplier.java
                └── resources/
                    └── spring/
                        └── otter-push-common.xml
Download .txt
Showing preview only (729K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (7681 symbols across 912 files)

FILE: docker/image/admin/bin/ddl.sql
  type `ALARM_RULE` (line 5) | CREATE TABLE `ALARM_RULE` (
  type `AUTOKEEPER_CLUSTER` (line 19) | CREATE TABLE `AUTOKEEPER_CLUSTER` (
  type `CANAL` (line 29) | CREATE TABLE `CANAL` (
  type `CHANNEL` (line 40) | CREATE TABLE `CHANNEL` (
  type `COLUMN_PAIR` (line 51) | CREATE TABLE `COLUMN_PAIR` (
  type `COLUMN_PAIR_GROUP` (line 62) | CREATE TABLE `COLUMN_PAIR_GROUP` (
  type `DATA_MEDIA` (line 72) | CREATE TABLE `DATA_MEDIA` (
  type `DATA_MEDIA_PAIR` (line 84) | CREATE TABLE `DATA_MEDIA_PAIR` (
  type `DATA_MEDIA_SOURCE` (line 100) | CREATE TABLE `DATA_MEDIA_SOURCE` (
  type `DELAY_STAT` (line 111) | CREATE TABLE `DELAY_STAT` (
  type `LOG_RECORD` (line 124) | CREATE TABLE `LOG_RECORD` (
  type `NODE` (line 137) | CREATE TABLE `NODE` (
  type `PIPELINE` (line 150) | CREATE TABLE `PIPELINE` (
  type `PIPELINE_NODE_RELATION` (line 163) | CREATE TABLE `PIPELINE_NODE_RELATION` (
  type `SYSTEM_PARAMETER` (line 174) | CREATE TABLE `SYSTEM_PARAMETER` (
  type `TABLE_HISTORY_STAT` (line 182) | CREATE TABLE `TABLE_HISTORY_STAT` (
  type `TABLE_STAT` (line 200) | CREATE TABLE `TABLE_STAT` (
  type `THROUGHPUT_STAT` (line 215) | CREATE TABLE `THROUGHPUT_STAT` (
  type `USER` (line 231) | CREATE TABLE `USER` (
  type `DATA_MATRIX` (line 244) | CREATE TABLE  `DATA_MATRIX` (
  type `meta_history` (line 256) | CREATE TABLE IF NOT EXISTS `meta_history` (
  type `meta_snapshot` (line 278) | CREATE TABLE IF NOT EXISTS `meta_snapshot` (

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/autokeeper/AutoKeeperStatService.java
  type AutoKeeperStatService (line 30) | public interface AutoKeeperStatService {
    method findServerStat (line 38) | public AutoKeeperServerStat findServerStat(String serverIp);
    method findServerStatBySessionId (line 46) | public AutoKeeperServerStat findServerStatBySessionId(String sessionId);
    method findConnectionBySessionId (line 54) | public AutoKeeperConnectionStat findConnectionBySessionId(String sessi...
    method findConnectionByEphemeralPath (line 62) | public AutoKeeperConnectionStat findConnectionByEphemeralPath(String p...
    method findConnectionByWatcherPath (line 70) | public List<AutoKeeperConnectionStat> findConnectionByWatcherPath(Stri...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/autokeeper/impl/AutoKeeperCollector.java
  class AutoKeeperCollector (line 52) | public class AutoKeeperCollector implements InitializingBean {
    method collectorConnectionStat (line 82) | public void collectorConnectionStat(String address) {
    method collectorServerStat (line 163) | public void collectorServerStat(String address) {
    method collectorEphemeralStat (line 207) | public void collectorEphemeralStat(String address) {
    method collectorWatchStat (line 231) | public void collectorWatchStat(String address) {
    method collector (line 255) | public static String collector(String[] command) {
    method splitAddress (line 269) | private List<String> splitAddress(String address) {
    method groupSessionPath (line 283) | private Map<String, List<String>> groupSessionPath(String cmdresult) {
    method afterPropertiesSet (line 304) | @Override
    method startCollect (line 311) | private void startCollect() {
    method setAutoKeeperClusterService (line 336) | public void setAutoKeeperClusterService(AutoKeeperClusterService autoK...
    method setAutoKeeperData (line 340) | public void setAutoKeeperData(AutoKeeperData autoKeeperData) {
    method setCollectInterval (line 344) | public void setCollectInterval(long collectInterval) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/autokeeper/impl/AutoKeeperData.java
  class AutoKeeperData (line 41) | public class AutoKeeperData implements AutoKeeperPersist {
    method joinServer (line 46) | public void joinServer(String address, AutoKeeperServerStat summary) {
    method joinConnection (line 50) | public void joinConnection(String address, List<AutoKeeperConnectionSt...
    method joinEphemeral (line 62) | public void joinEphemeral(String address, List<AutoKeeperEphemeralStat...
    method joinWatch (line 71) | public void joinWatch(String address, List<AutoKeeperWatchStat> watche...
    method persist (line 80) | public void persist() {
    method getServerStats (line 85) | public Map<String, AutoKeeperServerStat> getServerStats() {
    method getConnectionStats (line 89) | public Map<String, AutoKeeperConnectionStat> getConnectionStats() {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/autokeeper/impl/AutoKeeperPersist.java
  type AutoKeeperPersist (line 25) | public interface AutoKeeperPersist {
    method persist (line 30) | public void persist();

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/autokeeper/impl/AutoKeeperStatServiceImpl.java
  class AutoKeeperStatServiceImpl (line 34) | public class AutoKeeperStatServiceImpl implements AutoKeeperStatService {
    method findServerStat (line 38) | public AutoKeeperServerStat findServerStat(String serverAddress) {
    method findServerStatBySessionId (line 42) | public AutoKeeperServerStat findServerStatBySessionId(String sessionId) {
    method findConnectionBySessionId (line 47) | public AutoKeeperConnectionStat findConnectionBySessionId(String sessi...
    method findConnectionByEphemeralPath (line 51) | public AutoKeeperConnectionStat findConnectionByEphemeralPath(String p...
    method findConnectionByWatcherPath (line 63) | public List<AutoKeeperConnectionStat> findConnectionByWatcherPath(Stri...
    method setAutoKeeperData (line 76) | public void setAutoKeeperData(AutoKeeperData autoKeeperData) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/DataSourceCreator.java
  class DataSourceCreator (line 38) | public class DataSourceCreator implements DisposableBean {
    method createDataSource (line 65) | public DataSource createDataSource(DataMediaSource dataMediaSource) {
    method destroyDataSource (line 83) | public void destroyDataSource(DataSource dataSource) {
    method destroy (line 101) | public void destroy() throws Exception {
    method preCreate (line 107) | private DataSource preCreate(Long pipelineId, DbMediaSource dbMediaSou...
    method letHandlerDestroyIfSupport (line 125) | public boolean letHandlerDestroyIfSupport(Long pipelineId, DataSource ...
    method createDataSource (line 143) | private DataSource createDataSource(String url, String userName, Strin...
    method setMaxWait (line 194) | public void setMaxWait(int maxWait) {
    method setMinIdle (line 198) | public void setMinIdle(int minIdle) {
    method setInitialSize (line 202) | public void setInitialSize(int initialSize) {
    method setMaxActive (line 206) | public void setMaxActive(int maxActive) {
    method setMaxIdle (line 210) | public void setMaxIdle(int maxIdle) {
    method setNumTestsPerEvictionRun (line 214) | public void setNumTestsPerEvictionRun(int numTestsPerEvictionRun) {
    method setTimeBetweenEvictionRunsMillis (line 218) | public void setTimeBetweenEvictionRunsMillis(int timeBetweenEvictionRu...
    method setRemoveAbandonedTimeout (line 222) | public void setRemoveAbandonedTimeout(int removeAbandonedTimeout) {
    method setMinEvictableIdleTimeMillis (line 226) | public void setMinEvictableIdleTimeMillis(int minEvictableIdleTimeMill...
    method setDataSourceHandlers (line 230) | public void setDataSourceHandlers(List<DataSourceHanlder> dataSourceHa...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/alarm/AbstractAlarmService.java
  class AbstractAlarmService (line 38) | public abstract class AbstractAlarmService implements AlarmService, Init...
    method sendAlarm (line 46) | public void sendAlarm(AlarmMessage data) {
    method sendAlarmInternal (line 56) | private void sendAlarmInternal() {
    method doSend (line 69) | protected abstract void doSend(AlarmMessage data) throws Exception;
    method afterPropertiesSet (line 71) | public void afterPropertiesSet() throws Exception {
    method destroy (line 84) | @Override
    method dumpQueue (line 96) | protected String dumpQueue() {
    method setPeriod (line 110) | public void setPeriod(int period) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/alarm/AlarmMessage.java
  class AlarmMessage (line 9) | public class AlarmMessage implements Serializable {
    method AlarmMessage (line 15) | public AlarmMessage(){
    method AlarmMessage (line 19) | public AlarmMessage(String message, String receiveKey){
    method getMessage (line 24) | public String getMessage() {
    method setMessage (line 28) | public void setMessage(String message) {
    method getReceiveKey (line 32) | public String getReceiveKey() {
    method setReceiveKey (line 36) | public void setReceiveKey(String receiveKey) {
    method toString (line 40) | @Override

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/alarm/AlarmService.java
  type AlarmService (line 26) | public interface AlarmService {
    method sendAlarm (line 39) | public void sendAlarm(AlarmMessage data);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/alarm/DefaultAlarmService.java
  class DefaultAlarmService (line 20) | public class DefaultAlarmService extends AbstractAlarmService {
    method doSend (line 27) | public void doSend(AlarmMessage data) throws Exception {
    method doSendMail (line 56) | private void doSendMail(SimpleMailMessage mail) {
    method isMail (line 67) | private boolean isMail(String receiveKey) {
    method isSms (line 71) | private boolean isSms(String receiveKey) {
    method convertToReceiver (line 75) | private String convertToReceiver(SystemParameter systemParameter, Stri...
    method setMailSender (line 83) | public void setMailSender(JavaMailSender mailSender) {
    method setUsername (line 87) | public void setUsername(String username) {
    method setSystemParameterService (line 91) | public void setSystemParameterService(SystemParameterService systemPar...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/arbitrate/ArbitrateConfigImpl.java
  class ArbitrateConfigImpl (line 43) | public class ArbitrateConfigImpl implements ArbitrateConfig, Initializin...
    method ArbitrateConfigImpl (line 53) | public ArbitrateConfigImpl(){
    method currentNode (line 58) | public Node currentNode() {
    method findNode (line 62) | public Node findNode(Long nid) {
    method findChannel (line 66) | public Channel findChannel(Long channelId) {
    method findChannelByPipelineId (line 70) | public Channel findChannelByPipelineId(Long pipelineId) {
    method findOppositePipeline (line 75) | public Pipeline findOppositePipeline(Long pipelineId) {
    method findPipeline (line 88) | public Pipeline findPipeline(Long pipelineId) {
    method afterPropertiesSet (line 101) | public void afterPropertiesSet() throws Exception {
    method updateMapping (line 146) | private void updateMapping(Channel channel, Long excludeId) {
    method setChannelService (line 156) | public void setChannelService(ChannelService channelService) {
    method setNodeService (line 160) | public void setNodeService(NodeService nodeService) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/arbitrate/DeadNodeListener.java
  class DeadNodeListener (line 52) | public class DeadNodeListener implements NodeListener, InitializingBean,...
    method DeadNodeListener (line 64) | public DeadNodeListener(){
    method afterPropertiesSet (line 67) | public void afterPropertiesSet() throws Exception {
    method processChanged (line 86) | public synchronized void processChanged(List<Long> nodes) {
    method processDead (line 106) | private void processDead(Long deadNode) {
    method destroy (line 142) | public void destroy() throws Exception {
    class DeadNodeDelayed (line 153) | public static class DeadNodeDelayed implements Delayed {
      method DeadNodeDelayed (line 161) | public DeadNodeDelayed(long nid, long timeout){
      method getNid (line 167) | public long getNid() {
      method getNow (line 171) | public long getNow() {
      method getDelay (line 175) | public long getDelay(TimeUnit unit) {
      method compareTo (line 181) | public int compareTo(Delayed other) {
      method hashCode (line 194) | @Override
      method equals (line 202) | public boolean equals(Object obj) {
    method setNodeMonitor (line 221) | public void setNodeMonitor(NodeMonitor nodeMonitor) {
    method setArbitrateManageService (line 225) | public void setArbitrateManageService(ArbitrateManageService arbitrate...
    method setChannelService (line 229) | public void setChannelService(ChannelService channelService) {
    method setExceptionRuleMonitor (line 233) | public void setExceptionRuleMonitor(PassiveMonitor exceptionRuleMonito...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/basedao/GenericDAO.java
  type GenericDAO (line 25) | public interface GenericDAO<T> {
    method insert (line 27) | public T insert(T entityObj);
    method delete (line 29) | public void delete(Long identity);
    method update (line 31) | public void update(T entityObj);
    method listAll (line 33) | public List<T> listAll();
    method listByCondition (line 35) | public List<T> listByCondition(Map condition);
    method listByMultiId (line 37) | public List<T> listByMultiId(Long... identities);
    method findById (line 39) | public T findById(Long identity);
    method getCount (line 41) | public int getCount();
    method getCount (line 43) | public int getCount(Map condition);
    method checkUnique (line 45) | public boolean checkUnique(T entityObj);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/baseservice/GenericService.java
  type GenericService (line 25) | public interface GenericService<T> {
    method create (line 27) | public void create(T entityObj);
    method remove (line 29) | public void remove(Long identity);
    method modify (line 31) | public void modify(T entityObj);
    method findById (line 33) | public T findById(Long identity);
    method listByIds (line 35) | public List<T> listByIds(Long... identities);
    method listAll (line 37) | public List<T> listAll();
    method listByCondition (line 39) | public List<T> listByCondition(Map condition);
    method getCount (line 41) | public int getCount();
    method getCount (line 43) | public int getCount(Map condition);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/exceptions/InvalidConfigureException.java
  class InvalidConfigureException (line 3) | public class InvalidConfigureException extends RuntimeException {
    type INVALID_TYPE (line 7) | public static enum INVALID_TYPE {
    method InvalidConfigureException (line 13) | public InvalidConfigureException(INVALID_TYPE type){
    method getType (line 18) | public INVALID_TYPE getType() {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/exceptions/ManagerException.java
  class ManagerException (line 24) | public class ManagerException extends RuntimeException {
    method ManagerException (line 28) | public ManagerException(String cause){
    method ManagerException (line 32) | public ManagerException(Throwable t){
    method ManagerException (line 36) | public ManagerException(String cause, Throwable t){

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/exceptions/RepeatConfigureException.java
  class RepeatConfigureException (line 22) | public class RepeatConfigureException extends RuntimeException {
    method RepeatConfigureException (line 26) | public RepeatConfigureException(String cause){
    method RepeatConfigureException (line 30) | public RepeatConfigureException(Throwable t){
    method RepeatConfigureException (line 34) | public RepeatConfigureException(String cause, Throwable t){

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/alarm/AlarmRuleService.java
  type AlarmRuleService (line 30) | public interface AlarmRuleService {
    method create (line 32) | void create(AlarmRule alarmRule);
    method modify (line 34) | void modify(AlarmRule alarmRule);
    method remove (line 36) | void remove(Long alarmRuleId);
    method enableMonitor (line 38) | public void enableMonitor(Long alarmRuleId);
    method disableMonitor (line 40) | public void disableMonitor(Long alarmRuleId);
    method disableMonitor (line 42) | public void disableMonitor(Long alarmRuleId, String pauseTime);
    method getAllAlarmRules (line 44) | List<AlarmRule> getAllAlarmRules(AlarmRuleStatus status);
    method getAlarmRuleById (line 46) | AlarmRule getAlarmRuleById(Long AlarmRuleId);
    method getAlarmRules (line 54) | Map<Long, List<AlarmRule>> getAlarmRules(AlarmRuleStatus status);
    method getAlarmRules (line 56) | List<AlarmRule> getAlarmRules(Long pipelineId);
    method getAlarmRules (line 58) | List<AlarmRule> getAlarmRules(Long pipelineId, AlarmRuleStatus status);
    method listAllAlarmRules (line 60) | List<AlarmRule> listAllAlarmRules(Map condition);
    method getCount (line 62) | public int getCount();

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/alarm/dal/AlarmRuleDAO.java
  type AlarmRuleDAO (line 29) | public interface AlarmRuleDAO {
    method insert (line 31) | public AlarmRuleDO insert(AlarmRuleDO entityObj);
    method update (line 33) | public void update(AlarmRuleDO entityObj);
    method delete (line 35) | public void delete(Long id);
    method findById (line 37) | public AlarmRuleDO findById(Long alarmRuleId);
    method listByPipelineId (line 39) | public List<AlarmRuleDO> listByPipelineId(Long pipelineId);
    method listByPipelineId (line 41) | public List<AlarmRuleDO> listByPipelineId(Long pipelineId, AlarmRuleSt...
    method listAll (line 43) | public List<AlarmRuleDO> listAll();
    method listAllByPipeline (line 45) | public List<AlarmRuleDO> listAllByPipeline(Map condition);
    method listByStatus (line 47) | public List<AlarmRuleDO> listByStatus(AlarmRuleStatus status);
    method getCount (line 49) | public int getCount();

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/alarm/dal/dataobject/AlarmRuleDO.java
  class AlarmRuleDO (line 29) | public class AlarmRuleDO implements Serializable {
    method getId (line 43) | public Long getId() {
    method setId (line 47) | public void setId(Long id) {
    method getPipelineId (line 51) | public Long getPipelineId() {
    method setPipelineId (line 55) | public void setPipelineId(Long pipelineId) {
    method getStatus (line 59) | public AlarmRuleStatus getStatus() {
    method setStatus (line 63) | public void setStatus(AlarmRuleStatus status) {
    method getMonitorName (line 67) | public MonitorName getMonitorName() {
    method setMonitorName (line 71) | public void setMonitorName(MonitorName monitorName) {
    method getReceiverKey (line 75) | public String getReceiverKey() {
    method setReceiverKey (line 79) | public void setReceiverKey(String receiverKey) {
    method getMatchValue (line 83) | public String getMatchValue() {
    method setMatchValue (line 87) | public void setMatchValue(String matchValue) {
    method getAlarmRuleParameter (line 91) | public AlarmRuleParameter getAlarmRuleParameter() {
    method setAlarmRuleParameter (line 95) | public void setAlarmRuleParameter(AlarmRuleParameter alarmRuleParamete...
    method getDescription (line 99) | public String getDescription() {
    method setDescription (line 103) | public void setDescription(String description) {
    method getGmtCreate (line 107) | public Date getGmtCreate() {
    method setGmtCreate (line 111) | public void setGmtCreate(Date gmtCreate) {
    method getGmtModified (line 115) | public Date getGmtModified() {
    method setGmtModified (line 119) | public void setGmtModified(Date gmtModified) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/alarm/dal/dataobject/AlarmRuleParameter.java
  class AlarmRuleParameter (line 25) | public class AlarmRuleParameter implements Serializable {
    method getIntervalTime (line 33) | public Long getIntervalTime() {
    method setIntervalTime (line 37) | public void setIntervalTime(Long intervalTime) {
    method getPauseTime (line 41) | public String getPauseTime() {
    method setPauseTime (line 45) | public void setPauseTime(String pauseTime) {
    method getAutoRecovery (line 49) | public Boolean getAutoRecovery() {
    method setAutoRecovery (line 53) | public void setAutoRecovery(Boolean autoRecovery) {
    method getRecoveryThresold (line 57) | public Integer getRecoveryThresold() {
    method setRecoveryThresold (line 61) | public void setRecoveryThresold(Integer recoveryThresold) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/alarm/dal/ibatis/AlarmRuleParameterTypeHandler.java
  class AlarmRuleParameterTypeHandler (line 32) | public class AlarmRuleParameterTypeHandler implements TypeHandlerCallback {
    method setParameter (line 34) | @Override
    method getResult (line 39) | @Override
    method valueOf (line 44) | public Object valueOf(String s) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/alarm/dal/ibatis/IbatisAlarmRuleDAO.java
  class IbatisAlarmRuleDAO (line 33) | public class IbatisAlarmRuleDAO extends SqlMapClientDaoSupport implement...
    method insert (line 35) | public AlarmRuleDO insert(AlarmRuleDO entityObj) {
    method update (line 41) | public void update(AlarmRuleDO entityObj) {
    method delete (line 46) | public void delete(Long id) {
    method findById (line 51) | public AlarmRuleDO findById(Long alarmRuleId) {
    method listByPipelineId (line 57) | public List<AlarmRuleDO> listByPipelineId(Long pipelineId) {
    method listByPipelineId (line 63) | public List<AlarmRuleDO> listByPipelineId(Long pipelineId, AlarmRuleSt...
    method listAll (line 74) | public List<AlarmRuleDO> listAll() {
    method listAllByPipeline (line 79) | public List<AlarmRuleDO> listAllByPipeline(Map condition) {
    method listByStatus (line 85) | public List<AlarmRuleDO> listByStatus(AlarmRuleStatus status) {
    method getCount (line 90) | public int getCount() {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/alarm/impl/AlarmRuleServiceImpl.java
  class AlarmRuleServiceImpl (line 43) | public class AlarmRuleServiceImpl implements AlarmRuleService {
    method create (line 49) | public void create(AlarmRule alarmRule) {
    method modify (line 54) | public void modify(AlarmRule alarmRule) {
    method remove (line 60) | public void remove(Long alarmRuleId) {
    method switchAlarmRuleStatus (line 64) | private void switchAlarmRuleStatus(Long alarmRuleId, AlarmRuleStatus a...
    method enableMonitor (line 83) | public void enableMonitor(Long alarmRuleId) {
    method disableMonitor (line 87) | public void disableMonitor(Long alarmRuleId) {
    method disableMonitor (line 91) | public void disableMonitor(Long alarmRuleId, String pauseTime) {
    method getAlarmRuleById (line 95) | public AlarmRule getAlarmRuleById(Long AlarmRuleId) {
    method getAllAlarmRules (line 100) | public List<AlarmRule> getAllAlarmRules(AlarmRuleStatus status) {
    method getAlarmRules (line 106) | public Map<Long, List<AlarmRule>> getAlarmRules(AlarmRuleStatus status) {
    method getAlarmRules (line 123) | public List<AlarmRule> getAlarmRules(Long pipelineId) {
    method getAlarmRules (line 129) | public List<AlarmRule> getAlarmRules(Long pipelineId, AlarmRuleStatus ...
    method listAllAlarmRules (line 137) | public List<AlarmRule> listAllAlarmRules(Map condition) {
    method getCount (line 142) | public int getCount() {
    method doToModel (line 146) | private AlarmRule doToModel(AlarmRuleDO alarmRuleDo) {
    method doToModel (line 174) | private List<AlarmRule> doToModel(List<AlarmRuleDO> alarmRuleDos) {
    method modelToDo (line 182) | private AlarmRuleDO modelToDo(AlarmRule alarmRule) {
    method setAlarmRuleDao (line 206) | public void setAlarmRuleDao(AlarmRuleDAO alarmRuleDao) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/autokeeper/AutoKeeperClusterService.java
  type AutoKeeperClusterService (line 27) | public interface AutoKeeperClusterService {
    method findAutoKeeperClusterById (line 29) | public AutoKeeperCluster findAutoKeeperClusterById(Long id);
    method listAutoKeeperClusters (line 31) | public List<AutoKeeperCluster> listAutoKeeperClusters();
    method modifyAutoKeeperCluster (line 33) | public void modifyAutoKeeperCluster(AutoKeeperCluster autoKeeperCluster);
    method createAutoKeeperCluster (line 35) | public void createAutoKeeperCluster(AutoKeeperCluster autoKeeperCluster);
    method removeAutoKeeperCluster (line 37) | public void removeAutoKeeperCluster(Long id);
    method getCount (line 39) | public Integer getCount();

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/autokeeper/dal/AutoKeeperClusterDAO.java
  type AutoKeeperClusterDAO (line 23) | public interface AutoKeeperClusterDAO {
    method findAutoKeeperClusterById (line 25) | public AutoKeeperClusterDO findAutoKeeperClusterById(Long id);
    method listAutoKeeperClusters (line 27) | public List<AutoKeeperClusterDO> listAutoKeeperClusters();
    method updateAutoKeeperCluster (line 29) | public void updateAutoKeeperCluster(AutoKeeperClusterDO autoKeeperClus...
    method insertAutoKeeperClusterDO (line 31) | public void insertAutoKeeperClusterDO(AutoKeeperClusterDO autoKeeperCl...
    method delete (line 33) | public void delete(Long clusterId);
    method getCount (line 35) | public Integer getCount();

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/autokeeper/dal/dataobject/AutoKeeperClusterDO.java
  class AutoKeeperClusterDO (line 31) | public class AutoKeeperClusterDO {
    method getId (line 40) | public Long getId() {
    method setId (line 44) | public void setId(Long id) {
    method getClusterName (line 48) | public String getClusterName() {
    method setClusterName (line 52) | public void setClusterName(String clusterName) {
    method getServerList (line 56) | public String getServerList() {
    method setServerList (line 60) | public void setServerList(String serverList) {
    method getDescription (line 64) | public String getDescription() {
    method setDescription (line 68) | public void setDescription(String description) {
    method getGmtCreate (line 72) | public Date getGmtCreate() {
    method setGmtCreate (line 76) | public void setGmtCreate(Date gmtCreate) {
    method getGmtModified (line 80) | public Date getGmtModified() {
    method setGmtModified (line 84) | public void setGmtModified(Date gmtModified) {
    method toString (line 88) | public String toString() {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/autokeeper/dal/ibatis/IbatisAutoKeeperClusterDAO.java
  class IbatisAutoKeeperClusterDAO (line 33) | public class IbatisAutoKeeperClusterDAO extends SqlMapClientDaoSupport i...
    method findAutoKeeperClusterById (line 35) | @Override
    method listAutoKeeperClusters (line 41) | @Override
    method updateAutoKeeperCluster (line 47) | @Override
    method insertAutoKeeperClusterDO (line 53) | @Override
    method delete (line 59) | @Override
    method getCount (line 65) | @Override

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/autokeeper/impl/AutoKeeperClusterServiceImpl.java
  class AutoKeeperClusterServiceImpl (line 35) | public class AutoKeeperClusterServiceImpl implements AutoKeeperClusterSe...
    method findAutoKeeperClusterById (line 39) | @Override
    method listAutoKeeperClusters (line 45) | @Override
    method modifyAutoKeeperCluster (line 50) | @Override
    method createAutoKeeperCluster (line 55) | @Override
    method removeAutoKeeperCluster (line 60) | @Override
    method doToModel (line 65) | private AutoKeeperCluster doToModel(AutoKeeperClusterDO autoKeeperClus...
    method getCount (line 78) | public Integer getCount() {
    method doToModel (line 82) | private List<AutoKeeperCluster> doToModel(List<AutoKeeperClusterDO> au...
    method modelToDo (line 90) | private AutoKeeperClusterDO modelToDo(AutoKeeperCluster autoKeeperClus...
    method setAutoKeeperClusterDao (line 101) | public void setAutoKeeperClusterDao(AutoKeeperClusterDAO autoKeeperClu...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/canal/CanalService.java
  type CanalService (line 27) | public interface CanalService {
    method create (line 29) | public void create(Canal canal);
    method remove (line 31) | public void remove(Long canalId);
    method modify (line 33) | public void modify(Canal canal);
    method listByIds (line 35) | public List<Canal> listByIds(Long... identities);
    method listAll (line 37) | public List<Canal> listAll();
    method findById (line 39) | public Canal findById(Long canalId);
    method findByName (line 41) | public Canal findByName(String name);
    method getCount (line 43) | public int getCount(Map condition);
    method listByCondition (line 45) | public List<Canal> listByCondition(Map condition);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/canal/dal/CanalDAO.java
  type CanalDAO (line 25) | public interface CanalDAO extends GenericDAO<CanalDO> {
    method findByName (line 27) | public CanalDO findByName(String name);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/canal/dal/dataobject/CanalDO.java
  class CanalDO (line 30) | public class CanalDO implements Serializable {
    method getId (line 42) | public Long getId() {
    method setId (line 46) | public void setId(Long id) {
    method getName (line 50) | public String getName() {
    method setName (line 54) | public void setName(String name) {
    method getDescription (line 58) | public String getDescription() {
    method setDescription (line 62) | public void setDescription(String description) {
    method getStatus (line 66) | public CanalStatus getStatus() {
    method setStatus (line 70) | public void setStatus(CanalStatus status) {
    method getParameters (line 74) | public CanalParameter getParameters() {
    method setParameters (line 78) | public void setParameters(CanalParameter parameters) {
    method getGmtCreate (line 82) | public Date getGmtCreate() {
    method setGmtCreate (line 86) | public void setGmtCreate(Date gmtCreate) {
    method getGmtModified (line 90) | public Date getGmtModified() {
    method setGmtModified (line 94) | public void setGmtModified(Date gmtModified) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/canal/dal/ibatis/CanalParameterTypeHandler.java
  class CanalParameterTypeHandler (line 30) | public class CanalParameterTypeHandler implements TypeHandlerCallback {
    method setParameter (line 32) | @Override
    method getResult (line 37) | @Override
    method valueOf (line 42) | public Object valueOf(String s) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/canal/dal/ibatis/IbatisCanalDAO.java
  class IbatisCanalDAO (line 31) | public class IbatisCanalDAO extends SqlMapClientDaoSupport implements Ca...
    method insert (line 33) | public CanalDO insert(CanalDO canal) {
    method delete (line 39) | public void delete(Long canalId) {
    method update (line 44) | public void update(CanalDO canal) {
    method listAll (line 49) | public List<CanalDO> listAll() {
    method listByMultiId (line 53) | public List<CanalDO> listByMultiId(Long... identities) {
    method checkUnique (line 58) | public boolean checkUnique(CanalDO canal) {
    method findByName (line 63) | public CanalDO findByName(String name) {
    method findById (line 68) | public CanalDO findById(Long identity) {
    method getCount (line 72) | public int getCount() {
    method getCount (line 76) | public int getCount(Map condition) {
    method listByCondition (line 81) | public List<CanalDO> listByCondition(Map condition) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/canal/impl/CanalServiceImpl.java
  class CanalServiceImpl (line 48) | public class CanalServiceImpl implements CanalService {
    method create (line 60) | public void create(final Canal canal) {
    method remove (line 89) | public void remove(final Long canalId) {
    method modify (line 111) | public void modify(final Canal canal) {
    method listByIds (line 137) | public List<Canal> listByIds(Long... identities) {
    method listAll (line 165) | public List<Canal> listAll() {
    method findById (line 169) | public Canal findById(Long canalId) {
    method findByName (line 181) | public Canal findByName(String name) {
    method getCount (line 193) | @Override
    method listByCondition (line 198) | @Override
    method modelToDo (line 215) | private CanalDO modelToDo(Canal canal) {
    method doToModel (line 238) | private Canal doToModel(CanalDO canalDo) {
    method doToModel (line 261) | private List<Canal> doToModel(List<CanalDO> canalDos) {
    method setCanalDao (line 271) | public void setCanalDao(CanalDAO canalDao) {
    method setTransactionTemplate (line 275) | public void setTransactionTemplate(TransactionTemplate transactionTemp...
    method setAutoKeeperClusterService (line 279) | public void setAutoKeeperClusterService(AutoKeeperClusterService autoK...
    method setArbitrateViewService (line 283) | public void setArbitrateViewService(ArbitrateViewService arbitrateView...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/channel/ChannelService.java
  type ChannelService (line 29) | public interface ChannelService extends GenericService<Channel> {
    method findByPipelineId (line 31) | public Channel findByPipelineId(Long pipelineId);
    method findByIdWithoutColumn (line 33) | public Channel findByIdWithoutColumn(Long pipelineId);
    method listByPipelineIds (line 35) | public List<Channel> listByPipelineIds(Long... pipelineIds);
    method listByNodeId (line 37) | public List<Channel> listByNodeId(Long nodeId);
    method listOnlyChannels (line 39) | public List<Channel> listOnlyChannels(Long... identities);
    method listAllChannelId (line 41) | public List<Long> listAllChannelId();
    method listByNodeId (line 43) | public List<Channel> listByNodeId(Long nodeId, ChannelStatus... status);
    method listByConditionWithoutColumn (line 45) | public List<Channel> listByConditionWithoutColumn(Map condition);
    method stopChannel (line 47) | public void stopChannel(Long channelId);
    method notifyChannel (line 49) | public void notifyChannel(Long channelId);
    method startChannel (line 51) | public void startChannel(Long channelId);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/channel/dal/ChannelDAO.java
  type ChannelDAO (line 27) | public interface ChannelDAO extends GenericDAO<ChannelDO> {
    method listChannelPks (line 29) | public List<ChannelDO> listChannelPks();

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/channel/dal/dataobject/ChannelDO.java
  class ChannelDO (line 28) | public class ChannelDO implements Serializable {
    method getId (line 39) | public Long getId() {
    method setId (line 43) | public void setId(Long id) {
    method getName (line 47) | public String getName() {
    method setName (line 51) | public void setName(String name) {
    method getStatus (line 55) | public ChannelStatus getStatus() {
    method setStatus (line 59) | public void setStatus(ChannelStatus status) {
    method getDescription (line 63) | public String getDescription() {
    method setDescription (line 67) | public void setDescription(String description) {
    method getParameters (line 71) | public ChannelParameter getParameters() {
    method setParameters (line 75) | public void setParameters(ChannelParameter parameters) {
    method getGmtCreate (line 79) | public Date getGmtCreate() {
    method setGmtCreate (line 83) | public void setGmtCreate(Date gmtCreate) {
    method getGmtModified (line 87) | public Date getGmtModified() {
    method setGmtModified (line 91) | public void setGmtModified(Date gmtModified) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/channel/dal/ibatis/ChannelParameterTypeHandler.java
  class ChannelParameterTypeHandler (line 32) | public class ChannelParameterTypeHandler implements TypeHandlerCallback {
    method setParameter (line 34) | @Override
    method getResult (line 39) | @Override
    method valueOf (line 44) | public Object valueOf(String s) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/channel/dal/ibatis/IbatisChannelDAO.java
  class IbatisChannelDAO (line 33) | public class IbatisChannelDAO extends SqlMapClientDaoSupport implements ...
    method insert (line 35) | public ChannelDO insert(ChannelDO entityObj) {
    method delete (line 41) | public void delete(Long identity) {
    method update (line 46) | public void update(ChannelDO entityObj) {
    method checkUnique (line 51) | public boolean checkUnique(ChannelDO entityObj) {
    method listAll (line 57) | public List<ChannelDO> listAll() {
    method listChannelPks (line 62) | public List<ChannelDO> listChannelPks() {
    method listByCondition (line 67) | public List<ChannelDO> listByCondition(Map condition) {
    method getCount (line 73) | public int getCount() {
    method getCount (line 78) | public int getCount(Map condition) {
    method listByMultiId (line 83) | public List<ChannelDO> listByMultiId(Long... identities) {
    method findById (line 88) | public ChannelDO findById(Long identity) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/channel/impl/ChannelServiceImpl.java
  class ChannelServiceImpl (line 54) | public class ChannelServiceImpl implements ChannelService {
    method create (line 68) | public void create(final Channel channel) {
    method modify (line 101) | public void modify(Channel channel) {
    method remove (line 127) | public void remove(final Long channelId) {
    method listByIds (line 148) | public List<Channel> listByIds(Long... identities) {
    method listAll (line 179) | public List<Channel> listAll() {
    method listOnlyChannels (line 183) | public List<Channel> listOnlyChannels(Long... identities) {
    method listByCondition (line 211) | public List<Channel> listByCondition(Map condition) {
    method listByConditionWithoutColumn (line 220) | public List<Channel> listByConditionWithoutColumn(Map condition) {
    method listAllChannelId (line 229) | public List<Long> listAllChannelId() {
    method findById (line 247) | public Channel findById(Long channelId) {
    method findByIdWithoutColumn (line 258) | public Channel findByIdWithoutColumn(Long channelId) {
    method findByPipelineId (line 279) | public Channel findByPipelineId(Long pipelineId) {
    method listByPipelineIds (line 292) | public List<Channel> listByPipelineIds(Long... pipelineIds) {
    method listByNodeId (line 315) | public List<Channel> listByNodeId(Long nodeId) {
    method listByNodeId (line 322) | public List<Channel> listByNodeId(Long nodeId, ChannelStatus... status...
    method getCount (line 359) | public int getCount() {
    method getCount (line 363) | public int getCount(Map condition) {
    method switchChannelStatus (line 377) | private void switchChannelStatus(final Long channelId, final ChannelSt...
    method stopChannel (line 457) | public void stopChannel(Long channelId) {
    method startChannel (line 461) | public void startChannel(Long channelId) {
    method notifyChannel (line 465) | public void notifyChannel(Long channelId) {
    method modelToDo (line 480) | private ChannelDO modelToDo(Channel channel) {
    method doToModel (line 512) | private Channel doToModel(ChannelDO channelDo) {
    method doToModel (line 556) | private List<Channel> doToModel(List<ChannelDO> channelDos) {
    method doToModelWithColumn (line 605) | private List<Channel> doToModelWithColumn(List<ChannelDO> channelDos) {
    method doToModelOnlyChannels (line 654) | private List<Channel> doToModelOnlyChannels(List<ChannelDO> channelDos) {
    method setPipelineService (line 688) | public void setPipelineService(PipelineService pipelineService) {
    method setChannelDao (line 692) | public void setChannelDao(ChannelDAO channelDao) {
    method setArbitrateManageService (line 696) | public void setArbitrateManageService(ArbitrateManageService arbitrate...
    method setTransactionTemplate (line 700) | public void setTransactionTemplate(TransactionTemplate transactionTemp...
    method setConfigRemoteService (line 704) | public void setConfigRemoteService(ConfigRemoteService configRemoteSer...
    method setSystemParameterService (line 708) | public void setSystemParameterService(SystemParameterService systemPar...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datacolumnpair/DataColumnPairGroupService.java
  type DataColumnPairGroupService (line 30) | public interface DataColumnPairGroupService extends GenericService<Colum...
    method removeByDataMediaPairId (line 32) | public void removeByDataMediaPairId(Long dataMediaPairId);
    method listByDataMediaPairId (line 34) | public List<ColumnGroup> listByDataMediaPairId(Long dataMediaPairId);
    method listByDataMediaPairIds (line 36) | public Map<Long, List<ColumnGroup>> listByDataMediaPairIds(Long... dat...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datacolumnpair/DataColumnPairService.java
  type DataColumnPairService (line 30) | public interface DataColumnPairService extends GenericService<ColumnPair> {
    method listByDataMediaPairId (line 32) | public List<ColumnPair> listByDataMediaPairId(Long dataMediaPairId);
    method listByDataMediaPairIds (line 34) | public Map<Long, List<ColumnPair>> listByDataMediaPairIds(Long... data...
    method createBatch (line 36) | public void createBatch(List<ColumnPair> dataColumnPairs);
    method removeByDataMediaPairId (line 38) | public void removeByDataMediaPairId(Long dataMediaPairId);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datacolumnpair/dal/DataColumnPairDAO.java
  type DataColumnPairDAO (line 29) | public interface DataColumnPairDAO extends GenericDAO<DataColumnPairDO> {
    method listByDataMediaPairId (line 31) | public List<DataColumnPairDO> listByDataMediaPairId(Long dataMediaPair...
    method listByDataMediaPairIds (line 33) | public List<DataColumnPairDO> listByDataMediaPairIds(Long... dataMedia...
    method insertBatch (line 35) | public void insertBatch(List<DataColumnPairDO> dataColumnPairDos);
    method deleteByDataMediaPairId (line 37) | public void deleteByDataMediaPairId(Long dataMediaPairId);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datacolumnpair/dal/DataColumnPairGroupDAO.java
  type DataColumnPairGroupDAO (line 29) | public interface DataColumnPairGroupDAO extends GenericDAO<DataColumnPai...
    method deleteByDataMediaPairId (line 31) | public void deleteByDataMediaPairId(Long dataMediaPairId);
    method ListByDataMediaPairId (line 33) | public List<DataColumnPairGroupDO> ListByDataMediaPairId(Long dataMedi...
    method ListByDataMediaPairIds (line 35) | public List<DataColumnPairGroupDO> ListByDataMediaPairIds(Long... data...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datacolumnpair/dal/dataobject/DataColumnPairDO.java
  class DataColumnPairDO (line 27) | public class DataColumnPairDO implements Serializable {
    method getId (line 37) | public Long getId() {
    method setId (line 41) | public void setId(Long id) {
    method getSourceColumnName (line 45) | public String getSourceColumnName() {
    method setSourceColumnName (line 49) | public void setSourceColumnName(String sourceColumnName) {
    method getTargetColumnName (line 53) | public String getTargetColumnName() {
    method setTargetColumnName (line 57) | public void setTargetColumnName(String targetColumnName) {
    method getDataMediaPairId (line 61) | public Long getDataMediaPairId() {
    method setDataMediaPairId (line 65) | public void setDataMediaPairId(Long dataMediaPairId) {
    method getGmtCreate (line 69) | public Date getGmtCreate() {
    method setGmtCreate (line 73) | public void setGmtCreate(Date gmtCreate) {
    method getGmtModified (line 77) | public Date getGmtModified() {
    method setGmtModified (line 81) | public void setGmtModified(Date gmtModified) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datacolumnpair/dal/dataobject/DataColumnPairGroupDO.java
  class DataColumnPairGroupDO (line 27) | public class DataColumnPairGroupDO implements Serializable {
    method getId (line 36) | public Long getId() {
    method setId (line 40) | public void setId(Long id) {
    method getColumnPairContent (line 44) | public String getColumnPairContent() {
    method setColumnPairContent (line 48) | public void setColumnPairContent(String columnPairContent) {
    method getDataMediaPairId (line 52) | public Long getDataMediaPairId() {
    method setDataMediaPairId (line 56) | public void setDataMediaPairId(Long dataMediaPairId) {
    method getGmtCreate (line 60) | public Date getGmtCreate() {
    method setGmtCreate (line 64) | public void setGmtCreate(Date gmtCreate) {
    method getGmtModified (line 68) | public Date getGmtModified() {
    method setGmtModified (line 72) | public void setGmtModified(Date gmtModified) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datacolumnpair/dal/ibatis/IbatisDataColumnPairDAO.java
  class IbatisDataColumnPairDAO (line 36) | public class IbatisDataColumnPairDAO extends SqlMapClientDaoSupport impl...
    method insert (line 38) | public DataColumnPairGroupDO insert(DataColumnPairGroupDO dataColumnPa...
    method insertBatch (line 44) | public void insertBatch(List<DataColumnPairDO> dataColumnPairDos) {
    method delete (line 62) | public void delete(Long dataColumnPairId) {
    method deleteByDataMediaPairId (line 67) | public void deleteByDataMediaPairId(Long dataMediaPairId) {
    method update (line 72) | public void update(DataColumnPairGroupDO dataColumnPairDo) {
    method listAll (line 78) | public List<DataColumnPairDO> listAll() {
    method listByCondition (line 83) | public List<DataColumnPairDO> listByCondition(Map condition) {
    method listByMultiId (line 87) | public List<DataColumnPairDO> listByMultiId(Long... identities) {
    method findById (line 91) | public DataColumnPairDO findById(Long identity) {
    method getCount (line 96) | public int getCount() {
    method getCount (line 100) | public int getCount(Map condition) {
    method checkUnique (line 104) | public boolean checkUnique(DataColumnPairGroupDO entityObj) {
    method listByDataMediaPairId (line 108) | public List<DataColumnPairDO> listByDataMediaPairId(Long dataMediaPair...
    method listByDataMediaPairIds (line 114) | public List<DataColumnPairDO> listByDataMediaPairIds(Long... dataMedia...
    method insert (line 120) | public DataColumnPairDO insert(DataColumnPairDO entityObj) {
    method update (line 125) | public void update(DataColumnPairDO entityObj) {
    method checkUnique (line 130) | public boolean checkUnique(DataColumnPairDO entityObj) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datacolumnpair/dal/ibatis/IbatisDataColumnPairGroupDAO.java
  class IbatisDataColumnPairGroupDAO (line 33) | public class IbatisDataColumnPairGroupDAO extends SqlMapClientDaoSupport...
    method insert (line 35) | public DataColumnPairGroupDO insert(DataColumnPairGroupDO entityObj) {
    method delete (line 41) | public void delete(Long identity) {
    method deleteByDataMediaPairId (line 46) | public void deleteByDataMediaPairId(Long dataMediaPairId) {
    method update (line 52) | public void update(DataColumnPairGroupDO entityObj) {
    method listAll (line 57) | public List<DataColumnPairGroupDO> listAll() {
    method ListByDataMediaPairId (line 62) | public List<DataColumnPairGroupDO> ListByDataMediaPairId(Long dataMedi...
    method ListByDataMediaPairIds (line 69) | public List<DataColumnPairGroupDO> ListByDataMediaPairIds(Long... data...
    method listByCondition (line 76) | public List<DataColumnPairGroupDO> listByCondition(Map condition) {
    method listByMultiId (line 81) | public List<DataColumnPairGroupDO> listByMultiId(Long... identities) {
    method findById (line 86) | public DataColumnPairGroupDO findById(Long identity) {
    method getCount (line 91) | public int getCount() {
    method getCount (line 96) | public int getCount(Map condition) {
    method checkUnique (line 101) | public boolean checkUnique(DataColumnPairGroupDO entityObj) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datacolumnpair/impl/DataColumnPairGroupServiceImpl.java
  class DataColumnPairGroupServiceImpl (line 44) | public class DataColumnPairGroupServiceImpl implements DataColumnPairGro...
    method create (line 52) | @Override
    method listByDataMediaPairId (line 67) | @Override
    method listByDataMediaPairIds (line 78) | @Override
    method remove (line 109) | @Override
    method removeByDataMediaPairId (line 114) | @Override
    method modify (line 120) | @Override
    method findById (line 125) | @Override
    method listByIds (line 130) | @Override
    method listAll (line 135) | @Override
    method listByCondition (line 140) | @Override
    method getCount (line 145) | @Override
    method getCount (line 150) | @Override
    method doToModel (line 159) | private ColumnGroup doToModel(DataColumnPairGroupDO dataColumnPairGrou...
    method doToModel (line 177) | private List<ColumnGroup> doToModel(List<DataColumnPairGroupDO> dataCo...
    method modelToDo (line 192) | private DataColumnPairGroupDO modelToDo(ColumnGroup columnGroup) {
    method getDataColumnPairGroupDao (line 203) | public DataColumnPairGroupDAO getDataColumnPairGroupDao() {
    method setDataColumnPairGroupDao (line 207) | public void setDataColumnPairGroupDao(DataColumnPairGroupDAO dataColum...
    method getDataColumnPairService (line 211) | public DataColumnPairService getDataColumnPairService() {
    method setDataColumnPairService (line 215) | public void setDataColumnPairService(DataColumnPairService dataColumnP...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datacolumnpair/impl/DataColumnPairServiceImpl.java
  class DataColumnPairServiceImpl (line 41) | public class DataColumnPairServiceImpl implements DataColumnPairService {
    method create (line 47) | public void create(ColumnPair entityObj) {
    method createBatch (line 62) | public void createBatch(List<ColumnPair> dataColumnPairs) {
    method remove (line 82) | public void remove(Long identity) {
    method modify (line 92) | public void modify(ColumnPair entityObj) {
    method findById (line 106) | public ColumnPair findById(Long identity) {
    method listByIds (line 116) | public List<ColumnPair> listByIds(Long... identities) {
    method listAll (line 120) | public List<ColumnPair> listAll() {
    method listByDataMediaPairId (line 124) | public List<ColumnPair> listByDataMediaPairId(Long dataMediaPairId) {
    method listByDataMediaPairIds (line 142) | public Map<Long, List<ColumnPair>> listByDataMediaPairIds(Long... data...
    method removeByDataMediaPairId (line 172) | public void removeByDataMediaPairId(Long dataMediaPairId) {
    method listByCondition (line 182) | public List<ColumnPair> listByCondition(Map condition) {
    method getCount (line 186) | public int getCount() {
    method getCount (line 190) | public int getCount(Map condition) {
    method doToModel (line 198) | private ColumnPair doToModel(DataColumnPairDO dataColumnPairDo) {
    method doToModel (line 213) | private List<ColumnPair> doToModel(List<DataColumnPairDO> dataColumnPa...
    method modelToDo (line 229) | private DataColumnPairDO modelToDo(ColumnPair dataColumnPair) {
    method getDataColumnPairDao (line 241) | public DataColumnPairDAO getDataColumnPairDao() {
    method setDataColumnPairDao (line 245) | public void setDataColumnPairDao(DataColumnPairDAO dataColumnPairDao) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamatrix/DataMatrixService.java
  type DataMatrixService (line 24) | public interface DataMatrixService {
    method create (line 26) | public void create(DataMatrix DataMatrix);
    method remove (line 28) | public void remove(Long DataMatrixId);
    method modify (line 30) | public void modify(DataMatrix DataMatrix);
    method listByIds (line 32) | public List<DataMatrix> listByIds(Long... identities);
    method listAll (line 34) | public List<DataMatrix> listAll();
    method findById (line 36) | public DataMatrix findById(Long DataMatrixId);
    method findByGroupKey (line 38) | public DataMatrix findByGroupKey(String name);
    method getCount (line 40) | public int getCount(Map condition);
    method listByCondition (line 42) | public List<DataMatrix> listByCondition(Map condition);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamatrix/dal/DataMatrixDAO.java
  type DataMatrixDAO (line 22) | public interface DataMatrixDAO extends GenericDAO<DataMatrixDO> {
    method findByGroupKey (line 24) | public DataMatrixDO findByGroupKey(String groupKey);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamatrix/dal/dataobject/DataMatrixDO.java
  class DataMatrixDO (line 22) | public class DataMatrixDO implements Serializable {
    method getId (line 33) | public Long getId() {
    method setId (line 37) | public void setId(Long id) {
    method getGroupKey (line 41) | public String getGroupKey() {
    method setGroupKey (line 45) | public void setGroupKey(String groupKey) {
    method getMaster (line 49) | public String getMaster() {
    method setMaster (line 53) | public void setMaster(String master) {
    method getSlave (line 57) | public String getSlave() {
    method setSlave (line 61) | public void setSlave(String slave) {
    method getDescription (line 65) | public String getDescription() {
    method setDescription (line 69) | public void setDescription(String description) {
    method getGmtCreate (line 73) | public Date getGmtCreate() {
    method setGmtCreate (line 77) | public void setGmtCreate(Date gmtCreate) {
    method getGmtModified (line 81) | public Date getGmtModified() {
    method setGmtModified (line 85) | public void setGmtModified(Date gmtModified) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamatrix/dal/ibatis/IbatisDataMatrixDAO.java
  class IbatisDataMatrixDAO (line 28) | public class IbatisDataMatrixDAO extends SqlMapClientDaoSupport implemen...
    method insert (line 30) | public DataMatrixDO insert(DataMatrixDO matrixDo) {
    method delete (line 36) | public void delete(Long matrixId) {
    method update (line 41) | public void update(DataMatrixDO matrixDo) {
    method listAll (line 46) | public List<DataMatrixDO> listAll() {
    method listByMultiId (line 50) | public List<DataMatrixDO> listByMultiId(Long... identities) {
    method checkUnique (line 55) | public boolean checkUnique(DataMatrixDO matrixDo) {
    method findByGroupKey (line 60) | public DataMatrixDO findByGroupKey(String groupKey) {
    method findById (line 65) | public DataMatrixDO findById(Long identity) {
    method getCount (line 69) | public int getCount() {
    method getCount (line 73) | public int getCount(Map condition) {
    method listByCondition (line 78) | public List<DataMatrixDO> listByCondition(Map condition) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamatrix/impl/DataMatrixServiceImpl.java
  class DataMatrixServiceImpl (line 40) | public class DataMatrixServiceImpl implements DataMatrixService {
    method create (line 50) | public void create(final DataMatrix matrix) {
    method remove (line 78) | public void remove(final Long matrixId) {
    method modify (line 98) | public void modify(final DataMatrix matrix) {
    method listByIds (line 124) | public List<DataMatrix> listByIds(Long... identities) {
    method listAll (line 151) | public List<DataMatrix> listAll() {
    method findById (line 155) | public DataMatrix findById(Long matrixId) {
    method findByGroupKey (line 167) | public DataMatrix findByGroupKey(String groupKey) {
    method getCount (line 179) | @Override
    method listByCondition (line 184) | @Override
    method modelToDo (line 198) | private DataMatrixDO modelToDo(DataMatrix matrix) {
    method doToModel (line 218) | private DataMatrix doToModel(DataMatrixDO matrixDo) {
    method doToModel (line 236) | private List<DataMatrix> doToModel(List<DataMatrixDO> matrixDos) {
    method setTransactionTemplate (line 246) | public void setTransactionTemplate(TransactionTemplate transactionTemp...
    method setDataMatrixDao (line 250) | public void setDataMatrixDao(DataMatrixDAO dataMatrixDao) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamedia/DataMediaService.java
  type DataMediaService (line 27) | public interface DataMediaService extends GenericService<DataMedia> {
    method listByDataMediaSourceId (line 31) | public List<DataMedia> listByDataMediaSourceId(Long dataMediaSourceId);
    method createReturnId (line 33) | public Long createReturnId(DataMedia dataMedia);
    method queryColumnByMedia (line 35) | public List<String> queryColumnByMedia(DataMedia dataMedia);
    method queryColumnByMediaId (line 37) | public List<String> queryColumnByMediaId(Long dataMediaId);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamedia/dal/DataMediaDAO.java
  type DataMediaDAO (line 27) | public interface DataMediaDAO extends GenericDAO<DataMediaDO> {
    method listByDataMediaSourceId (line 29) | public List<DataMediaDO> listByDataMediaSourceId(Long dataMediaSourceId);
    method checkUniqueAndReturnExist (line 31) | public DataMediaDO checkUniqueAndReturnExist(DataMediaDO dataMedia);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamedia/dal/dataobject/DataMediaDO.java
  class DataMediaDO (line 25) | public class DataMediaDO implements Serializable {
    method getId (line 37) | public Long getId() {
    method setId (line 41) | public void setId(Long id) {
    method getName (line 45) | public String getName() {
    method setName (line 49) | public void setName(String name) {
    method getNamespace (line 53) | public String getNamespace() {
    method setNamespace (line 57) | public void setNamespace(String namespace) {
    method getProperties (line 61) | public String getProperties() {
    method setProperties (line 65) | public void setProperties(String properties) {
    method getDataMediaSourceId (line 69) | public Long getDataMediaSourceId() {
    method setDataMediaSourceId (line 73) | public void setDataMediaSourceId(Long dataMediaSourceId) {
    method getGmtCreate (line 77) | public Date getGmtCreate() {
    method setGmtCreate (line 81) | public void setGmtCreate(Date gmtCreate) {
    method getGmtModified (line 85) | public Date getGmtModified() {
    method setGmtModified (line 89) | public void setGmtModified(Date gmtModified) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamedia/dal/ibatis/IbatisDataMediaDAO.java
  class IbatisDataMediaDAO (line 33) | public class IbatisDataMediaDAO extends SqlMapClientDaoSupport implement...
    method insert (line 35) | public DataMediaDO insert(DataMediaDO dataMedia) {
    method delete (line 41) | public void delete(Long dataMediaId) {
    method update (line 46) | public void update(DataMediaDO dataMedia) {
    method checkUnique (line 51) | public boolean checkUnique(DataMediaDO dataMedia) {
    method checkUniqueAndReturnExist (line 56) | public DataMediaDO checkUniqueAndReturnExist(DataMediaDO dataMedia) {
    method findById (line 61) | public DataMediaDO findById(Long dataMediaId) {
    method listAll (line 66) | public List<DataMediaDO> listAll() {
    method listByDataMediaSourceId (line 70) | public List<DataMediaDO> listByDataMediaSourceId(Long dataMediaSourceI...
    method listByCondition (line 76) | public List<DataMediaDO> listByCondition(Map condition) {
    method listByMultiId (line 81) | public List<DataMediaDO> listByMultiId(Long... identities) {
    method getCount (line 86) | public int getCount() {
    method getCount (line 91) | public int getCount(Map condition) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamedia/impl/DataMediaServiceImpl.java
  class DataMediaServiceImpl (line 50) | public class DataMediaServiceImpl implements DataMediaService {
    method queryColumnByMediaId (line 60) | @Override
    method queryColumnByMedia (line 65) | @Override
    method create (line 91) | @Override
    method createReturnId (line 115) | @Override
    method remove (line 139) | @Override
    method modify (line 154) | @Override
    method listAll (line 177) | @Override
    method listByCondition (line 182) | @Override
    method findById (line 204) | @Override
    method listByIds (line 218) | @Override
    method listByDataMediaSourceId (line 247) | @Override
    method getCount (line 264) | @Override
    method getCount (line 269) | @Override
    method modelToDo (line 280) | private DataMediaDO modelToDo(DataMedia dataMedia) {
    method doToModel (line 309) | private DataMedia doToModel(DataMediaDO dataMediaDo) {
    method doToModel (line 333) | private List<DataMedia> doToModel(List<DataMediaDO> dataMediaDos) {
    method setDataMediaDao (line 344) | public void setDataMediaDao(DataMediaDAO dataMediaDao) {
    method setDataMediaSourceService (line 348) | public void setDataMediaSourceService(DataMediaSourceService dataMedia...
    method setDataSourceCreator (line 352) | public void setDataSourceCreator(DataSourceCreator dataSourceCreator) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamediapair/DataMediaPairService.java
  type DataMediaPairService (line 27) | public interface DataMediaPairService extends GenericService<DataMediaPa...
    method listByPipelineId (line 29) | public List<DataMediaPair> listByPipelineId(Long pipelineId);
    method listByPipelineIdWithoutColumn (line 31) | public List<DataMediaPair> listByPipelineIdWithoutColumn(Long pipeline...
    method listByDataMediaId (line 33) | public List<DataMediaPair> listByDataMediaId(Long dataMediaId);
    method createAndReturnId (line 35) | public Long createAndReturnId(DataMediaPair dataMediaPair);
    method createIfNotExist (line 37) | public boolean createIfNotExist(DataMediaPair dataMediaPair);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamediapair/dal/DataMediaPairDAO.java
  type DataMediaPairDAO (line 27) | public interface DataMediaPairDAO extends GenericDAO<DataMediaPairDO> {
    method listByPipelineId (line 29) | public List<DataMediaPairDO> listByPipelineId(Long pipelineId);
    method listByDataMediaId (line 31) | public List<DataMediaPairDO> listByDataMediaId(Long dataMediaId);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamediapair/dal/dataobject/DataMediaPairDO.java
  class DataMediaPairDO (line 27) | public class DataMediaPairDO implements Serializable {
    method getId (line 42) | public Long getId() {
    method setId (line 46) | public void setId(Long id) {
    method getSourceDataMediaId (line 50) | public Long getSourceDataMediaId() {
    method setSourceDataMediaId (line 54) | public void setSourceDataMediaId(Long sourceDataMediaId) {
    method getTargetDataMediaId (line 58) | public Long getTargetDataMediaId() {
    method setTargetDataMediaId (line 62) | public void setTargetDataMediaId(Long targetDataMediaId) {
    method getPipelineId (line 66) | public Long getPipelineId() {
    method setPipelineId (line 70) | public void setPipelineId(Long pipelineId) {
    method getGmtModified (line 74) | public Date getGmtModified() {
    method setGmtModified (line 78) | public void setGmtModified(Date gmtModified) {
    method getGmtCreate (line 82) | public Date getGmtCreate() {
    method setGmtCreate (line 86) | public void setGmtCreate(Date gmtCreate) {
    method getPullWeight (line 90) | public Long getPullWeight() {
    method setPullWeight (line 94) | public void setPullWeight(Long pullWeight) {
    method getPushWeight (line 98) | public Long getPushWeight() {
    method setPushWeight (line 102) | public void setPushWeight(Long pushWeight) {
    method getResolver (line 106) | public String getResolver() {
    method setResolver (line 110) | public void setResolver(String resolver) {
    method getFilter (line 114) | public String getFilter() {
    method setFilter (line 118) | public void setFilter(String filter) {
    method getColumnPairMode (line 122) | public ColumnPairMode getColumnPairMode() {
    method setColumnPairMode (line 126) | public void setColumnPairMode(ColumnPairMode columnPairMode) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamediapair/dal/ibatis/IbatisDataMediaPairDAO.java
  class IbatisDataMediaPairDAO (line 34) | public class IbatisDataMediaPairDAO extends SqlMapClientDaoSupport imple...
    method insert (line 36) | public DataMediaPairDO insert(DataMediaPairDO dataMediaPair) {
    method insertColumnPairs (line 42) | public void insertColumnPairs(List<ColumnPair> ColumnPairs) {
    method delete (line 47) | public void delete(Long dataMediaPairId) {
    method update (line 52) | public void update(DataMediaPairDO dataMediaPair) {
    method checkUnique (line 57) | public boolean checkUnique(DataMediaPairDO dataMediaPair) {
    method findById (line 62) | public DataMediaPairDO findById(Long dataMediaPairId) {
    method listAll (line 67) | public List<DataMediaPairDO> listAll() {
    method listByPipelineId (line 72) | public List<DataMediaPairDO> listByPipelineId(Long pipelineId) {
    method listByCondition (line 78) | public List<DataMediaPairDO> listByCondition(Map condition) {
    method listByDataMediaId (line 83) | public List<DataMediaPairDO> listByDataMediaId(Long dataMediaId) {
    method listByMultiId (line 89) | public List<DataMediaPairDO> listByMultiId(Long... identities) {
    method getCount (line 95) | public int getCount() {
    method getCount (line 100) | public int getCount(Map condition) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamediapair/impl/DataMediaPairServiceImpl.java
  class DataMediaPairServiceImpl (line 47) | public class DataMediaPairServiceImpl implements DataMediaPairService {
    method create (line 62) | public void create(DataMediaPair dataMediaPair) {
    method createAndReturnId (line 69) | public Long createAndReturnId(DataMediaPair dataMediaPair) {
    method createIfNotExist (line 95) | public boolean createIfNotExist(DataMediaPair dataMediaPair) {
    method remove (line 116) | public void remove(Long dataMediaPairId) {
    method modify (line 130) | public void modify(DataMediaPair dataMediaPair) {
    method listByIds (line 152) | public List<DataMediaPair> listByIds(Long... identities) {
    method listAll (line 184) | public List<DataMediaPair> listAll() {
    method listByCondition (line 188) | @Override
    method findById (line 210) | public DataMediaPair findById(Long dataMediaPairId) {
    method listByPipelineId (line 225) | public List<DataMediaPair> listByPipelineId(Long pipelineId) {
    method listByPipelineIdWithoutColumn (line 243) | @Override
    method listByDataMediaId (line 262) | @Override
    method getCount (line 281) | public int getCount() {
    method getCount (line 285) | public int getCount(Map condition) {
    method doToModel (line 291) | private DataMediaPair doToModel(DataMediaPairDO dataMediaPairDo, List<...
    method doToModel (line 337) | private List<DataMediaPair> doToModel(List<DataMediaPairDO> dataMediaP...
    method doToModelWithoutOther (line 354) | private List<DataMediaPair> doToModelWithoutOther(List<DataMediaPairDO...
    method modelToDo (line 369) | private DataMediaPairDO modelToDo(DataMediaPair dataMediaPair) {
    method setDataMediaPairDao (line 393) | public void setDataMediaPairDao(DataMediaPairDAO dataMediaPairDao) {
    method setDataMediaService (line 397) | public void setDataMediaService(DataMediaService dataMediaService) {
    method setDataColumnPairService (line 401) | public void setDataColumnPairService(DataColumnPairService dataColumnP...
    method setDataColumnPairGroupService (line 405) | public void setDataColumnPairGroupService(DataColumnPairGroupService d...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamediasource/DataMediaSourceService.java
  type DataMediaSourceService (line 25) | public interface DataMediaSourceService extends GenericService<DataMedia...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamediasource/dal/DataMediaSourceDAO.java
  type DataMediaSourceDAO (line 25) | public interface DataMediaSourceDAO extends GenericDAO<DataMediaSourceDO> {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamediasource/dal/dataobject/DataMediaSourceDO.java
  class DataMediaSourceDO (line 27) | public class DataMediaSourceDO implements Serializable {
    method getId (line 37) | public Long getId() {
    method setId (line 41) | public void setId(Long id) {
    method getName (line 45) | public String getName() {
    method setName (line 49) | public void setName(String name) {
    method getType (line 53) | public DataMediaType getType() {
    method setType (line 57) | public void setType(DataMediaType type) {
    method getGmtCreate (line 61) | public Date getGmtCreate() {
    method setGmtCreate (line 65) | public void setGmtCreate(Date gmtCreate) {
    method getGmtModified (line 69) | public Date getGmtModified() {
    method setGmtModified (line 73) | public void setGmtModified(Date gmtModified) {
    method getProperties (line 77) | public String getProperties() {
    method setProperties (line 81) | public void setProperties(String properties) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamediasource/dal/ibatis/IbatisDataMediaSourceDAO.java
  class IbatisDataMediaSourceDAO (line 33) | public class IbatisDataMediaSourceDAO extends SqlMapClientDaoSupport imp...
    method insert (line 35) | public DataMediaSourceDO insert(DataMediaSourceDO dataMediaSourceDO) {
    method delete (line 41) | public void delete(Long dataMediaSourceId) {
    method update (line 46) | public void update(DataMediaSourceDO dataMediaSourceDO) {
    method checkUnique (line 51) | public boolean checkUnique(DataMediaSourceDO dataMediaSourceDO) {
    method findById (line 56) | public DataMediaSourceDO findById(Long dataMediaSourceId) {
    method listByCondition (line 62) | public List<DataMediaSourceDO> listByCondition(Map condition) {
    method listAll (line 68) | public List<DataMediaSourceDO> listAll() {
    method listByMultiId (line 73) | public List<DataMediaSourceDO> listByMultiId(Long... identities) {
    method getCount (line 79) | public int getCount() {
    method getCount (line 84) | public int getCount(Map condition) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamediasource/impl/DataMediaSourceServiceImpl.java
  class DataMediaSourceServiceImpl (line 41) | public class DataMediaSourceServiceImpl implements DataMediaSourceService {
    method create (line 50) | public void create(DataMediaSource dataMediaSource) {
    method remove (line 75) | public void remove(Long dataMediaSourceId) {
    method modify (line 90) | public void modify(DataMediaSource dataMediaSource) {
    method listAll (line 113) | public List<DataMediaSource> listAll() {
    method listByCondition (line 118) | @Override
    method listByIds (line 137) | public List<DataMediaSource> listByIds(Long... identities) {
    method findById (line 162) | public DataMediaSource findById(Long dataMediaSourceId) {
    method getCount (line 175) | public int getCount() {
    method getCount (line 179) | public int getCount(Map condition) {
    method modelToDo (line 189) | private DataMediaSourceDO modelToDo(DataMediaSource dataMediaSource) {
    method doToModel (line 217) | private DataMediaSource doToModel(DataMediaSourceDO dataMediaSourceDo) {
    method doToModel (line 238) | private List<DataMediaSource> doToModel(List<DataMediaSourceDO> dataMe...
    method setDataMediaSourceDao (line 248) | public void setDataMediaSourceDao(DataMediaSourceDAO dataMediaSourceDa...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/node/NodeService.java
  type NodeService (line 25) | public interface NodeService extends GenericService<Node> {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/node/dal/NodeDAO.java
  type NodeDAO (line 25) | public interface NodeDAO extends GenericDAO<NodeDO> {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/node/dal/dataobject/NodeDO.java
  class NodeDO (line 28) | public class NodeDO implements Serializable {
    method getId (line 41) | public Long getId() {
    method setId (line 45) | public void setId(Long id) {
    method getName (line 49) | public String getName() {
    method setName (line 53) | public void setName(String name) {
    method getIp (line 57) | public String getIp() {
    method setIp (line 61) | public void setIp(String ip) {
    method getPort (line 65) | public Long getPort() {
    method setPort (line 69) | public void setPort(Long port) {
    method getStatus (line 73) | public NodeStatus getStatus() {
    method setStatus (line 77) | public void setStatus(NodeStatus status) {
    method getDescription (line 81) | public String getDescription() {
    method setDescription (line 85) | public void setDescription(String description) {
    method getParameters (line 89) | public NodeParameter getParameters() {
    method setParameters (line 93) | public void setParameters(NodeParameter parameters) {
    method getGmtCreate (line 97) | public Date getGmtCreate() {
    method setGmtCreate (line 101) | public void setGmtCreate(Date gmtCreate) {
    method getGmtModified (line 105) | public Date getGmtModified() {
    method setGmtModified (line 109) | public void setGmtModified(Date gmtModified) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/node/dal/ibatis/IbatisNodeDAO.java
  class IbatisNodeDAO (line 33) | public class IbatisNodeDAO extends SqlMapClientDaoSupport implements Nod...
    method insert (line 35) | public NodeDO insert(NodeDO node) {
    method delete (line 41) | public void delete(Long nodeId) {
    method update (line 46) | public void update(NodeDO node) {
    method checkUnique (line 51) | public boolean checkUnique(NodeDO node) {
    method listByCondition (line 56) | public List<NodeDO> listByCondition(Map condition) {
    method findById (line 61) | public NodeDO findById(Long nodeId) {
    method listAll (line 66) | public List<NodeDO> listAll() {
    method listByMultiId (line 70) | public List<NodeDO> listByMultiId(Long... identities) {
    method getCount (line 75) | public int getCount() {
    method getCount (line 80) | public int getCount(Map condition) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/node/dal/ibatis/NodeParameterTypeHandler.java
  class NodeParameterTypeHandler (line 32) | public class NodeParameterTypeHandler implements TypeHandlerCallback {
    method setParameter (line 34) | @Override
    method getResult (line 39) | @Override
    method valueOf (line 44) | public Object valueOf(String s) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/node/impl/NodeServiceImpl.java
  class NodeServiceImpl (line 47) | public class NodeServiceImpl implements NodeService {
    method create (line 59) | public void create(final Node node) {
    method remove (line 88) | public void remove(final Long nodeId) {
    method modify (line 108) | public void modify(final Node node) {
    method listAll (line 137) | public List<Node> listAll() {
    method findById (line 145) | public Node findById(Long nodeId) {
    method listByIds (line 158) | public List<Node> listByIds(Long... identities) {
    method getCount (line 195) | public int getCount() {
    method getCount (line 199) | public int getCount(Map condition) {
    method listByCondition (line 203) | public List<Node> listByCondition(Map condition) {
    method modelToDo (line 227) | private NodeDO modelToDo(Node node) {
    method doToModel (line 252) | private Node doToModel(NodeDO nodeDo) {
    method doToModel (line 279) | private List<Node> doToModel(List<NodeDO> nodeDos) {
    method setNodeDao (line 290) | public void setNodeDao(NodeDAO nodeDao) {
    method setTransactionTemplate (line 294) | public void setTransactionTemplate(TransactionTemplate transactionTemp...
    method setArbitrateManageService (line 298) | public void setArbitrateManageService(ArbitrateManageService arbitrate...
    method setAutoKeeperClusterService (line 302) | public void setAutoKeeperClusterService(AutoKeeperClusterService autoK...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/parameter/SystemParameterService.java
  type SystemParameterService (line 24) | public interface SystemParameterService {
    method createOrUpdate (line 26) | public void createOrUpdate(SystemParameter systemParameter);
    method find (line 28) | public SystemParameter find();

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/parameter/dal/SystemParameterDAO.java
  type SystemParameterDAO (line 25) | public interface SystemParameterDAO extends GenericDAO<SystemParameterDO> {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/parameter/dal/dataobject/SystemParameterDO.java
  class SystemParameterDO (line 27) | public class SystemParameterDO implements Serializable {
    method getId (line 35) | public Long getId() {
    method setId (line 39) | public void setId(Long id) {
    method getValue (line 43) | public SystemParameter getValue() {
    method setValue (line 47) | public void setValue(SystemParameter value) {
    method getGmtCreate (line 51) | public Date getGmtCreate() {
    method setGmtCreate (line 55) | public void setGmtCreate(Date gmtCreate) {
    method getGmtModified (line 59) | public Date getGmtModified() {
    method setGmtModified (line 63) | public void setGmtModified(Date gmtModified) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/parameter/dal/ibatis/IbatisSystemParameterDAO.java
  class IbatisSystemParameterDAO (line 33) | public class IbatisSystemParameterDAO extends SqlMapClientDaoSupport imp...
    method insert (line 35) | public SystemParameterDO insert(SystemParameterDO systemParameter) {
    method update (line 41) | public void update(SystemParameterDO systemParameter) {
    method delete (line 45) | public void delete(Long parameterId) {
    method checkUnique (line 49) | public boolean checkUnique(SystemParameterDO systemParameter) {
    method findById (line 53) | public SystemParameterDO findById(Long parameterId) {
    method getCount (line 57) | public int getCount() {
    method getCount (line 61) | public int getCount(Map condition) {
    method listAll (line 65) | public List<SystemParameterDO> listAll() {
    method listByCondition (line 69) | public List<SystemParameterDO> listByCondition(Map condition) {
    method listByMultiId (line 73) | public List<SystemParameterDO> listByMultiId(Long... identities) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/parameter/dal/ibatis/SystemParameterTypeHandler.java
  class SystemParameterTypeHandler (line 32) | public class SystemParameterTypeHandler implements TypeHandlerCallback {
    method setParameter (line 34) | @Override
    method getResult (line 39) | @Override
    method valueOf (line 44) | public Object valueOf(String s) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/parameter/impl/SystemParameterServiceImpl.java
  class SystemParameterServiceImpl (line 35) | public class SystemParameterServiceImpl implements SystemParameterService {
    method createOrUpdate (line 44) | public void createOrUpdate(SystemParameter systemParameter) {
    method find (line 56) | public SystemParameter find() {
    method modelToDo (line 72) | private SystemParameterDO modelToDo(SystemParameter systemParameter) {
    method doToModel (line 86) | private SystemParameter doToModel(SystemParameterDO systemParameterDo) {
    method setsystemParameterDao (line 92) | public void setsystemParameterDao(SystemParameterDAO systemParameterDa...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/pipeline/PipelineService.java
  type PipelineService (line 27) | public interface PipelineService extends GenericService<Pipeline> {
    method listByChannelIds (line 29) | public List<Pipeline> listByChannelIds(Long... channelIds);
    method listByChannelIdsWithoutOther (line 31) | public List<Pipeline> listByChannelIdsWithoutOther(Long... channelIds);
    method listByChannelIdsWithoutColumn (line 33) | public List<Pipeline> listByChannelIdsWithoutColumn(Long... channelIds);
    method listByNodeId (line 35) | public List<Pipeline> listByNodeId(Long nodeId);
    method hasRelation (line 37) | public boolean hasRelation(Long nodeId);
    method listByDestinationWithoutOther (line 39) | public List<Pipeline> listByDestinationWithoutOther(String destination);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/pipeline/dal/PipelineDAO.java
  type PipelineDAO (line 27) | public interface PipelineDAO extends GenericDAO<PipelineDO> {
    method listByChannelIds (line 29) | public List<PipelineDO> listByChannelIds(Long... channelId);
    method listByDestinationCondition (line 31) | public List<PipelineDO> listByDestinationCondition(String destination);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/pipeline/dal/PipelineNodeRelationDAO.java
  type PipelineNodeRelationDAO (line 29) | public interface PipelineNodeRelationDAO extends GenericDAO<PipelineNode...
    method insertBatch (line 31) | public void insertBatch(List<PipelineNodeRelationDO> pipelineNodeRelat...
    method updateByNodeId (line 33) | public void updateByNodeId(Long... nodeId);
    method deleteByPipelineId (line 35) | public void deleteByPipelineId(Long pipelineId);
    method deleteByNodeId (line 37) | public void deleteByNodeId(Long... nodeId);
    method listByPipelineIds (line 39) | public List<PipelineNodeRelationDO> listByPipelineIds(Long... pipeline...
    method listByNodeId (line 41) | public List<PipelineNodeRelationDO> listByNodeId(Long nodeId);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/pipeline/dal/dataobject/PipelineDO.java
  class PipelineDO (line 27) | public class PipelineDO implements Serializable {
    method getId (line 38) | public Long getId() {
    method setId (line 42) | public void setId(Long id) {
    method getName (line 46) | public String getName() {
    method setName (line 50) | public void setName(String name) {
    method getParameters (line 54) | public PipelineParameter getParameters() {
    method setParameters (line 58) | public void setParameters(PipelineParameter parameters) {
    method getDescription (line 62) | public String getDescription() {
    method setDescription (line 66) | public void setDescription(String description) {
    method getChannelId (line 70) | public Long getChannelId() {
    method setChannelId (line 74) | public void setChannelId(Long channelId) {
    method getGmtCreate (line 78) | public Date getGmtCreate() {
    method setGmtCreate (line 82) | public void setGmtCreate(Date gmtCreate) {
    method getGmtModified (line 86) | public Date getGmtModified() {
    method setGmtModified (line 90) | public void setGmtModified(Date gmtModified) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/pipeline/dal/dataobject/PipelineNodeRelationDO.java
  class PipelineNodeRelationDO (line 22) | public class PipelineNodeRelationDO implements Serializable {
    type Location (line 32) | public static enum Location {
      method isSelect (line 35) | public boolean isSelect() {
      method isExtract (line 39) | public boolean isExtract() {
      method isLoad (line 43) | public boolean isLoad() {
    method getId (line 48) | public Long getId() {
    method setId (line 52) | public void setId(Long id) {
    method getNodeId (line 56) | public Long getNodeId() {
    method setNodeId (line 60) | public void setNodeId(Long nodeId) {
    method getPipelineId (line 64) | public Long getPipelineId() {
    method setPipelineId (line 68) | public void setPipelineId(Long pipelineId) {
    method getLocation (line 72) | public Location getLocation() {
    method setLocation (line 76) | public void setLocation(Location location) {
    method getGmtCreate (line 80) | public Date getGmtCreate() {
    method setGmtCreate (line 84) | public void setGmtCreate(Date gmtCreate) {
    method getGmtModified (line 88) | public Date getGmtModified() {
    method setGmtModified (line 92) | public void setGmtModified(Date gmtModified) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/pipeline/dal/ibatis/IbatisPipelineDAO.java
  class IbatisPipelineDAO (line 34) | public class IbatisPipelineDAO extends SqlMapClientDaoSupport implements...
    method insert (line 36) | public PipelineDO insert(PipelineDO pipelineDo) {
    method delete (line 42) | public void delete(Long pipelineId) {
    method update (line 47) | public void update(PipelineDO pipelineDO) {
    method checkUnique (line 52) | public boolean checkUnique(PipelineDO pipelineDO) {
    method findById (line 57) | public PipelineDO findById(Long pipelineId) {
    method listByChannelIds (line 62) | public List<PipelineDO> listByChannelIds(Long... channelId) {
    method listByCondition (line 67) | public List<PipelineDO> listByCondition(Map condition) {
    method listAll (line 72) | public List<PipelineDO> listAll() {
    method listByMultiId (line 77) | public List<PipelineDO> listByMultiId(Long... identities) {
    method getCount (line 82) | public int getCount() {
    method getCount (line 87) | public int getCount(Map condition) {
    method listByDestinationCondition (line 92) | public List<PipelineDO> listByDestinationCondition(String canalName) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/pipeline/dal/ibatis/IbatisPipelineNodeRelationDAO.java
  class IbatisPipelineNodeRelationDAO (line 33) | public class IbatisPipelineNodeRelationDAO extends SqlMapClientDaoSuppor...
    method insert (line 35) | public PipelineNodeRelationDO insert(PipelineNodeRelationDO pipelineNo...
    method insertBatch (line 41) | public void insertBatch(List<PipelineNodeRelationDO> pipelineNodeRelat...
    method delete (line 59) | public void delete(Long pipelineNodeRelationId) {
    method update (line 64) | public void update(PipelineNodeRelationDO pipelineNodeRelationDo) {
    method listByPipelineIds (line 69) | public List<PipelineNodeRelationDO> listByPipelineIds(Long... pipeline...
    method listByNodeId (line 75) | public List<PipelineNodeRelationDO> listByNodeId(Long nodeId) {
    method checkUnique (line 80) | public boolean checkUnique(PipelineNodeRelationDO entityObj) {
    method listByCondition (line 85) | public List<PipelineNodeRelationDO> listByCondition(Map condition) {
    method listAll (line 90) | public List<PipelineNodeRelationDO> listAll() {
    method listByMultiId (line 95) | public List<PipelineNodeRelationDO> listByMultiId(Long... identities) {
    method findById (line 100) | public PipelineNodeRelationDO findById(Long identity) {
    method updateByNodeId (line 105) | public void updateByNodeId(Long... nodeId) {
    method deleteByPipelineId (line 110) | public void deleteByPipelineId(Long pipelineId) {
    method deleteByNodeId (line 114) | public void deleteByNodeId(Long... nodeId) {
    method getCount (line 119) | public int getCount() {
    method getCount (line 124) | public int getCount(Map condition) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/pipeline/dal/ibatis/PipelineParameterTypeHandler.java
  class PipelineParameterTypeHandler (line 32) | public class PipelineParameterTypeHandler implements TypeHandlerCallback {
    method setParameter (line 34) | @Override
    method getResult (line 39) | @Override
    method valueOf (line 44) | public Object valueOf(String s) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/pipeline/impl/PipelineServiceImpl.java
  class PipelineServiceImpl (line 53) | public class PipelineServiceImpl implements PipelineService {
    method create (line 68) | public void create(final Pipeline pipeline) {
    method modify (line 129) | public void modify(Pipeline pipeline) {
    method remove (line 182) | public void remove(final Long pipelineId) {
    method getCount (line 207) | public int getCount() {
    method getCount (line 211) | public int getCount(Map condition) {
    method findById (line 219) | public Pipeline findById(Long pipelineId) {
    method listByChannelIds (line 236) | public List<Pipeline> listByChannelIds(Long... channelId) {
    method listByChannelIdsWithoutOther (line 254) | public List<Pipeline> listByChannelIdsWithoutOther(Long... channelIds) {
    method listByChannelIdsWithoutColumn (line 272) | public List<Pipeline> listByChannelIdsWithoutColumn(Long... channelIds) {
    method listByNodeId (line 290) | public List<Pipeline> listByNodeId(Long nodeId) {
    method listByCondition (line 322) | @Override
    method listByIds (line 333) | @Override
    method listAll (line 361) | @Override
    method hasRelation (line 366) | @Override
    method listByDestinationWithoutOther (line 376) | public List<Pipeline> listByDestinationWithoutOther(String destination) {
    method doToModel (line 400) | private Pipeline doToModel(PipelineDO pipelineDo) {
    method doToModelWithoutColumn (line 460) | private Pipeline doToModelWithoutColumn(PipelineDO pipelineDo) {
    method doToModelWithoutOther (line 520) | private Pipeline doToModelWithoutOther(PipelineDO pipelineDo) {
    method doToModel (line 540) | private List<Pipeline> doToModel(List<PipelineDO> pipelineDos) {
    method doToModelWithoutOther (line 548) | private List<Pipeline> doToModelWithoutOther(List<PipelineDO> pipeline...
    method doToModelWithoutColumn (line 556) | private List<Pipeline> doToModelWithoutColumn(List<PipelineDO> pipelin...
    method modelToDo (line 570) | private PipelineDO modelToDo(Pipeline pipeline) {
    method setPipelineDao (line 591) | public void setPipelineDao(PipelineDAO pipelineDao) {
    method setNodeService (line 595) | public void setNodeService(NodeService nodeService) {
    method setPipelineNodeRelationDao (line 599) | public void setPipelineNodeRelationDao(PipelineNodeRelationDAO pipelin...
    method setDataMediaPairService (line 603) | public void setDataMediaPairService(DataMediaPairService dataMediaPair...
    method setTransactionTemplate (line 607) | public void setTransactionTemplate(TransactionTemplate transactionTemp...
    method setArbitrateManageService (line 611) | public void setArbitrateManageService(ArbitrateManageService arbitrate...
    method setArbitrateViewService (line 615) | public void setArbitrateViewService(ArbitrateViewService arbitrateView...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/record/LogRecordService.java
  type LogRecordService (line 28) | public interface LogRecordService extends GenericService<LogRecord> {
    method create (line 30) | public void create(Event event);
    method listByPipelineId (line 32) | public List<LogRecord> listByPipelineId(Long pipelineId);
    method listByPipelineIdWithoutContent (line 34) | public List<LogRecord> listByPipelineIdWithoutContent(Long pipelineId);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/record/dal/LogRecordDAO.java
  type LogRecordDAO (line 29) | public interface LogRecordDAO extends GenericDAO<LogRecordDO> {
    method listByPipelineId (line 31) | public List<LogRecordDO> listByPipelineId(Long pipelineId);
    method listByPipelineIdWithoutContent (line 33) | public List<LogRecordDO> listByPipelineIdWithoutContent(Long pipelineId);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/record/dal/dataobject/LogRecordDO.java
  class LogRecordDO (line 25) | public class LogRecordDO implements Serializable {
    method getId (line 37) | public Long getId() {
    method setId (line 41) | public void setId(Long id) {
    method getPipelineId (line 45) | public Long getPipelineId() {
    method setPipelineId (line 49) | public void setPipelineId(Long pipelineId) {
    method getChannelId (line 53) | public Long getChannelId() {
    method setChannelId (line 57) | public void setChannelId(Long channelId) {
    method getNid (line 61) | public Long getNid() {
    method setNid (line 65) | public void setNid(Long nid) {
    method getTitle (line 69) | public String getTitle() {
    method setTitle (line 73) | public void setTitle(String title) {
    method getMessage (line 77) | public String getMessage() {
    method setMessage (line 81) | public void setMessage(String message) {
    method getGmtCreate (line 85) | public Date getGmtCreate() {
    method setGmtCreate (line 89) | public void setGmtCreate(Date gmtCreate) {
    method getGmtModified (line 93) | public Date getGmtModified() {
    method setGmtModified (line 97) | public void setGmtModified(Date gmtModified) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/record/dal/ibatis/IbatisLogRecordDAO.java
  class IbatisLogRecordDAO (line 33) | public class IbatisLogRecordDAO extends SqlMapClientDaoSupport implement...
    method insert (line 35) | public LogRecordDO insert(LogRecordDO entityObj) {
    method delete (line 41) | public void delete(Long identity) {
    method update (line 47) | public void update(LogRecordDO entityObj) {
    method listAll (line 53) | public List<LogRecordDO> listAll() {
    method listByCondition (line 58) | public List<LogRecordDO> listByCondition(Map condition) {
    method listByMultiId (line 65) | public List<LogRecordDO> listByMultiId(Long... identities) {
    method findById (line 70) | public LogRecordDO findById(Long identity) {
    method getCount (line 75) | public int getCount() {
    method getCount (line 80) | public int getCount(Map condition) {
    method checkUnique (line 86) | public boolean checkUnique(LogRecordDO entityObj) {
    method listByPipelineId (line 91) | public List<LogRecordDO> listByPipelineId(Long pipelineId) {
    method listByPipelineIdWithoutContent (line 97) | public List<LogRecordDO> listByPipelineIdWithoutContent(Long pipelineI...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/record/impl/LogRecordServiceImpl.java
  class LogRecordServiceImpl (line 45) | public class LogRecordServiceImpl implements LogRecordService {
    method create (line 52) | public void create(Event event) {
    method create (line 66) | public void create(LogRecord entityObj) {
    method remove (line 71) | public void remove(Long identity) {
    method modify (line 77) | public void modify(LogRecord entityObj) {
    method findById (line 81) | public LogRecord findById(Long identity) {
    method listByPipelineId (line 86) | public List<LogRecord> listByPipelineId(Long pipelineId) {
    method listByPipelineIdWithoutContent (line 92) | public List<LogRecord> listByPipelineIdWithoutContent(Long pipelineId) {
    method listByIds (line 98) | public List<LogRecord> listByIds(Long... identities) {
    method listAll (line 103) | public List<LogRecord> listAll() {
    method listByCondition (line 108) | public List<LogRecord> listByCondition(Map condition) {
    method getCount (line 118) | public int getCount() {
    method getCount (line 123) | public int getCount(Map condition) {
    method modelToDo (line 139) | private LogRecordDO modelToDo(LogRecord entityObj) {
    method doToModel (line 179) | private LogRecord doToModel(LogRecordDO logRecordDo) {
    method doToModel (line 225) | private List<LogRecord> doToModel(List<LogRecordDO> logRecordDos) {
    method getChannelService (line 240) | public ChannelService getChannelService() {
    method setChannelService (line 244) | public void setChannelService(ChannelService channelService) {
    method getLogRecordDao (line 248) | public LogRecordDAO getLogRecordDao() {
    method setLogRecordDao (line 252) | public void setLogRecordDao(LogRecordDAO logRecordDao) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/utils/ListTypeHandler.java
  class ListTypeHandler (line 33) | public class ListTypeHandler implements TypeHandlerCallback {
    method setParameter (line 35) | @Override
    method getResult (line 40) | @Override
    method valueOf (line 46) | public Object valueOf(String s) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/utils/MapTypeHandler.java
  class MapTypeHandler (line 32) | public class MapTypeHandler implements TypeHandlerCallback {
    method setParameter (line 34) | @Override
    method getResult (line 39) | @Override
    method valueOf (line 44) | public Object valueOf(String s) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/AlarmController.java
  type AlarmController (line 26) | public interface AlarmController {
    method control (line 28) | public AlarmMessage control(AlarmRule rule, String message, AlarmMessa...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/AlarmRecovery.java
  type AlarmRecovery (line 27) | public interface AlarmRecovery {
    method recovery (line 32) | public void recovery(Long channelId);
    method recovery (line 37) | public void recovery(AlarmRule alarmRule);
    method recovery (line 42) | public void recovery(AlarmRule alarmRule, long alarmCount);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/Monitor.java
  type Monitor (line 29) | public interface Monitor {
    method explore (line 31) | public void explore();
    method explore (line 33) | public void explore(Long... pipelineIds);
    method explore (line 35) | public void explore(List<AlarmRule> rules);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/MonitorRuleExplorerRegisty.java
  class MonitorRuleExplorerRegisty (line 33) | public class MonitorRuleExplorerRegisty {
    method register (line 39) | public static void register(MonitorName monitorName, Monitor explorer) {
    method register (line 43) | synchronized public static void register(MonitorName monitorName, Stri...
    method findExplorer (line 66) | public static Collection<Monitor> findExplorer(MonitorName monitorName) {
    method unRegister (line 77) | public static void unRegister(MonitorName monitorName, Monitor explore...
    method unRegister (line 91) | public static void unRegister(MonitorName monitorName, String explorer...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/MonitorTimer.java
  class MonitorTimer (line 28) | public class MonitorTimer extends ConcurrentHashMap<MonitorName, Date> {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/PassiveMonitor.java
  type PassiveMonitor (line 29) | public interface PassiveMonitor {
    method feed (line 31) | public void feed(Object data, Long pipelineId);
    method feed (line 33) | public void feed(Object data, List<AlarmRule> rules);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/impl/AbstractRuleMonitor.java
  class AbstractRuleMonitor (line 45) | public abstract class AbstractRuleMonitor implements Monitor, PassiveMon...
    method explore (line 58) | @Override
    method explore (line 63) | @Override
    method feed (line 68) | @Override
    method feed (line 73) | @Override
    method sendAlarm (line 78) | protected void sendAlarm(AlarmRule rule, String message) {
    method logRecordAlarm (line 94) | protected void logRecordAlarm(Long pipelineId, MonitorName monitorName...
    method logRecordAlarm (line 98) | protected void logRecordAlarm(Long pipelineId, Long nodeId, MonitorNam...
    method postProcessAlarmData (line 110) | protected void postProcessAlarmData(AlarmMessage data) {
    method inPeriod (line 116) | protected boolean inPeriod(AlarmRule alarmRule) {
    method checkInPeriod (line 150) | protected boolean checkInPeriod(Calendar now, String start, String end) {
    method isAfter (line 154) | protected boolean isAfter(Calendar now, String time) {
    method isInPeriodWhenErrorFormat (line 186) | protected boolean isInPeriodWhenErrorFormat() {
    method isInPeriodWhenNoPeriod (line 193) | protected boolean isInPeriodWhenNoPeriod() {
    method currentCalendar (line 200) | protected Calendar currentCalendar() {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/impl/AlarmRecoveryDelayed.java
  class AlarmRecoveryDelayed (line 30) | public class AlarmRecoveryDelayed implements Delayed {
    method AlarmRecoveryDelayed (line 40) | public AlarmRecoveryDelayed(long channelId, long ruleId, boolean stop,...
    method getChannelId (line 48) | public long getChannelId() {
    method getRuleId (line 52) | public long getRuleId() {
    method getNow (line 56) | public long getNow() {
    method isStop (line 60) | public boolean isStop() {
    method setStop (line 64) | public void setStop(boolean stop) {
    method getDelay (line 68) | public long getDelay(TimeUnit unit) {
    method compareTo (line 74) | public int compareTo(Delayed other) {
    method hashCode (line 87) | @Override
    method equals (line 95) | public boolean equals(Object obj) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/impl/DefaultAlarmController.java
  class DefaultAlarmController (line 33) | public class DefaultAlarmController implements AlarmController {
    method control (line 40) | @Override
    class PoolKey (line 83) | private static class PoolKey {
      method PoolKey (line 90) | public PoolKey(AlarmRule rule, String messageToSend, AlarmMessage da...
      method hashCode (line 98) | @Override
      method equals (line 109) | @Override
    class PoolValue (line 130) | private static class PoolValue {
      method PoolValue (line 135) | public PoolValue(Long happendTime){
      method addSuppressTimes (line 142) | public void addSuppressTimes() {
      method getSuppressTimes (line 149) | public long getSuppressTimes() {
      method getLastAlarmTime (line 156) | public Long getLastAlarmTime() {
      method updateAlarmTime (line 163) | public void updateAlarmTime(Long lastAlarmTime) {
    method setRestartAlarmRecovery (line 169) | public void setRestartAlarmRecovery(AlarmRecovery restartAlarmRecovery) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/impl/DelayStatRuleMonitor.java
  class DelayStatRuleMonitor (line 34) | public class DelayStatRuleMonitor extends AbstractRuleMonitor {
    method explore (line 42) | @Override
    method checkDelayTime (line 82) | private boolean checkDelayTime(AlarmRule rule, Long delayTime) {
    method setDelayStatService (line 98) | public void setDelayStatService(DelayStatService delayStatService) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/impl/ExceptionRuleMonitor.java
  class ExceptionRuleMonitor (line 38) | public class ExceptionRuleMonitor extends AbstractRuleMonitor {
    method explore (line 49) | @Override
    method feed (line 54) | @Override
    method checkEnable (line 85) | private boolean checkEnable(AlarmRule rule, Date now) {
    method check (line 89) | private void check(AlarmRule rule, NodeAlarmEvent alarmEvent) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/impl/GlobalMonitor.java
  class GlobalMonitor (line 56) | public class GlobalMonitor implements Monitor, InitializingBean, Disposa...
    method explore (line 73) | @Override
    method concurrentProcess (line 97) | private void concurrentProcess(Map<Long, List<AlarmRule>> rules) {
    method serialProcess (line 138) | private void serialProcess(Map<Long, List<AlarmRule>> rules) {
    method concurrentProcess (line 145) | private void concurrentProcess(List<Long> channelIds) {
    method serialProcess (line 188) | private void serialProcess(List<Long> channelIds) {
    method afterPropertiesSet (line 197) | @Override
    method destroy (line 207) | @Override
    method explore (line 214) | @Override
    method explore (line 219) | @Override
    method setnThreads (line 225) | public void setnThreads(int nThreads) {
    method setNeedConcurrent (line 229) | public void setNeedConcurrent(boolean needConcurrent) {
    method setAlarmRuleService (line 233) | public void setAlarmRuleService(AlarmRuleService alarmRuleService) {
    method setPipelineMonitor (line 237) | public void setPipelineMonitor(Monitor pipelineMonitor) {
    method setChannelService (line 241) | public void setChannelService(ChannelService channelService) {
    method setArbitrateManageService (line 245) | public void setArbitrateManageService(ArbitrateManageService arbitrate...
    method setRestartAlarmRecovery (line 249) | public void setRestartAlarmRecovery(AlarmRecovery restartAlarmRecovery) {
    method setRecoveryPaused (line 253) | public void setRecoveryPaused(boolean recoveryPaused) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/impl/PipelineMonitor.java
  class PipelineMonitor (line 36) | public class PipelineMonitor implements Monitor {
    method explore (line 59) | @Override
    method checkEnable (line 126) | private boolean checkEnable(AlarmRule rule, Date now) {
    method explore (line 130) | public void explore() {
    method explore (line 134) | public void explore(Long... pipelineIds) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/impl/PipelineTimeoutRuleMonitor.java
  class PipelineTimeoutRuleMonitor (line 39) | public class PipelineTimeoutRuleMonitor extends AbstractRuleMonitor {
    method PipelineTimeoutRuleMonitor (line 46) | PipelineTimeoutRuleMonitor(){
    method explore (line 50) | @Override
    method checkTimeout (line 80) | private boolean checkTimeout(AlarmRule rule, long elapsed) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/impl/PositionTimeoutRuleMonitor.java
  class PositionTimeoutRuleMonitor (line 39) | public class PositionTimeoutRuleMonitor extends AbstractRuleMonitor {
    method PositionTimeoutRuleMonitor (line 45) | PositionTimeoutRuleMonitor(){
    method explore (line 49) | @Override
    method checkTimeout (line 80) | private boolean checkTimeout(AlarmRule rule, long elapsed) {
    method setPipelineService (line 96) | public void setPipelineService(PipelineService pipelineService) {
    method setArbitrateViewService (line 100) | public void setArbitrateViewService(ArbitrateViewService arbitrateView...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/impl/ProcessTimeoutRuleMonitor.java
  class ProcessTimeoutRuleMonitor (line 41) | public class ProcessTimeoutRuleMonitor extends AbstractRuleMonitor {
    method ProcessTimeoutRuleMonitor (line 48) | ProcessTimeoutRuleMonitor(){
    method explore (line 52) | @Override
    method checkTimeout (line 89) | private String checkTimeout(AlarmRule rule, Map<Long, Long> processTim...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/impl/RestartAlarmRecovery.java
  class RestartAlarmRecovery (line 44) | public class RestartAlarmRecovery implements AlarmRecovery, Initializing...
    method recovery (line 55) | public void recovery(Long channelId) {
    method recovery (line 65) | public void recovery(AlarmRule alarmRule) {
    method recovery (line 77) | public void recovery(AlarmRule alarmRule, long alarmCount) {
    method processRecovery (line 93) | private boolean processRecovery(Long channelId, Long ruleId, boolean n...
    method afterPropertiesSet (line 128) | public void afterPropertiesSet() throws Exception {
    method destroy (line 150) | public void destroy() throws Exception {
    method setArbitrateManageService (line 154) | public void setArbitrateManageService(ArbitrateManageService arbitrate...
    method setPipelineService (line 158) | public void setPipelineService(PipelineService pipelineService) {
    method setExceptionRuleMonitor (line 162) | public void setExceptionRuleMonitor(PassiveMonitor exceptionRuleMonito...
    method setChannelService (line 166) | public void setChannelService(ChannelService channelService) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/impl/SelfMonitor.java
  class SelfMonitor (line 26) | public class SelfMonitor implements Monitor, InitializingBean, Disposabl...
    method explore (line 36) | public void explore() {
    method explore (line 40) | public void explore(Long... pipelineIds) {
    method explore (line 44) | public void explore(List<AlarmRule> rules) {
    method destroy (line 48) | public void destroy() throws Exception {
    method afterPropertiesSet (line 54) | public void afterPropertiesSet() throws Exception {
    method start (line 60) | private synchronized void start() {
    method stop (line 79) | private synchronized void stop() {
    method setMonitor (line 93) | public void setMonitor(GlobalMonitor monitor) {
    method setEnable (line 97) | public void setEnable(boolean enable) {
    method setInterval (line 101) | public void setInterval(int interval) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/remote/ArbitrateRemoteService.java
  type ArbitrateRemoteService (line 23) | public interface ArbitrateRemoteService {
    method onNodeAlarm (line 28) | public void onNodeAlarm(NodeAlarmEvent event);
    method onStopNode (line 33) | public void onStopNode(StopNodeEvent event);
    method onStopChannel (line 38) | public void onStopChannel(StopChannelEvent event);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/remote/CanalRemoteService.java
  type CanalRemoteService (line 29) | public interface CanalRemoteService {
    method onFindCanal (line 34) | public Canal onFindCanal(FindCanalEvent event);
    method onFindFilter (line 39) | public String onFindFilter(FindFilterEvent event);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/remote/ConfigRemoteService.java
  type ConfigRemoteService (line 33) | public interface ConfigRemoteService {
    method notifyChannel (line 38) | public boolean notifyChannel(Channel channel);
    method onFindChannel (line 43) | public Channel onFindChannel(FindChannelEvent event);
    method onFindNode (line 48) | public Node onFindNode(FindNodeEvent event);
    method onFindTask (line 53) | public List<Channel> onFindTask(FindTaskEvent event);
    method onFindMedia (line 58) | public String onFindMedia(FindMediaEvent event);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/remote/NodeRemoteService.java
  type NodeRemoteService (line 26) | public interface NodeRemoteService {
    method getRunningPipelineCount (line 31) | public int getRunningPipelineCount(Long nid);
    method getRunningPipelines (line 36) | public List<Long> getRunningPipelines(Long nid);
    method getHeapMemoryUsage (line 41) | public String getHeapMemoryUsage(Long nid);
    method getNodeSystemInfo (line 46) | public String getNodeSystemInfo(Long nid);
    method getNodeVersionInfo (line 51) | public String getNodeVersionInfo(Long nid);
    method getThreadPoolSize (line 56) | public int getThreadPoolSize(Long nid);
    method getThreadActiveSize (line 61) | public int getThreadActiveSize(Long nid);
    method setProfile (line 66) | public void setProfile(Long nid, boolean profile);
    method setThreadPoolSize (line 71) | public void setThreadPoolSize(Long nid, int size);
    method isSelectRunning (line 76) | public boolean isSelectRunning(Long nid, Long pipelineId);
    method isExtractRunning (line 81) | public boolean isExtractRunning(Long nid, Long pipelineId);
    method isTransformRunning (line 86) | public boolean isTransformRunning(Long nid, Long pipelineId);
    method isLoadRunning (line 91) | public boolean isLoadRunning(Long nid, Long pipelineId);
    method selectStageAggregation (line 96) | public String selectStageAggregation(Long nid, Long pipelineId);
    method extractStageAggregation (line 101) | public String extractStageAggregation(Long nid, Long pipelineId);
    method transformStageAggregation (line 106) | public String transformStageAggregation(Long nid, Long pipelineId);
    method loadStageAggregation (line 111) | public String loadStageAggregation(Long nid, Long pipelineId);
    method selectPendingProcess (line 116) | public String selectPendingProcess(Long nid, Long pipelineId);
    method extractPendingProcess (line 121) | public String extractPendingProcess(Long nid, Long pipelineId);
    method transformPendingProcess (line 126) | public String transformPendingProcess(Long nid, Long pipelineId);
    method loadPendingProcess (line 131) | public String loadPendingProcess(Long nid, Long pipelineId);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/remote/StatsRemoteService.java
  type StatsRemoteService (line 28) | public interface StatsRemoteService {
    method onDelayCount (line 33) | public void onDelayCount(DelayCountEvent event);
    method onTableStat (line 38) | public void onTableStat(TableStatEvent event);
    method onThroughputStat (line 43) | public void onThroughputStat(ThroughputStatEvent event);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/remote/impl/ArbitrateRemoteServiceImpl.java
  class ArbitrateRemoteServiceImpl (line 43) | public class ArbitrateRemoteServiceImpl implements ArbitrateRemoteService {
    method ArbitrateRemoteServiceImpl (line 50) | public ArbitrateRemoteServiceImpl(){
    method onNodeAlarm (line 56) | public void onNodeAlarm(NodeAlarmEvent event) {
    method onStopChannel (line 64) | public void onStopChannel(StopChannelEvent event) {
    method onStopNode (line 68) | public void onStopNode(StopNodeEvent event) {
    method setChannelService (line 82) | public void setChannelService(ChannelService channelService) {
    method setArbitrateManageService (line 86) | public void setArbitrateManageService(ArbitrateManageService arbitrate...
    method setExceptionRuleMonitor (line 90) | public void setExceptionRuleMonitor(PassiveMonitor exceptionRuleMonito...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/remote/impl/CanalRemoteServiceImpl.java
  class CanalRemoteServiceImpl (line 34) | public class CanalRemoteServiceImpl implements CanalRemoteService {
    method CanalRemoteServiceImpl (line 41) | public CanalRemoteServiceImpl(){
    method onFindCanal (line 46) | public Canal onFindCanal(FindCanalEvent event) {
    method onFindFilter (line 59) | public String onFindFilter(FindFilterEvent event) {
    method setCanalService (line 64) | public void setCanalService(CanalService canalService) {
    method setTsdbJdbcUrl (line 68) | public void setTsdbJdbcUrl(String tsdbJdbcUrl) {
    method setTsdbJdbcUserName (line 72) | public void setTsdbJdbcUserName(String tsdbJdbcUserName) {
    method setTsdbJdbcPassword (line 76) | public void setTsdbJdbcPassword(String tsdbJdbcPassword) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/remote/impl/ConfigRemoteServiceImpl.java
  class ConfigRemoteServiceImpl (line 58) | public class ConfigRemoteServiceImpl implements ConfigRemoteService {
    method ConfigRemoteServiceImpl (line 66) | public ConfigRemoteServiceImpl(){
    method notifyChannel (line 74) | public boolean notifyChannel(final Channel channel) {
    method onFindChannel (line 139) | public Channel onFindChannel(FindChannelEvent event) {
    method onFindNode (line 154) | public Node onFindNode(FindNodeEvent event) {
    method onFindTask (line 160) | public List<Channel> onFindTask(FindTaskEvent event) {
    method onFindMedia (line 167) | public String onFindMedia(FindMediaEvent event) {
    method setCommunicationClient (line 176) | public void setCommunicationClient(CommunicationClient communicationCl...
    method setChannelService (line 180) | public void setChannelService(ChannelService channelService) {
    method setNodeService (line 184) | public void setNodeService(NodeService nodeService) {
    method setDataMatrixService (line 188) | public void setDataMatrixService(DataMatrixService dataMatrixService) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/remote/impl/NodeMBeanServiceImpl.java
  class NodeMBeanServiceImpl (line 42) | public class NodeMBeanServiceImpl implements NodeRemoteService {
    method NodeMBeanServiceImpl (line 50) | public NodeMBeanServiceImpl(){
    method getHeapMemoryUsage (line 87) | public String getHeapMemoryUsage(Long nid) {
    method getNodeSystemInfo (line 91) | public String getNodeSystemInfo(Long nid) {
    method getNodeVersionInfo (line 95) | public String getNodeVersionInfo(Long nid) {
    method getRunningPipelineCount (line 99) | public int getRunningPipelineCount(Long nid) {
    method getRunningPipelines (line 103) | public List<Long> getRunningPipelines(Long nid) {
    method getThreadPoolSize (line 107) | public int getThreadPoolSize(Long nid) {
    method setProfile (line 111) | public void setProfile(Long nid, boolean profile) {
    method setThreadPoolSize (line 123) | public void setThreadPoolSize(Long nid, int size) {
    method getThreadActiveSize (line 135) | public int getThreadActiveSize(Long nid) {
    method isSelectRunning (line 139) | public boolean isSelectRunning(Long nid, Long pipelineId) {
    method isExtractRunning (line 143) | public boolean isExtractRunning(Long nid, Long pipelineId) {
    method isTransformRunning (line 147) | public boolean isTransformRunning(Long nid, Long pipelineId) {
    method isLoadRunning (line 151) | public boolean isLoadRunning(Long nid, Long pipelineId) {
    method selectStageAggregation (line 155) | public String selectStageAggregation(Long nid, Long pipelineId) {
    method extractStageAggregation (line 159) | public String extractStageAggregation(Long nid, Long pipelineId) {
    method transformStageAggregation (line 163) | public String transformStageAggregation(Long nid, Long pipelineId) {
    method loadStageAggregation (line 167) | public String loadStageAggregation(Long nid, Long pipelineId) {
    method selectPendingProcess (line 171) | public String selectPendingProcess(Long nid, Long pipelineId) {
    method extractPendingProcess (line 175) | public String extractPendingProcess(Long nid, Long pipelineId) {
    method transformPendingProcess (line 179) | public String transformPendingProcess(Long nid, Long pipelineId) {
    method loadPendingProcess (line 183) | public String loadPendingProcess(Long nid, Long pipelineId) {
    method getAttribute (line 187) | private Object getAttribute(Long nid, String attribute) {
    method invoke (line 196) | private Object invoke(Long nid, Long pipelineId, String method) {
    method setNodeService (line 210) | public void setNodeService(NodeService nodeService) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/remote/impl/StatsRemoteServiceImpl.java
  class StatsRemoteServiceImpl (line 55) | public class StatsRemoteServiceImpl implements StatsRemoteService {
    method StatsRemoteServiceImpl (line 67) | public StatsRemoteServiceImpl(){
    method onDelayCount (line 113) | public void onDelayCount(DelayCountEvent event) {
    method onThroughputStat (line 134) | public void onThroughputStat(ThroughputStatEvent event) {
    method onTableStat (line 165) | public void onTableStat(TableStatEvent event) {
    method flushDelayStat (line 173) | private void flushDelayStat() {
    method flushThroughputStat (line 189) | private void flushThroughputStat() {
    class AvgStat (line 201) | public static class AvgStat {
      method merge (line 206) | public void merge(DelayStat stat) {
      method getAvg (line 211) | public Long getAvg() {
    method setDelayStatService (line 222) | public void setDelayStatService(DelayStatService delayStatService) {
    method setTableStatService (line 226) | public void setTableStatService(TableStatService tableStatService) {
    method setThroughputStatService (line 230) | public void setThroughputStatService(ThroughputStatService throughputS...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/remote/interceptor/RemoteExceptionLoggerInterceptor.java
  class RemoteExceptionLoggerInterceptor (line 36) | public class RemoteExceptionLoggerInterceptor implements ThrowsAdvice {
    method afterThrowing (line 40) | public void afterThrowing(Throwable ex) throws Throwable {
    method getStackTrace (line 66) | private String getStackTrace(Throwable ex) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/delay/DelayCounter.java
  type DelayCounter (line 23) | public interface DelayCounter {
    method incAndGet (line 25) | public Long incAndGet(Long pipelineId, Long number);
    method decAndGet (line 27) | public Long decAndGet(Long pipelineId, Long number);
    method setAndGet (line 29) | public Long setAndGet(Long pipelineId, Long number);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/delay/DelayStatService.java
  type DelayStatService (line 30) | public interface DelayStatService {
    method createDelayStat (line 32) | public void createDelayStat(DelayStat stat);
    method findRealtimeDelayStat (line 34) | public DelayStat findRealtimeDelayStat(Long pipelineId);
    method listTimelineDelayStat (line 36) | public Map<Long, DelayStatInfo> listTimelineDelayStat(Long pipelineId,...
    method listTopDelayStat (line 38) | public List<TopDelayStat> listTopDelayStat(String searchKey, int topN);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/delay/dal/DelayStatDAO.java
  type DelayStatDAO (line 28) | public interface DelayStatDAO {
    method insertDelayStat (line 30) | public void insertDelayStat(DelayStatDO delayStat);
    method deleteDelayStat (line 32) | public void deleteDelayStat(Long delayStatId);
    method modifyDelayStat (line 34) | public void modifyDelayStat(DelayStatDO delayStat);
    method findDelayStatById (line 36) | public DelayStatDO findDelayStatById(Long delayStatId);
    method findRealtimeDelayStat (line 38) | public DelayStatDO findRealtimeDelayStat(Long pipelineId);
    method listDelayStatsByPipelineId (line 40) | public List<DelayStatDO> listDelayStatsByPipelineId(Long pipelineId);
    method listTimelineDelayStatsByPipelineId (line 42) | public List<DelayStatDO> listTimelineDelayStatsByPipelineId(Long pipel...
    method listTopDelayStatsByName (line 44) | public List<TopDelayStat> listTopDelayStatsByName(String name, int topN);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/delay/dal/dataobject/DelayStatDO.java
  class DelayStatDO (line 30) | public class DelayStatDO implements Serializable {
    method getId (line 40) | public Long getId() {
    method setId (line 44) | public void setId(Long id) {
    method getDelayTime (line 48) | public Long getDelayTime() {
    method setDelayTime (line 52) | public void setDelayTime(Long delayTime) {
    method getDelayNumber (line 56) | public Long getDelayNumber() {
    method setDelayNumber (line 60) | public void setDelayNumber(Long delayNumber) {
    method getPipelineId (line 64) | public Long getPipelineId() {
    method setPipelineId (line 68) | public void setPipelineId(Long pipelineId) {
    method getGmtCreate (line 72) | public Date getGmtCreate() {
    method setGmtCreate (line 76) | public void setGmtCreate(Date gmtCreate) {
    method getGmtModified (line 80) | public Date getGmtModified() {
    method setGmtModified (line 84) | public void setGmtModified(Date gmtModified) {
    method toString (line 88) | @Override

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/delay/dal/ibatis/IbatisDelayStatDAO.java
  class IbatisDelayStatDAO (line 35) | public class IbatisDelayStatDAO extends SqlMapClientDaoSupport implement...
    method insertDelayStat (line 37) | @Override
    method deleteDelayStat (line 43) | @Override
    method modifyDelayStat (line 49) | @Override
    method findDelayStatById (line 55) | @Override
    method findRealtimeDelayStat (line 61) | @Override
    method listDelayStatsByPipelineId (line 67) | @Override
    method listTimelineDelayStatsByPipelineId (line 73) | @Override
    method listTopDelayStatsByName (line 83) | public List<TopDelayStat> listTopDelayStatsByName(String searchKey, in...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/delay/impl/DelayStatServiceImpl.java
  class DelayStatServiceImpl (line 36) | public class DelayStatServiceImpl implements DelayStatService {
    method getDelayStatDao (line 40) | public DelayStatDAO getDelayStatDao() {
    method setDelayStatDao (line 44) | public void setDelayStatDao(DelayStatDAO delayStatDao) {
    method createDelayStat (line 51) | public void createDelayStat(DelayStat stat) {
    method findRealtimeDelayStat (line 59) | public DelayStat findRealtimeDelayStat(Long pipelineId) {
    method listTimelineDelayStat (line 72) | public Map<Long, DelayStatInfo> listTimelineDelayStat(Long pipelineId,...
    method listTopDelayStat (line 101) | public List<TopDelayStat> listTopDelayStat(String searchKey, int topN) {
    method delayStatModelToDo (line 111) | private DelayStatDO delayStatModelToDo(DelayStat delayStat) {
    method delayStatDOToModel (line 129) | private DelayStat delayStatDOToModel(DelayStatDO delayStatDO) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/delay/param/DelayCountParam.java
  class DelayCountParam (line 22) | public class DelayCountParam {
    method getPipelineId (line 27) | public Long getPipelineId() {
    method setPipelineId (line 31) | public void setPipelineId(Long pipelineId) {
    method getNumber (line 35) | public Long getNumber() {
    method setNumber (line 39) | public void setNumber(Long number) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/delay/param/DelayStatInfo.java
  class DelayStatInfo (line 24) | public class DelayStatInfo implements Serializable {
    method getAvgDelayNumber (line 33) | public Double getAvgDelayNumber() {
    method getAvgDelayTime (line 48) | public Double getAvgDelayTime() {
    method getItems (line 61) | public List<DelayStat> getItems() {
    method setItems (line 65) | public void setItems(List<DelayStat> items) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/delay/param/TimelineDelayCondition.java
  class TimelineDelayCondition (line 24) | public class TimelineDelayCondition {
    method getPipelineId (line 30) | public Long getPipelineId() {
    method setPipelineId (line 34) | public void setPipelineId(Long pipelineId) {
    method getStart (line 38) | public Date getStart() {
    method setStart (line 42) | public void setStart(Date start) {
    method getEnd (line 46) | public Date getEnd() {
    method setEnd (line 50) | public void setEnd(Date end) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/delay/param/TopDelayStat.java
  class TopDelayStat (line 25) | public class TopDelayStat {
    method getChannelName (line 37) | public String getChannelName() {
    method setChannelName (line 41) | public void setChannelName(String channelName) {
    method getPipelineName (line 45) | public String getPipelineName() {
    method setPipelineName (line 49) | public void setPipelineName(String pipelineName) {
    method getChannelId (line 53) | public Long getChannelId() {
    method setChannelId (line 57) | public void setChannelId(Long channelId) {
    method getPipelineId (line 61) | public Long getPipelineId() {
    method setPipelineId (line 65) | public void setPipelineId(Long pipelineId) {
    method getDelayTime (line 69) | public Long getDelayTime() {
    method setDelayTime (line 73) | public void setDelayTime(Long delayTime) {
    method getLastUpdate (line 77) | public Date getLastUpdate() {
    method setLastUpdate (line 81) | public void setLastUpdate(Date lastUpdate) {
    method getStatTime (line 85) | public Long getStatTime() {
    method setStatTime (line 89) | public void setStatTime(Long statTime) {
    method getDbStat (line 93) | public DataStat getDbStat() {
    method setDbStat (line 97) | public void setDbStat(DataStat dbStat) {
    method getFileStat (line 101) | public DataStat getFileStat() {
    method setFileStat (line 105) | public void setFileStat(DataStat fileStat) {
    method getLastUpdateDelay (line 112) | public Long getLastUpdateDelay() {
    class DataStat (line 116) | public static class DataStat {
      method DataStat (line 118) | public DataStat(Long number, Long size){
      method getNumber (line 126) | public Long getNumber() {
      method setNumber (line 130) | public void setNumber(Long number) {
      method getSize (line 134) | public Long getSize() {
      method setSize (line 138) | public void setSize(Long size) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/stage/ProcessStatService.java
  type ProcessStatService (line 27) | public interface ProcessStatService {
    method listRealtimeProcessStat (line 29) | public List<ProcessStat> listRealtimeProcessStat(Long pipelineId);
    method listRealtimeProcessStat (line 31) | public List<ProcessStat> listRealtimeProcessStat(Long channelId, Long ...
    method listTimelineProcessStat (line 33) | public List<ProcessStat> listTimelineProcessStat(Long pipelineId, Date...
    method createProcessStat (line 35) | public void createProcessStat(ProcessStat stat);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/stage/dal/ProcessDAO.java
  type ProcessDAO (line 28) | public interface ProcessDAO {
    method insertProcessStat (line 30) | public void insertProcessStat(ProcessStatDO processStat);
    method deleteProcessStat (line 32) | public void deleteProcessStat(Long processId);
    method modifyProcessStat (line 34) | public void modifyProcessStat(ProcessStatDO processStat);
    method findByProcessId (line 36) | public ProcessStatDO findByProcessId(Long processId);
    method listAllProcessStat (line 38) | public List<ProcessStatDO> listAllProcessStat();
    method listProcessStatsByPipelineId (line 40) | public List<ProcessStatDO> listProcessStatsByPipelineId(Long pipelineId);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/stage/dal/dataobject/ProcessStatDO.java
  class ProcessStatDO (line 33) | public class ProcessStatDO implements Serializable {
    method getPipelineId (line 40) | public Long getPipelineId() {
    method setPipelineId (line 44) | public void setPipelineId(Long pipelineId) {
    method getProcessId (line 48) | public Long getProcessId() {
    method setProcessId (line 52) | public void setProcessId(Long processId) {
    method getStageStats (line 56) | public List<StageStat> getStageStats() {
    method setStageStats (line 60) | public void setStageStats(List<StageStat> stageStats) {
    method toString (line 64) | @Override

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/stage/dal/ibatis/IbatisProcessDAO.java
  class IbatisProcessDAO (line 31) | public class IbatisProcessDAO extends SqlMapClientDaoSupport implements ...
    method insertProcessStat (line 33) | @Override
    method deleteProcessStat (line 39) | @Override
    method modifyProcessStat (line 44) | @Override
    method findByProcessId (line 49) | @Override
    method listAllProcessStat (line 55) | @Override
    method listProcessStatsByPipelineId (line 61) | @Override

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/stage/impl/ProcessStatServiceImpl.java
  class ProcessStatServiceImpl (line 32) | public class ProcessStatServiceImpl implements ProcessStatService {
    method createProcessStat (line 37) | public void createProcessStat(ProcessStat stat) {
    method listRealtimeProcessStat (line 41) | @Override
    method listRealtimeProcessStat (line 47) | @Override
    method listTimelineProcessStat (line 52) | @Override
    method setArbitrateViewService (line 59) | public void setArbitrateViewService(ArbitrateViewService arbitrateView...
    method setChannelService (line 63) | public void setChannelService(ChannelService channelService) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/table/TableStatService.java
  type TableStatService (line 29) | public interface TableStatService {
    method updateTableStat (line 34) | public void updateTableStat(TableStat stat);
    method listTableStat (line 39) | public List<TableStat> listTableStat(Long pipelineId);
    method insertBehaviorHistory (line 44) | public void insertBehaviorHistory(TableStat stat);
    method listTimelineBehaviorHistory (line 49) | public Map<Long, BehaviorHistoryInfo> listTimelineBehaviorHistory(Time...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/table/dal/TableHistoryStatDAO.java
  type TableHistoryStatDAO (line 24) | public interface TableHistoryStatDAO {
    method insertTableHistoryStat (line 29) | public void insertTableHistoryStat(TableHistoryStatDO tableHistoryStat...
    method listTimelineTableStat (line 34) | public List<TableHistoryStatDO> listTimelineTableStat(BehaviorHistoryC...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/table/dal/TableStatDAO.java
  type TableStatDAO (line 26) | public interface TableStatDAO {
    method insertTableStat (line 28) | public void insertTableStat(TableStatDO tableStat);
    method deleteTableStat (line 30) | public void deleteTableStat(Long tableStatId);
    method modifyTableStat (line 32) | public int modifyTableStat(TableStatDO tableStat);
    method findTableStatById (line 34) | public TableStatDO findTableStatById(Long tableStatId);
    method findTableStatByPipelineIdAndPairId (line 36) | public TableStatDO findTableStatByPipelineIdAndPairId(Long pipelineId,...
    method listTableStatsByPipelineId (line 38) | public List<TableStatDO> listTableStatsByPipelineId(Long pipelineId);
    method listTableStatsByPairId (line 40) | public List<TableStatDO> listTableStatsByPairId(Long dataMediaPairId);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/table/dal/dataobject/TableHistoryStatDO.java
  class TableHistoryStatDO (line 30) | public class TableHistoryStatDO implements Serializable {
    method getId (line 46) | public Long getId() {
    method setId (line 50) | public void setId(Long id) {
    method getStartTime (line 54) | public Date getStartTime() {
    method setStartTime (line 58) | public void setStartTime(Date startTime) {
    method getEndTime (line 62) | public Date getEndTime() {
    method setEndTime (line 66) | public void setEndTime(Date endTime) {
    method getFileSize (line 70) | public Long getFileSize() {
    method setFileSize (line 74) | public void setFileSize(Long fileSize) {
    method getFileCount (line 78) | public Long getFileCount() {
    method setFileCount (line 82) | public void setFileCount(Long fileCount) {
    method getInsertCount (line 86) | public Long getInsertCount() {
    method setInsertCount (line 90) | public void setInsertCount(Long insertCount) {
    method getUpdateCount (line 94) | public Long getUpdateCount() {
    method setUpdateCount (line 98) | public void setUpdateCount(Long updateCount) {
    method getDeleteCount (line 102) | public Long getDeleteCount() {
    method setDeleteCount (line 106) | public void setDeleteCount(Long deleteCount) {
    method getDataMediaPairId (line 110) | public Long getDataMediaPairId() {
    method setDataMediaPairId (line 114) | public void setDataMediaPairId(Long dataMediaPairId) {
    method getPipelineId (line 118) | public Long getPipelineId() {
    method setPipelineId (line 122) | public void setPipelineId(Long pipelineId) {
    method getGmtCreate (line 126) | public Date getGmtCreate() {
    method setGmtCreate (line 130) | public void setGmtCreate(Date gmtCreate) {
    method getGmtModified (line 134) | public Date getGmtModified() {
    method setGmtModified (line 138) | public void setGmtModified(Date gmtModified) {
    method toString (line 142) | @Override

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/table/dal/dataobject/TableStatDO.java
  class TableStatDO (line 30) | public class TableStatDO implements Serializable {
    method getId (line 44) | public Long getId() {
    method setId (line 48) | public void setId(Long id) {
    method getFileSize (line 52) | public Long getFileSize() {
    method setFileSize (line 56) | public void setFileSize(Long fileSize) {
    method getFileCount (line 60) | public Long getFileCount() {
    method setFileCount (line 64) | public void setFileCount(Long fileCount) {
    method getInsertCount (line 68) | public Long getInsertCount() {
    method setInsertCount (line 72) | public void setInsertCount(Long insertCount) {
    method getUpdateCount (line 76) | public Long getUpdateCount() {
    method setUpdateCount (line 80) | public void setUpdateCount(Long updateCount) {
    method getDeleteCount (line 84) | public Long getDeleteCount() {
    method setDeleteCount (line 88) | public void setDeleteCount(Long deleteCount) {
    method getDataMediaPairId (line 92) | public Long getDataMediaPairId() {
    method setDataMediaPairId (line 96) | public void setDataMediaPairId(Long dataMediaPairId) {
    method getPipelineId (line 100) | public Long getPipelineId() {
    method setPipelineId (line 104) | public void setPipelineId(Long pipelineId) {
    method getGmtCreate (line 108) | public Date getGmtCreate() {
    method setGmtCreate (line 112) | public void setGmtCreate(Date gmtCreate) {
    method getGmtModified (line 116) | public Date getGmtModified() {
    method setGmtModified (line 120) | public void setGmtModified(Date gmtModified) {
    method toString (line 124) | @Override

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/table/dal/ibatis/IbatisTableHistoryStatDAO.java
  class IbatisTableHistoryStatDAO (line 30) | public class IbatisTableHistoryStatDAO extends SqlMapClientDaoSupport im...
    method insertTableHistoryStat (line 32) | @Override
    method listTimelineTableStat (line 37) | @Override

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/table/dal/ibatis/IbatisTableStatDAO.java
  class IbatisTableStatDAO (line 30) | public class IbatisTableStatDAO extends SqlMapClientDaoSupport implement...
    method insertTableStat (line 32) | @Override
    method deleteTableStat (line 38) | @Override
    method modifyTableStat (line 43) | @Override
    method findTableStatById (line 48) | @Override
    method findTableStatByPipelineIdAndPairId (line 54) | @Override
    method listTableStatsByPipelineId (line 63) | @Override
    method listTableStatsByPairId (line 69) | @Override
    method listTimelineTableStat (line 76) | public List<TableStatDO> listTimelineTableStat(BehaviorHistoryConditio...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/table/impl/TableStatServiceImpl.java
  class TableStatServiceImpl (line 47) | public class TableStatServiceImpl implements TableStatService, Initializ...
    method updateTableStat (line 59) | public void updateTableStat(TableStat stat) {
    method listTableStat (line 97) | public List<TableStat> listTableStat(Long pipelineId) {
    method insertBehaviorHistory (line 107) | public void insertBehaviorHistory(TableStat stat) {
    method listTimelineBehaviorHistory (line 114) | public Map<Long, BehaviorHistoryInfo> listTimelineBehaviorHistory(Time...
    method flushBehaviorHistory (line 144) | private void flushBehaviorHistory() {
    method afterPropertiesSet (line 155) | public void afterPropertiesSet() throws Exception {
    method tableStatModelToDo (line 178) | private TableStatDO tableStatModelToDo(TableStat tableStat) {
    method tableStatDOToModel (line 200) | private TableStat tableStatDOToModel(TableStatDO tableStatDO) {
    method tableHistoryStatModelToDo (line 222) | private TableHistoryStatDO tableHistoryStatModelToDo(TableStat tableSt...
    method tableHistoryStatDOToModel (line 246) | private TableStat tableHistoryStatDOToModel(TableHistoryStatDO tableHi...
    method setTableStatDao (line 264) | public void setTableStatDao(TableStatDAO tableStatDao) {
    method setTableHistoryStatDao (line 268) | public void setTableHistoryStatDao(TableHistoryStatDAO tableHistorySta...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/table/param/BehaviorHistoryCondition.java
  class BehaviorHistoryCondition (line 26) | public class BehaviorHistoryCondition {
    method getPairId (line 31) | public Long getPairId() {
    method setPairId (line 35) | public void setPairId(Long pairId) {
    method isDetail (line 39) | public boolean isDetail() {
    method setDetail (line 43) | public void setDetail(boolean detail) {
    method toString (line 47) | @Override

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/table/param/BehaviorHistoryInfo.java
  class BehaviorHistoryInfo (line 26) | public class BehaviorHistoryInfo {
    method getInsertCountAvg (line 34) | public Long getInsertCountAvg() {
    method getUpdateCountAvg (line 55) | public Long getUpdateCountAvg() {
    method getDeleteCountAvg (line 76) | public Long getDeleteCountAvg() {
    method getFileCountAvg (line 96) | public Long getFileCountAvg() {
    method getFileSizeAvg (line 116) | public Long getFileSizeAvg() {
    method getInsertNumber (line 135) | public Long getInsertNumber() {
    method getUpdateNumber (line 148) | public Long getUpdateNumber() {
    method getDeleteNumber (line 161) | public Long getDeleteNumber() {
    method getFileNumber (line 174) | public Long getFileNumber() {
    method getFileSize (line 187) | public Long getFileSize() {
    method getItems (line 199) | public List<TableStat> getItems() {
    method setItems (line 203) | public void setItems(List<TableStat> items) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/table/param/TimelineBehaviorHistoryCondition.java
  class TimelineBehaviorHistoryCondition (line 24) | public class TimelineBehaviorHistoryCondition extends BehaviorHistoryCon...
    method getStart (line 29) | public Date getStart() {
    method setStart (line 33) | public void setStart(Date start) {
    method getEnd (line 37) | public Date getEnd() {
    method setEnd (line 41) | public void setEnd(Date end) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/throughput/ThroughputStatService.java
  type ThroughputStatService (line 32) | public interface ThroughputStatService {
    method listRealtimeThroughput (line 34) | public Map<AnalysisType, ThroughputInfo> listRealtimeThroughput(Realti...
    method listTimelineThroughput (line 36) | public Map<Long, ThroughputInfo> listTimelineThroughput(TimelineThroug...
    method listRealtimeThroughputByPipelineIds (line 38) | public List<ThroughputStat> listRealtimeThroughputByPipelineIds(List<L...
    method findThroughputStatByPipelineId (line 40) | public ThroughputStat findThroughputStatByPipelineId(ThroughputConditi...
    method createOrUpdateThroughput (line 42) | public void createOrUpdateThroughput(ThroughputStat item);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/throughput/dal/ThroughputDAO.java
  type ThroughputDAO (line 29) | public interface ThroughputDAO {
    method insertThroughputStat (line 31) | public void insertThroughputStat(ThroughputStatDO throughputStat);
    method deleteThroughputStat (line 33) | public void deleteThroughputStat(Long throughputStatId);
    method modifyThroughputStat (line 35) | public void modifyThroughputStat(ThroughputStatDO throughputStat);
    method findThroughputStatById (line 37) | public ThroughputStatDO findThroughputStatById(Long throughputStatId);
    method listRealtimeThroughputStat (line 39) | public List<ThroughputStatDO> listRealtimeThroughputStat(RealtimeThrou...
    method listTimelineThroughputStat (line 41) | public List<ThroughputStatDO> listTimelineThroughputStat(TimelineThrou...
    method findRealtimeThroughputStat (line 43) | public ThroughputStatDO findRealtimeThroughputStat(ThroughputCondition...
    method listThroughputStatByPipelineId (line 45) | public List<ThroughputStatDO> listThroughputStatByPipelineId(Long pipe...
    method listRealTimeThroughputStatByPipelineIds (line 47) | public List<ThroughputStatDO> listRealTimeThroughputStatByPipelineIds(...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/throughput/dal/dataobject/ThroughputStatDO.java
  class ThroughputStatDO (line 31) | public class ThroughputStatDO implements Serializable {
    method getId (line 44) | public Long getId() {
    method setId (line 48) | public void setId(Long id) {
    method getPipelineId (line 52) | public Long getPipelineId() {
    method setPipelineId (line 56) | public void setPipelineId(Long pipelineId) {
    method getStartTime (line 60) | public Date getStartTime() {
    method setStartTime (line 64) | public void setStartTime(Date startTime) {
    method getEndTime (line 68) | public Date getEndTime() {
    method setEndTime (line 72) | public void setEndTime(Date endTime) {
    method getType (line 76) | public ThroughputType getType() {
    method setType (line 80) | public void setType(ThroughputType type) {
    method getNumber (line 84) | public Long getNumber() {
    method setNumber (line 88) | public void setNumber(Long number) {
    method getSize (line 92) | public Long getSize() {
    method setSize (line 96) | public void setSize(Long size) {
    method getGmtCreate (line 100) | public Date getGmtCreate() {
    method setGmtCreate (line 104) | public void setGmtCreate(Date gmtCreate) {
    method getGmtModified (line 108) | public Date getGmtModified() {
    method setGmtModified (line 112) | public void setGmtModified(Date gmtModified) {
    method toString (line 116) | @Override

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/throughput/dal/ibatis/IbatisThroughputDAO.java
  class IbatisThroughputDAO (line 34) | public class IbatisThroughputDAO extends SqlMapClientDaoSupport implemen...
    method insertThroughputStat (line 36) | @Override
    method deleteThroughputStat (line 42) | @Override
    method modifyThroughputStat (line 47) | @Override
    method findThroughputStatById (line 52) | @Override
    method listRealtimeThroughputStat (line 58) | @Override
    method listTimelineThroughputStat (line 64) | @Override
    method listThroughputStatByPipelineId (line 70) | @Override
    method findRealtimeThroughputStat (line 77) | @Override
    method listRealTimeThroughputStatByPipelineIds (line 83) | public List<ThroughputStatDO> listRealTimeThroughputStatByPipelineIds(...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/throughput/impl/ThroughputStatServiceImpl.java
  class ThroughputStatServiceImpl (line 40) | public class ThroughputStatServiceImpl implements ThroughputStatService {
    method getThroughputDao (line 44) | public ThroughputDAO getThroughputDao() {
    method setThroughputDao (line 48) | public void setThroughputDao(ThroughputDAO throughputDao) {
    method createOrUpdateThroughput (line 55) | public void createOrUpdateThroughput(ThroughputStat item) {
    method findThroughputStatByPipelineId (line 60) | public ThroughputStat findThroughputStatByPipelineId(ThroughputConditi...
    method listRealtimeThroughput (line 74) | public Map<AnalysisType, ThroughputInfo> listRealtimeThroughput(Realti...
    method listTimelineThroughput (line 106) | public Map<Long, ThroughputInfo> listTimelineThroughput(TimelineThroug...
    method listRealtimeThroughputByPipelineIds (line 136) | public List<ThroughputStat> listRealtimeThroughputByPipelineIds(List<L...
    method throughputStatModelToDo (line 155) | private ThroughputStatDO throughputStatModelToDo(ThroughputStat throug...
    method throughputStatDOToModel (line 175) | private ThroughputStat throughputStatDOToModel(ThroughputStatDO throug...

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/throughput/param/AnalysisType.java
  type AnalysisType (line 22) | public enum AnalysisType {
    method getValue (line 27) | public int getValue() {
    method AnalysisType (line 31) | AnalysisType(int value){

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/throughput/param/RealtimeThroughputCondition.java
  class RealtimeThroughputCondition (line 26) | public class RealtimeThroughputCondition extends ThroughputCondition {
    method getMax (line 33) | public int getMax() {
    method getMin (line 44) | public int getMin() {
    method getAnalysisType (line 54) | public List<AnalysisType> getAnalysisType() {
    method setAnalysisType (line 58) | public void setAnalysisType(List<AnalysisType> analysisType) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/throughput/param/ThroughputCondition.java
  class ThroughputCondition (line 27) | public class ThroughputCondition {
    method getPipelineId (line 33) | public Long getPipelineId() {
    method setPipelineId (line 37) | public void setPipelineId(Long pipelineId) {
    method getType (line 41) | public ThroughputType getType() {
    method setType (line 45) | public void setType(ThroughputType type) {
    method isDetail (line 49) | public boolean isDetail() {
    method setDetail (line 53) | public void setDetail(boolean detail) {
    method toString (line 57) | @Override

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/throughput/param/ThroughputInfo.java
  class ThroughputInfo (line 26) | public class ThroughputInfo {
    method getTps (line 34) | public Long getTps() {
    method getQuantity (line 54) | public Long getQuantity() {
    method getNumber (line 75) | public Long getNumber() {
    method getSize (line 88) | public Long getSize() {
    method getItems (line 100) | public List<ThroughputStat> getItems() {
    method setItems (line 104) | public void setItems(List<ThroughputStat> items) {
    method getSeconds (line 108) | public Long getSeconds() {
    method setSeconds (line 112) | public void setSeconds(Long seconds) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/throughput/param/TimelineThroughputCondition.java
  class TimelineThroughputCondition (line 24) | public class TimelineThroughputCondition extends ThroughputCondition {
    method getStart (line 29) | public Date getStart() {
    method setStart (line 33) | public void setStart(Date start) {
    method getEnd (line 37) | public Date getEnd() {
    method setEnd (line 41) | public void setEnd(Date end) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/user/UserService.java
  type UserService (line 27) | public interface UserService {
    method createUser (line 29) | public void createUser(User user);
    method deleteUser (line 31) | public void deleteUser(Long userId);
    method updataUser (line 33) | public void updataUser(User user);
    method findUserById (line 35) | public User findUserById(Long userId);
    method login (line 37) | public User login(String name, String password);
    method ListAllUsers (line 39) | public List<User> ListAllUsers();
    method listByCondition (line 41) | public List<User> listByCondition(Map condition);
    method getCount (line 43) | public int getCount();
    method getCount (line 45) | public int getCount(Map condition);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/user/dal/UserDAO.java
  type UserDAO (line 29) | public interface UserDAO {
    method findUserById (line 31) | public UserDO findUserById(Long userId);
    method insertUser (line 33) | public UserDO insertUser(UserDO user);
    method updateUser (line 35) | public void updateUser(UserDO user);
    method deleteUser (line 37) | public void deleteUser(Long userId);
    method listAllUsers (line 39) | public List<UserDO> listAllUsers();
    method listByCondition (line 41) | public List<UserDO> listByCondition(Map condition);
    method getAuthenticatedUser (line 43) | public UserDO getAuthenticatedUser(String name, String password);
    method chackUnique (line 45) | public boolean chackUnique(UserDO user);
    method getCount (line 47) | public int getCount();
    method getCount (line 49) | public int getCount(Map condition);

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/user/dal/dataobject/UserDO.java
  class UserDO (line 24) | public class UserDO implements Serializable {
    method getId (line 36) | public Long getId() {
    method setId (line 40) | public void setId(Long id) {
    method getName (line 44) | public String getName() {
    method setName (line 48) | public void setName(String name) {
    method getPassword (line 52) | public String getPassword() {
    method setPassword (line 56) | public void setPassword(String password) {
    method getDepartment (line 60) | public String getDepartment() {
    method setDepartment (line 64) | public void setDepartment(String department) {
    method getRealName (line 68) | public String getRealName() {
    method setRealName (line 72) | public void setRealName(String realName) {
    method getGmtCreate (line 76) | public Date getGmtCreate() {
    method setGmtCreate (line 80) | public void setGmtCreate(Date gmtCreate) {
    method getGmtModified (line 84) | public Date getGmtModified() {
    method setGmtModified (line 88) | public void setGmtModified(Date gmtModified) {
    method getAuthorizeType (line 92) | public AuthorizeType getAuthorizeType() {
    method setAuthorizeType (line 96) | public void setAuthorizeType(AuthorizeType authorizeType) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/user/dal/ibatis/IbatisUserDAO.java
  class IbatisUserDAO (line 33) | public class IbatisUserDAO extends SqlMapClientDaoSupport implements Use...
    method findUserById (line 35) | public UserDO findUserById(Long userId) {
    method listAllUsers (line 40) | public List<UserDO> listAllUsers() {
    method listByCondition (line 44) | public List<UserDO> listByCondition(Map condition) {
    method insertUser (line 48) | public UserDO insertUser(UserDO user) {
    method updateUser (line 54) | public void updateUser(UserDO user) {
    method chackUnique (line 59) | public boolean chackUnique(UserDO user) {
    method deleteUser (line 65) | public void deleteUser(Long userId) {
    method getAuthenticatedUser (line 70) | public UserDO getAuthenticatedUser(String name, String password) {
    method getCount (line 79) | public int getCount() {
    method getCount (line 84) | public int getCount(Map condition) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/user/impl/UserServiceImpl.java
  class UserServiceImpl (line 39) | public class UserServiceImpl implements UserService {
    method createUser (line 44) | public void createUser(User user) {
    method deleteUser (line 61) | public void deleteUser(Long userId) {
    method updataUser (line 66) | public void updataUser(User user) {
    method findUserById (line 85) | public User findUserById(Long userId) {
    method ListAllUsers (line 90) | public List<User> ListAllUsers() {
    method listByCondition (line 99) | public List<User> listByCondition(Map condition) {
    method getCount (line 111) | public int getCount() {
    method getCount (line 115) | public int getCount(Map condition) {
    method login (line 119) | @Override
    method doToModel (line 128) | private User doToModel(UserDO userDo) {
    method modelToDo (line 140) | private UserDO modelToDo(User user) {
    method getUserDao (line 155) | public UserDAO getUserDao() {
    method setUserDao (line 159) | public void setUserDao(UserDAO userDao) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/utils/DataSourceChecker.java
  class DataSourceChecker (line 50) | public class DataSourceChecker {
    method closeConnection (line 87) | private void closeConnection(Connection conn) {
    method closeConnection (line 91) | private void closeConnection(Connection conn, Statement st) {
    method closeConnection (line 95) | private void closeConnection(Connection conn, Statement st, ResultSet ...
    method check (line 112) | @SuppressWarnings("resource")
    method checkMap (line 202) | public String checkMap(String namespace, String name, Long dataSourceI...
    method checkNamespaceTables (line 273) | public String checkNamespaceTables(final String namespace, final Strin...
    method setDataMediaSourceService (line 330) | public void setDataMediaSourceService(DataMediaSourceService dataMedia...
    method setDataSourceCreator (line 334) | public void setDataSourceCreator(DataSourceCreator dataSourceCreator) {

FILE: manager/biz/src/main/java/com/alibaba/otter/manager/biz/utils/RegexUtils.java
  class RegexUtils (line 37) | public class RegexUtils {
    method apply (line 44) | public Pattern apply(String pattern) {
    method findFirst (line 55) | public static String findFirst(String originalStr, String regex) {

FILE: manager/biz/src/test/java/com/alibaba/otter/manager/biz/BaseOtterTest.java
  class BaseOtterTest (line 34) | @SpringApplicationContext("applicationContext.xml")
    method setUp (line 37) | @BeforeMethod
    method getBeanFactory (line 47) | protected BeanFactory getBeanFactory() {
    method autowire (line 51) | protected void autowire(Object obj) {

FILE: manager/biz/src/test/java/com/alibaba/otter/manager/biz/autokeeper/impl/AutoKeeperCollectorTest.java
  class AutoKeeperCollectorTest (line 33) | public class AutoKeeperCollectorTest extends BaseOtterTest {
    method testCollectorServerStat (line 43) | @Test

FILE: manager/biz/src/test/java/com/alibaba/otter/manager/biz/monitor/AbstractRuleMonitorInPeriodTest.java
  class AbstractRuleMonitorInPeriodTest (line 33) | public class AbstractRuleMonitorInPeriodTest {
    method explore (line 37) | @Override
    method currentCalendar (line 43) | @Override
    method testInPeriod (line 57) | @Test
    method testNotInPeriod (line 65) | @Test
    method testCriticalInPeriod (line 73) | @Test
    method testErrorFormatInPeriod (line 81) | @Test

FILE: manager/biz/src/test/java/com/alibaba/otter/manager/biz/monitor/AlarmServiceTest.java
  class AlarmServiceTest (line 11) | public class AlarmServiceTest extends BaseOtterTest {
    method test_simple (line 16) | @Test

FILE: manager/biz/src/test/java/com/alibaba/otter/manager/biz/monitor/ExceptionRuleMonitorTest.java
  class ExceptionRuleMonitorTest (line 40) | public class ExceptionRuleMonitorTest extends BaseOtterTest {
    method testSerialProcess (line 48) | @Test

FILE: manager/biz/src/test/java/com/alibaba/otter/manager/biz/monitor/GlobalMonitorTest.java
  class GlobalMonitorTest (line 41) | public class GlobalMonitorTest extends BaseOtterTest {
    method explore (line 45) | @Override
    method explore (line 53) | @Override
    method testSerialProcess (line 67) | @Test
    method testConcurrentProcess (line 91) | @Test
    method testConcurrentProcessWithException (line 115) | @Test

FILE: manager/biz/src/test/java/com/alibaba/otter/manager/biz/service/NodeSerivceTest.java
  class NodeSerivceTest (line 36) | public class NodeSerivceTest extends BaseOtterTest {
    method testListAllNodes (line 49) | @Test

FILE: manager/biz/src/test/java/com/alibaba/otter/manager/biz/service/PipelineSerivceTest.java
  class PipelineSerivceTest (line 21) | public class PipelineSerivceTest extends BaseOtterTest {

FILE: manager/deployer/src/main/java/com/alibaba/otter/manager/deployer/JettyEmbedServer.java
  class JettyEmbedServer (line 33) | public class JettyEmbedServer {
    method JettyEmbedServer (line 40) | public JettyEmbedServer(String jettyXml){
    method start (line 44) | public void start() throws Exception {
    method join (line 67) | public void join() throws Exception {
    method stop (line 74) | public void stop() throws Exception {
    method setConfig (line 83) | public void setConfig(String config) {

FILE: manager/deployer/src/main/java/com/alibaba/otter/manager/deployer/OtterManagerLauncher.java
  class OtterManagerLauncher (line 28) | public class OtterManagerLauncher {
    method main (line 33) | public static void main(String[] args) throws Throwable {
    method mergeProps (line 73) | private static void mergeProps(Properties props) {

FILE: manager/deployer/src/main/resources/sql/otter-manager-schema.sql
  type `ALARM_RULE` (line 7) | CREATE TABLE `ALARM_RULE` (
  type `AUTOKEEPER_CLUSTER` (line 21) | CREATE TABLE `AUTOKEEPER_CLUSTER` (
  type `CANAL` (line 31) | CREATE TABLE `CANAL` (
  type `CHANNEL` (line 42) | CREATE TABLE `CHANNEL` (
  type `COLUMN_PAIR` (line 53) | CREATE TABLE `COLUMN_PAIR` (
  type `COLUMN_PAIR_GROUP` (line 64) | CREATE TABLE `COLUMN_PAIR_GROUP` (
  type `DATA_MEDIA` (line 74) | CREATE TABLE `DATA_MEDIA` (
  type `DATA_MEDIA_PAIR` (line 86) | CREATE TABLE `DATA_MEDIA_PAIR` (
  type `DATA_MEDIA_SOURCE` (line 102) | CREATE TABLE `DATA_MEDIA_SOURCE` (
  type `DELAY_STAT` (line 113) | CREATE TABLE `DELAY_STAT` (
  type `LOG_RECORD` (line 126) | CREATE TABLE `LOG_RECORD` (
  type `NODE` (line 139) | CREATE TABLE `NODE` (
  type `PIPELINE` (line 152) | CREATE TABLE `PIPELINE` (
  type `PIPELINE_NODE_RELATION` (line 165) | CREATE TABLE `PIPELINE_NODE_RELATION` (
  type `SYSTEM_PARAMETER` (line 176) | CREATE TABLE `SYSTEM_PARAMETER` (
  type `TABLE_HISTORY_STAT` (line 184) | CREATE TABLE `TABLE_HISTORY_STAT` (
  type `TABLE_STAT` (line 202) | CREATE TABLE `TABLE_STAT` (
  type `THROUGHPUT_STAT` (line 217) | CREATE TABLE `THROUGHPUT_STAT` (
  type `USER` (line 233) | CREATE TABLE `USER` (
  type `DATA_MATRIX` (line 246) | CREATE TABLE  `DATA_MATRIX` (
  type `meta_history` (line 258) | CREATE TABLE IF NOT EXISTS `meta_history` (
  type `meta_snapshot` (line 280) | CREATE TABLE IF NOT EXISTS `meta_snapshot` (

FILE: manager/deployer/src/main/resources/webapp/js/My97DatePicker/WdatePicker.js
  function B (line 39) | function B(){V.$dp=V.$dp||{};obj={$:function($){return(typeof $=="string...
  function E (line 39) | function E(A,$,_){if(T)A.attachEvent($,_);else if(_){var B=$.replace(/on...
  function L (line 39) | function L(){var _,A,$=X[O][C]("script");for(var B=0;B<$.length;B++){_=$...
  function F (line 39) | function F(F){var E,C;if(F.substring(0,1)!="/"&&F.indexOf("://")==-1){E=...
  function M (line 39) | function M(A,$,B){var D=X[O][C]("HEAD").item(0),_=X[O].createElement("li...
  function Z (line 39) | function Z($,_){E($,"onload",_)}
  function G (line 39) | function G($){$=$||V;var A=0,_=0;while($!=V){var D=$.parent[O][C]("ifram...
  function W (line 39) | function W(F){if(F.getBoundingClientRect)return F.getBoundingClientRect(...
  function N (line 39) | function N($){$=$||V;var B=$[O],A=($.innerWidth)?$.innerWidth:(B[J]&&B[J...
  function a (line 39) | function a($){$=$||V;var B=$[O],A=B[J],_=B.body;B=(A&&A.scrollTop!=null&...
  function D (line 39) | function D($){var _=$?($.srcElement||$.target):null;try{if($dp.cal&&!$dp...
  function Y (line 39) | function Y(){$dp.status=2;H()}
  function H (line 39) | function H(){if($dp.flatCfgs.length>0){var $=$dp.flatCfgs.shift();$.el={...
  function U (line 39) | function U(J,C){$dp.win=X;B();J=J||{};if(C){if(!G()){$=$||setInterval(fu...
  function S (line 39) | function S(_,$){return _.currentStyle?_.currentStyle[$]:document.default...
  function Q (line 39) | function Q(_,$){if(_)if($!=null)_.style.display=$;else return S(_,"displ...
  function K (line 39) | function K(H,$){for(var D in _)if(D.substring(0,1)!="$")$dp[D]=_[D];for(...

FILE: manager/deployer/src/main/resources/webapp/js/analysisStatus.js
  function strFormat (line 3) | function strFormat(s) {
  function sizeFormat (line 15) | function sizeFormat(val, axis) {
  function delayFormat (line 26) | function delayFormat(val, axis) {
  function drawDelayGraph (line 39) | function drawDelayGraph(id,flotData) {
  function createDelayStatFlash (line 71) | function createDelayStatFlash(flotTime) {
  function doPlot (line 80) | function doPlot(position,flotNumber,flotTime) {
  function createDelayStat (line 113) | function createDelayStat(flotTime) {
  function doPlot (line 121) | function doPlot(id,position,flotNumber,flotSize) {
  function plotThroughput (line 155) | function plotThroughput(id,flotData){
  function plotSizeThroughput (line 185) | function plotSizeThroughput(id,flotData){
  function createRowThroughputFlash (line 215) | function createRowThroughputFlash(flotNumber,flotSize){
  function createFileThroughputFlash (line 227) | function createFileThroughputFlash(flotNumber,flotSize){
  function drawBehaviorGraph (line 238) | function drawBehaviorGraph(id,flotData) {
  function createBehaviorFlash (line 268) | function createBehaviorFlash(flotNumber1,flotNumber2,flotNumber3,flotNum...
  function doPlot (line 306) | function doPlot(position,flotNumber1,flotNumber2,flotNumber3,flotNumber4...
  function createBehaviorHistory (line 343) | function createBehaviorHistory(flotNumber1,flotNumber2,flotNumber3,flotN...

FILE: manager/deployer/src/main/resources/webapp/js/dbCheck.js
  function check (line 1) | function check() {
  function checkMap (line 10) | function checkMap() {
  function callback (line 18) | function callback(msg) {
  function checkNamespaceTables (line 22) | function checkNamespaceTables() {
  function callback2 (line 30) | function callback2(msg) {
  function changeform (line 39) | function changeform(){

FILE: manager/deployer/src/main/resources/webapp/js/flot/excanvas.js
  function getContext (line 57) | function getContext() {
  function bind (line 80) | function bind(f, obj, var_args) {
  function encodeHtmlAttribute (line 87) | function encodeHtmlAttribute(s) {
  function addNamespacesAndStylesheet (line 91) | function addNamespacesAndStylesheet(doc) {
  function onPropertyChange (line 180) | function onPropertyChange(e) {
  function onResize (line 198) | function onResize(e) {
  function createMatrixIdentity (line 216) | function createMatrixIdentity() {
  function matrixMultiply (line 224) | function matrixMultiply(m1, m2) {
  function copyState (line 241) | function copyState(o1, o2) {
  function getRgbHslContent (line 396) | function getRgbHslContent(styleString) {
  function percent (line 409) | function percent(s) {
  function clamp (line 413) | function clamp(v, min, max) {
  function hslToRgb (line 417) | function hslToRgb(parts){
  function hueToRgb (line 439) | function hueToRgb(m1, m2, h) {
  function processStyle (line 455) | function processStyle(styleString) {
  function processFontStyle (line 494) | function processFontStyle(styleString) {
  function getComputedStyle (line 516) | function getComputedStyle(style, element) {
  function buildStyle (line 548) | function buildStyle(style) {
  function processLineCap (line 553) | function processLineCap(lineCap) {
  function CanvasRenderingContext2D_ (line 571) | function CanvasRenderingContext2D_(surfaceElement) {
  function bezierCurveTo (line 645) | function bezierCurveTo(self, cp1, cp2, p) {
  function appendStroke (line 974) | function appendStroke(ctx, lineStr) {
  function appendFill (line 997) | function appendFill(ctx, lineStr, min, max) {
  function matrixIsFinite (line 1134) | function matrixIsFinite(m) {
  function setM (line 1140) | function setM(ctx, m, updateLineScale) {
  function CanvasGradient_ (line 1343) | function CanvasGradient_(aType) {
  function CanvasPattern_ (line 1361) | function CanvasPattern_(image, repetition) {
  function throwException (line 1383) | function throwException(s) {
  function assertImageIsValid (line 1387) | function assertImageIsValid(img) {
  function DOMException_ (line 1396) | function DOMException_(s) {

FILE: manager/deployer/src/main/resources/webapp/js/flot/jquery.colorhelpers.js
  function clamp (line 55) | function clamp(min, value, max) {

FILE: manager/deployer/src/main/resources/webapp/js/flot/jquery.flot.crosshair.js
  function init (line 65) | function init(plot) {

FILE: manager/deployer/src/main/resources/webapp/js/flot/jquery.flot.fillbetween.js
  function init (line 35) | function init(plot) {

FILE: manager/deployer/src/main/resources/webapp/js/flot/jquery.flot.image.js
  function drawSeries (line 115) | function drawSeries(plot, ctx, series) {
  function processRawData (line 213) | function processRawData(plot, series, data, datapoints) {
  function init (line 227) | function init(plot) {

FILE: manager/deployer/src/main/resources/webapp/js/flot/jquery.flot.js
  function H (line 31) | function H(J,K,I){return K<J?J:(K>I?I:K)}
  function Plot (line 35) | function Plot(placeholder, data_, options_, plugins) {
  function floorInBase (line 2595) | function floorInBase(n, base) {

FILE: manager/deployer/src/main/resources/webapp/js/flot/jquery.flot.navigate.js
  function H (line 91) | function H(L){var K=this,J,M=L.data||{};if(M.elem){K=L.dragTarget=M.elem...
  function C (line 91) | function C(M,K,L){M.type=K;var J=E.event.handle.call(L,M);return J===fal...
  function I (line 91) | function I(J){return Math.pow(J,2)}
  function D (line 91) | function D(){return(F.dragging===false)}
  function G (line 91) | function G(K,J){if(!K){return }K.unselectable=J?"off":"on";K.onselectsta...
  function b (line 105) | function b(f){var d=[].slice.call(arguments,1),g=0,e=true;f=c.event.fix(...
  function init (line 128) | function init(plot) {

FILE: manager/deployer/src/main/resources/webapp/js/flot/jquery.flot.pie.js
  function init (line 63) | function init(plot) // this is the "body" of the plugin

FILE: manager/deployer/src/main/resources/webapp/js/flot/jquery.flot.resize.js
  function m (line 22) | function m(s,o,p){var q=$(this),r=$.data(this,d);r.w=o!==c?o:q.width();r...
  function g (line 22) | function g(){i=h[k](function(){a.each(function(){var n=$(this),m=n.width...
  function init (line 28) | function init(plot) {

FILE: manager/deployer/src/main/resources/webapp/js/flot/jquery.flot.selection.js
  function init (line 70) | function init(plot) {

FILE: manager/deployer/src/main/resources/webapp/js/flot/jquery.flot.stack.js
  function init (line 39) | function init(plot) {

FILE: manager/deployer/src/main/resources/webapp/js/flot/jquery.flot.symbol.js
  function processRawData (line 16) | function processRawData(plot, series, datapoints) {
  function init (line 61) | function init(plot) {

FILE: manager/deployer/src/main/resources/webapp/js/flot/jquery.flot.threshold.js
  function init (line 31) | function init(plot) {

FILE: manager/deployer/src/main/resources/webapp/js/flot/jquery.js
  function jQuerySubclass (line 994) | function jQuerySubclass( selector, context ) {
  function doScrollCheck (line 1069) | function doScrollCheck() {
  function dataAttr (line 1596) | function dataAttr( elem, key, data ) {
  function isEmptyDataObject (line 1626) | function isEmptyDataObject( obj ) {
  function returnFalse (line 2726) | function returnFalse() {
  function returnTrue (line 2729) | function returnTrue() {
  function trigger (line 2977) | function trigger( type, elem, args ) {
  function handler (line 3004) | function handler( e ) {
  function liveHandler (line 3188) | function liveHandler( event ) {
  function liveConvert (line 3271) | function liveConvert( type, selector ) {
  function dirNodeCheck (line 4558) | function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
  function dirCheck (line 4591) | function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
  function isDisconnected (line 4848) | function isDisconnected( node ) {
  function winnow (line 4970) | function winnow( elements, qualifier, keep ) {
  function root (line 5341) | function root( elem, cur ) {
  function cloneCopyEvent (line 5348) | function cloneCopyEvent( src, dest ) {
  function cloneFixAttributes (line 5377) | function cloneFixAttributes(src, dest) {
  function getAll (line 5491) | function getAll( elem ) {
  function evalScript (line 5688) | function evalScript( i, elem ) {
  function getWH (line 6004) | function getWH( elem, name, extra ) {
  function addToPrefiltersOrTransports (line 6108) | function addToPrefiltersOrTransports( structure ) {
  function inspectPrefiltersOrTransports (line 6144) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
  function done (line 6508) | function done( status, statusText, responses, headers ) {
  function buildParams (line 6817) | function buildParams( prefix, obj, traditional, add ) {
  function ajaxHandleResponses (line 6874) | function ajaxHandleResponses( s, jqXHR, responses ) {
  function ajaxConvert (line 6939) | function ajaxConvert( s, response ) {
  function xhrOnUnloadAbort (line 7204) | function xhrOnUnloadAbort() {
  function createStandardXHR (line 7214) | function createStandardXHR() {
  function createActiveXHR (line 7220) | function createActiveXHR() {
  function genFx (line 7664) | function genFx( type, num ) {
  function t (line 7773) | function t( gotoEnd ) {
  function defaultDisplay (line 7925) | function defaultDisplay( nodeName ) {
  function getWindow (line 8239) | function getWindow( elem ) {

FILE: manager/deployer/src/main/resources/webapp/js/gchartapi.js
  function p (line 15) | function p(a,b){return a.load=b}
  function G (line 15) | function G(a){return a in H?H[a]:H[a]=-1!=navigator.userAgent[F]()[v](a)}
  function I (line 15) | function I(a,b){var c=function(){};c.prototype=b[A];a.T=b[A];a.prototype...
  function J (line 16) | function J(a,b,c){var e=Array[A].slice.call(arguments,2)||[];return func...
  function K (line 16) | function K(a){a=Error(a);a.toString=function(){return this.message};retu...
  function L (line 16) | function L(a,b){for(var c=a.split(/\./),e=m,f=0;f<c[z]-1;f++)e[c[f]]||(e...
  function aa (line 16) | function aa(a,b,c){a[b]=c}
  function e (line 17) | function e(a){var b=a.split(".");if(2<b[z])throw K("Module: '"+a+"' not ...
  function R (line 20) | function R(a,b,c){if(a.addEventListener)a.addEventListener(b,c,k);else i...
  function ba (line 20) | function ba(){ca[n.readyState]?S():0<Q[z]&&m[B](ba,10)}
  function S (line 21) | function S(){for(var a=0;a<Q[z];a++)Q[a]();Q.length=0}
  function V (line 24) | function V(a){this.b=a;this.o=[];this.n={};this.e={};this.f={};this.j=g;...
  function X (line 30) | function X(a){this.D=a;this.q={};this.r=0}
  function W (line 30) | function W(a,b,c){this.name=a;this.C=b;this.p=c;this.u=this.h=k;this.k=[...
  function T (line 32) | function T(a,b){this.b=a;this.i=b;this.h=k}

FILE: manager/deployer/src/main/resources/webapp/js/nodeCheck.js
  function isRunning (line 1) | function isRunning(nid,pid,stage) {
  function aggregation (line 13) | function aggregation(nid,pid,stage) {
  function pending (line 25) | function pending(nid,pid,stage) {
  function callback (line 37) | function callback(msg) {

FILE: manager/deployer/src/main/resources/webapp/js/pop.js
  function showModal (line 4) | function showModal(src, height, width) {
  function megaHoverOver (line 19) | function megaHoverOver(){
  function megaHoverOut (line 51) | function megaHoverOut(){

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/common/CanalExtraParamUtil.java
  class CanalExtraParamUtil (line 11) | public class CanalExtraParamUtil {
    method getExtraParamMap (line 13) | public static Map<String, Object> getExtraParamMap(CanalParameter cana...
    method setExtraParamString (line 21) | public static void setExtraParamString(CanalParameter canalParameter, ...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/common/NumberFormatUtil.java
  class NumberFormatUtil (line 40) | public class NumberFormatUtil {
    method format (line 48) | public static String format(Double data) {
    method format (line 56) | public static String format(Integer data) {
    method format (line 64) | public static String format(Long data) {
    method format (line 72) | public static String format(BigDecimal data) {
    method format (line 81) | public static String format(BigInteger data) {
    method format (line 90) | public static String format(Date date) {
    method format (line 98) | public static String format(java.sql.Date date) {
    method format (line 106) | public static String format(java.sql.Time time) {
    method format (line 114) | public static String format(java.sql.Timestamp timestamp) {
    method formatDelay (line 122) | public static String formatDelay(Number data) {
    method formatFileSize (line 162) | public static String formatFileSize(Number data) {
    method formatGroupDbAddress (line 187) | public String formatGroupDbAddress(SourcingType defaultType, List<List...
    method getHtmlOriginalContent (line 208) | public String getHtmlOriginalContent(String originalContent) {
    method getHtmlOriginalContent (line 214) | public String getHtmlOriginalContent(String originalContent, String es...
    method getManagerVersionInfo (line 227) | public String getManagerVersionInfo() {

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/common/WebConstant.java
  type WebConstant (line 24) | public interface WebConstant {

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/common/api/ApiAuthService.java
  type ApiAuthService (line 24) | public interface ApiAuthService {
    method auth (line 27) | public boolean auth(TurbineRunData rundata);

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/common/api/DefaultApiAuthService.java
  class DefaultApiAuthService (line 24) | public class DefaultApiAuthService implements ApiAuthService {
    method auth (line 26) | @Override

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/common/api/JsonResult.java
  class JsonResult (line 24) | public class JsonResult implements Serializable {
    method JsonResult (line 32) | public JsonResult(){
    method JsonResult (line 35) | public JsonResult(boolean success){
    method isSuccess (line 40) | public boolean isSuccess() {
    method setSuccess (line 44) | public void setSuccess(boolean success) {
    method getErrMessage (line 48) | public String getErrMessage() {
    method setErrMessage (line 52) | public void setErrMessage(String errMessage) {
    method getData (line 56) | public Object getData() {
    method setData (line 60) | public void setData(Object data) {

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/common/model/SeniorCanal.java
  class SeniorCanal (line 29) | public class SeniorCanal extends Canal {
    method isUsed (line 35) | public boolean isUsed() {
    method setUsed (line 39) | public void setUsed(boolean used) {
    method getPipelines (line 43) | public List<Pipeline> getPipelines() {
    method setPipelines (line 47) | public void setPipelines(List<Pipeline> pipelines) {
    method getUrl (line 51) | public String getUrl() {

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/common/model/SeniorChannel.java
  class SeniorChannel (line 24) | public class SeniorChannel extends Channel {
    method isProcessEmpty (line 29) | public boolean isProcessEmpty() {
    method setProcessEmpty (line 33) | public void setProcessEmpty(boolean processEmpty) {

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/common/model/SeniorDataMatrix.java
  class SeniorDataMatrix (line 21) | public class SeniorDataMatrix extends DataMatrix {
    method isUsed (line 26) | public boolean isUsed() {
    method setUsed (line 30) | public void setUsed(boolean used) {

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/common/model/SeniorDataMedia.java
  class SeniorDataMedia (line 28) | public class SeniorDataMedia extends DataMedia<DataMediaSource> {
    method isUsed (line 36) | public boolean isUsed() {
    method setUsed (line 40) | public void setUsed(boolean used) {
    method getPairs (line 44) | public List<DataMediaPair> getPairs() {
    method setPairs (line 48) | public void setPairs(List<DataMediaPair> pairs) {

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/common/model/SeniorDataMediaPair.java
  class SeniorDataMediaPair (line 25) | public class SeniorDataMediaPair {
    method getChannel (line 31) | public Channel getChannel() {
    method setChannel (line 35) | public void setChannel(Channel channel) {
    method getDataMediaPair (line 39) | public DataMediaPair getDataMediaPair() {
    method setDataMediaPair (line 43) | public void setDataMediaPair(DataMediaPair dataMediaPair) {

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/common/model/SeniorDataMediaSource.java
  class SeniorDataMediaSource (line 27) | public class SeniorDataMediaSource extends DbMediaSource {
    method isUsed (line 34) | public boolean isUsed() {
    method setUsed (line 38) | public void setUsed(boolean used) {
    method getStorePath (line 42) | public String getStorePath() {
    method setStorePath (line 46) | public void setStorePath(String storePath) {
    method getDataMedias (line 50) | public List<DataMedia> getDataMedias() {
    method setDataMedias (line 54) | public void setDataMedias(List<DataMedia> dataMedias) {

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/common/model/SeniorNode.java
  class SeniorNode (line 24) | public class SeniorNode extends Node {
    method isUsed (line 29) | public boolean isUsed() {
    method setUsed (line 33) | public void setUsed(boolean used) {

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/action/AbstractAction.java
  class AbstractAction (line 27) | public class AbstractAction {
    method urlEncode (line 29) | protected String urlEncode(String character) {

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/action/AlarmRuleAction.java
  class AlarmRuleAction (line 39) | public class AlarmRuleAction extends AbstractAction {
    method doAdd (line 47) | public void doAdd(@FormGroup("alarmRuleInfo") Group alarmRuleInfo,
    method doOnekeyAddMonitor (line 65) | public void doOnekeyAddMonitor(@Param("pipelineId") Long pipelineId, N...
    method doEdit (line 119) | public void doEdit(@FormGroup("alarmRuleInfo") Group alarmRuleInfo,
    method doDelete (line 137) | public void doDelete(@Param("alarmRuleId") Long alarmRuleId, @Param("p...
    method doStatus (line 145) | public void doStatus(@Param("alarmRuleId") Long alarmRuleId, @Param("p...
    method doStatusSystem (line 161) | public void doStatusSystem(@Param("alarmRuleId") Long alarmRuleId, @Pa...
    method doStatusByPipeline (line 177) | public void doStatusByPipeline(@Param("pipelineId") Long pipelineId, @...
    method doStatusByRule (line 199) | public void doStatusByRule(@Param("alarmRuleIds") String alarmRuleIds,...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/action/AutoKeeperClusterAction.java
  class AutoKeeperClusterAction (line 37) | public class AutoKeeperClusterAction extends AbstractAction {
    method doAdd (line 44) | public void doAdd(@FormGroup("autokeeperClusterInfo") Group autokeeper...
    method doEdit (line 63) | public void doEdit(@FormGroup("autokeeperClusterInfo") Group autokeepe...
    method doRefresh (line 81) | public void doRefresh(@Param("clusterId") Long clusterId, Navigator na...
    method doDelete (line 92) | public void doDelete(@Param("clusterId") Long clusterId, Navigator nav...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/action/CanalAction.java
  class CanalAction (line 45) | public class CanalAction extends AbstractAction {
    method doAdd (line 56) | public void doAdd(@FormGroup("canalInfo") Group canalInfo,
    method doEdit (line 136) | public void doEdit(@FormGroup("canalInfo") Group canalInfo,
    method doDelete (line 206) | public void doDelete(@Param("canalId") Long canalId, Navigator nav) th...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/action/ChannelAction.java
  class ChannelAction (line 43) | public class ChannelAction extends AbstractAction {
    method doAdd (line 58) | public void doAdd(@FormGroup("channelInfo") Group channelInfo,
    method doEdit (line 85) | public void doEdit(@FormGroup("channelInfo") Group channelInfo, @Param...
    method doDelete (line 113) | public void doDelete(@Param("channelId") Long channelId, @Param("pageI...
    method doStatus (line 135) | public void doStatus(@Param("pageIndex") int pageIndex, @Param("search...
    method doNotify (line 169) | public void doNotify(@Param("pageIndex") int pageIndex, @Param("search...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/action/ColumnPairAction.java
  class ColumnPairAction (line 37) | public class ColumnPairAction extends AbstractAction {
    method doSave (line 52) | public void doSave(@Param("dataMediaPairId") Long dataMediaPairId, @Pa...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/action/ColumnPairGroupAction.java
  class ColumnPairGroupAction (line 40) | public class ColumnPairGroupAction {
    method doSave (line 47) | public void doSave(@Param("dataMediaPairId") Long dataMediaPairId, @Pa...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/action/DataMatrixAction.java
  class DataMatrixAction (line 35) | public class DataMatrixAction extends AbstractAction {
    method doAdd (line 40) | public void doAdd(@FormGroup("dataMatrixInfo") Group dataMatrixInfo,
    method doEdit (line 56) | public void doEdit(@FormGroup("dataMatrixInfo") Group dataMatrixInfo,
    method doDelete (line 72) | public void doDelete(@Param("matrixId") Long matrixId, Navigator nav) ...
    method doSwitch (line 77) | public void doSwitch(@Param("matrixId") Long matrixId, Navigator nav) ...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/action/DataMediaAction.java
  class DataMediaAction (line 38) | public class DataMediaAction extends AbstractAction {
    method doAdd (line 56) | public void doAdd(@FormGroup("dataMediaInfo") Group dataMediaInfo,
    method doDelete (line 83) | public void doDelete(@Param("dataMediaId") Long dataMediaId, @Param("p...
    method doEdit (line 91) | public void doEdit(@FormGroup("dataMediaInfo") Group dataMediaInfo, @P...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/action/DataMediaPairAction.java
  class DataMediaPairAction (line 47) | public class DataMediaPairAction {
    method doAdd (line 68) | public void doAdd(@Param("submitKey") String submitKey, @FormGroup("da...
    method doBatchAdd (line 123) | public void doBatchAdd(@FormGroup("batchDataMediaPairInfo") Group batc...
    method doEdit (line 186) | public void doEdit(@Param("submitKey") String submitKey, @Param("chann...
    method doDelete (line 241) | public void doDelete(@Param("dataMediaPairId") Long dataMediaPairId, @...
    method doNextToView (line 259) | public void doNextToView(@FormGroup("dataMediaPairInfo") Group dataMed...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/action/DataMediaSourceAction.java
  class DataMediaSourceAction (line 36) | public class DataMediaSourceAction extends AbstractAction {
    method doAdd (line 51) | public void doAdd(@FormGroup("dataMediaSourceInfo") Group dataMediaSou...
    method doDelete (line 90) | public void doDelete(@Param("dataMediaSourceId") Long dataMediaSourceI...
    method doEdit (line 99) | public void doEdit(@FormGroup("dataMediaSourceInfo") Group dataMediaSo...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/action/NodeAction.java
  class NodeAction (line 37) | public class NodeAction extends AbstractAction {
    method doAdd (line 48) | public void doAdd(@FormGroup("nodeInfo") Group nodeInfo, @FormGroup("n...
    method doEdit (line 83) | public void doEdit(@FormGroup("nodeInfo") Group nodeInfo, @FormGroup("...
    method doDelete (line 123) | public void doDelete(@Param("nodeId") Long nodeId, @Param("pageIndex")...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/action/PipelineAction.java
  class PipelineAction (line 45) | public class PipelineAction {
    method doAdd (line 56) | public void doAdd(@FormGroup("pipelineInfo") Group pipelineInfo,
    method doDelete (line 118) | public void doDelete(@Param("pipelineId") Long pipelineId, @Param("cha...
    method doEdit (line 133) | public void doEdit(@FormGroup("pipelineInfo") Group pipelineInfo,

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/action/PositionAction.java
  class PositionAction (line 31) | public class PositionAction {
    method doRemove (line 41) | public void doRemove(@Param("pipelineId") Long pipelineId, Navigator n...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/action/SwitchWarmupAction.java
  class SwitchWarmupAction (line 27) | public class SwitchWarmupAction {
    method doSwitch (line 35) | public void doSwitch(@Param("pipelineId") Long pipelineId, Navigator n...
    method doRestart (line 42) | public void doRestart(@Param("pipelineId") Long pipelineId, Navigator ...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/action/SystemParameterAction.java
  class SystemParameterAction (line 35) | public class SystemParameterAction extends AbstractAction {
    method doEdit (line 43) | public void doEdit(@FormGroup("systemParameterDetailInfo") Group syste...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/action/UserAction.java
  class UserAction (line 41) | public class UserAction extends AbstractAction {
    method doAdd (line 46) | public void doAdd(@FormGroup("addUserInfo") Group userInfo, Navigator ...
    method doEdit (line 61) | public void doEdit(@FormGroup("editUserInfo") Group userInfo, @Param("...
    method doDelete (line 83) | public void doDelete(@Param("userId") Long userId, @Param("pageIndex")...
    method doLogin (line 89) | public void doLogin(@FormGroup("login") User user,
    method doLogout (line 111) | public void doLogout(HttpSession session, Navigator nav, ParameterPars...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/AddAlarmRule.java
  class AddAlarmRule (line 26) | public class AddAlarmRule {
    method execute (line 31) | public void execute(@Param("pipelineId") Long pipelineId, Context cont...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/AddBatchDataMediaPair.java
  class AddBatchDataMediaPair (line 28) | public class AddBatchDataMediaPair {
    method execute (line 33) | public void execute(@Param("pipelineId") Long pipelineId, Context cont...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/AddCanal.java
  class AddCanal (line 30) | public class AddCanal {
    method execute (line 35) | public void execute(Context context, Navigator nav) throws Exception {

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/AddColumnPair.java
  class AddColumnPair (line 31) | public class AddColumnPair {
    method execute (line 39) | public void execute(@Param("dataMediaPairId") Long dataMediaPairId, @P...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/AddColumnPairGroup.java
  class AddColumnPairGroup (line 36) | public class AddColumnPairGroup {
    method execute (line 50) | public void execute(@Param("dataMediaPairId") Long dataMediaPairId, @P...
    method buildColumnPairFromDataMedia (line 93) | private List<ColumnPair> buildColumnPairFromDataMedia(Long dataMediaPa...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/AddDataMediaPair.java
  class AddDataMediaPair (line 28) | public class AddDataMediaPair {
    method execute (line 33) | public void execute(@Param("pipelineId") Long pipelineId, Context cont...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/AddNode.java
  class AddNode (line 30) | public class AddNode {
    method execute (line 35) | public void execute(Context context, Navigator nav) throws Exception {

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/AddPipeline.java
  class AddPipeline (line 29) | public class AddPipeline {
    method execute (line 37) | public void execute(@Param("channelId") Long channelId, Context contex...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/AddZookeeper.java
  class AddZookeeper (line 26) | public class AddZookeeper {
    method execute (line 31) | public void execute(@Param("message") String message, Context context,...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/AlarmRuleList.java
  class AlarmRuleList (line 30) | public class AlarmRuleList {
    method execute (line 38) | public void execute(@Param("pipelineId") Long pipelineId, Context cont...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/AlarmSystemList.java
  class AlarmSystemList (line 31) | public class AlarmSystemList {
    method execute (line 36) | public void execute(@Param("pipelineId") Long pipelineId, @Param("page...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/AnalysisDelayStat.java
  class AnalysisDelayStat (line 36) | public class AnalysisDelayStat {
    method execute (line 44) | public void execute(@Param("d5221") String startTime, @Param("d5222") ...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/AnalysisStageStat.java
  class AnalysisStageStat (line 39) | public class AnalysisStageStat {
    method execute (line 53) | public void execute(@Param("pipelineId") Long pipelineId, Context cont...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/AnalysisThroughputHistory.java
  class AnalysisThroughputHistory (line 38) | public class AnalysisThroughputHistory {
    method execute (line 46) | public void execute(@Param("d5221") String startTime, @Param("d5222") ...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/AnalysisThroughputStat.java
  class AnalysisThroughputStat (line 37) | public class AnalysisThroughputStat {
    method execute (line 45) | public void execute(@Param("pipelineId") Long pipelineId, Context cont...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/AnalysisTopStat.java
  class AnalysisTopStat (line 39) | public class AnalysisTopStat {
    method execute (line 53) | public void execute(@Param("searchKey") String searchKey, @Param("topN...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/AutoKeeperClientPath.java
  class AutoKeeperClientPath (line 32) | public class AutoKeeperClientPath {
    method execute (line 40) | public void execute(@Param("clusterId") String clusterId, @Param("addr...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/AutoKeeperClustersDetail.java
  class AutoKeeperClustersDetail (line 31) | public class AutoKeeperClustersDetail {
    method execute (line 39) | public void execute(@Param("clusterId") String clusterId, Context cont...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/AutoKeeperClustersList.java
  class AutoKeeperClustersList (line 31) | public class AutoKeeperClustersList {
    method execute (line 36) | public void execute(@Param("pageIndex") int pageIndex, @Param("searchK...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/BehaviorHistoryCurve.java
  class BehaviorHistoryCurve (line 39) | public class BehaviorHistoryCurve {
    method execute (line 50) | public void execute(@Param("d5221") String startTime, @Param("d5222") ...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/CanalInfo.java
  class CanalInfo (line 38) | public class CanalInfo {
    method execute (line 52) | public void execute(@Param("canalId") Long canalId, Context context) t...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/CanalList.java
  class CanalList (line 38) | public class CanalList {
    method execute (line 46) | public void execute(@Param("pageIndex") int pageIndex, @Param("searchK...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/ChannelInfo.java
  class ChannelInfo (line 26) | public class ChannelInfo {
    method execute (line 31) | public void execute(@Param("channelId") Long channelId, Context contex...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/ChannelList.java
  class ChannelList (line 37) | public class ChannelList {
    method execute (line 48) | public void execute(@Param("pageIndex") int pageIndex, @Param("searchK...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/CheckDelayStat.java
  class CheckDelayStat (line 48) | public class CheckDelayStat {
    method parseAlert (line 63) | private static Map<Long, Long> parseAlert(String alert) {
    method main (line 84) | public static void main(String[] args) {
    method execute (line 92) | public void execute(@Param("queueSize") String queueSize, @Param("dela...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/DataMatrixInfo.java
  class DataMatrixInfo (line 32) | public class DataMatrixInfo {
    method execute (line 40) | public void execute(@Param("matrixId") Long matrixId, Context context)...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/DataMatrixList.java
  class DataMatrixList (line 41) | public class DataMatrixList {
    method execute (line 49) | public void execute(@Param("pageIndex") int pageIndex, @Param("matrixI...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/DataMediaInfo.java
  class DataMediaInfo (line 33) | public class DataMediaInfo {
    method execute (line 44) | public void execute(@Param("dataMediaId") Long dataMediaId, Context co...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/DataMediaList.java
  class DataMediaList (line 35) | public class DataMediaList {
    method execute (line 43) | public void execute(@Param("pageIndex") int pageIndex, @Param("searchK...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/DataMediaPairInfo.java
  class DataMediaPairInfo (line 34) | public class DataMediaPairInfo {
    method execute (line 42) | public void execute(@Param("dataMediaPairId") Long dataMediaPairId, Co...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/DataMediaPairList.java
  class DataMediaPairList (line 34) | public class DataMediaPairList {
    method execute (line 45) | public void execute(@Param("pipelineId") Long pipelineId, Context cont...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/home/module/screen/DataSourceInfo.java
  class DataSourceInfo (line 30) | public class DataSourceInfo {
    method execute (line 38) | public void execute(@Param("dataMediaSourceId") Long dataMediaSourceId...

FILE: manager/web/src/main/java/com/alibaba/otter/manager/web/h
Condensed preview — 1153 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,483K chars).
[
  {
    "path": ".gitignore",
    "chars": 167,
    "preview": ".svn/\ntarget/\ntest-output/\n*.class\n.classpath\n.project\n.settings/\ntmp\ntemp\n*.log\nantx.properties\n.idea/\n*.iml\nhtdocs\npac"
  },
  {
    "path": "HEADER.txt",
    "chars": 623,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "LICENSE.txt",
    "chars": 11560,
    "preview": "\r\n                                 Apache License\r\n                           Version 2.0, January 2004\r\n               "
  },
  {
    "path": "README.md",
    "chars": 5271,
    "preview": "<h1>环境搭建 & 打包</h1>\n<strong>环境搭建:</strong>\n<ol>\n<li>进入 $otter_home/lib 目录</li>\n<li>执行:bash install.sh</li>\n</ol>\n<strong>"
  },
  {
    "path": "codeformat.xml",
    "chars": 30873,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<profiles version=\"12\">\n<profile kind=\"CodeFormatterProfile\" name"
  },
  {
    "path": "codetemplates.xml",
    "chars": 4768,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><templates><template autoinsert=\"true\" context=\"gettercomment_cont"
  },
  {
    "path": "docker/Dockerfile",
    "chars": 1201,
    "preview": "FROM canal/otter-osbase:v1\n\nMAINTAINER agapple (jianghang115@gmail.com)\n\n# install otter\nCOPY image/ /tmp/docker/\nCOPY m"
  },
  {
    "path": "docker/base/Dockerfile",
    "chars": 830,
    "preview": "FROM canal/osbase:v1\n\nMAINTAINER agapple (jianghang115@gmail.com)\n\nRUN \\\n    groupadd -r mysql && useradd -r -g mysql my"
  },
  {
    "path": "docker/build.sh",
    "chars": 706,
    "preview": "#!/bin/bash\n\ncurrent_path=`pwd`\ncase \"`uname`\" in\n    Darwin)\n        bin_abs_path=`cd $(dirname $0); pwd`\n        ;;\n  "
  },
  {
    "path": "docker/image/admin/app.sh",
    "chars": 7431,
    "preview": "#!/bin/bash\nset -e\n\nsource /etc/profile\nexport JAVA_HOME=/usr/java/latest\nexport PATH=$JAVA_HOME/bin:$PATH\ntouch /tmp/st"
  },
  {
    "path": "docker/image/admin/bin/clean_log",
    "chars": 106,
    "preview": "# cron clean log once per minute\n*/2 * * * * admin /home/admin/bin/clean_log.sh >>/tmp/clean_log.log 2>&1\n"
  },
  {
    "path": "docker/image/admin/bin/clean_log.sh",
    "chars": 1998,
    "preview": "#!/bin/bash\n\n# Global Settings\nPATH=\"$HOME/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/b"
  },
  {
    "path": "docker/image/admin/bin/ddl.sql",
    "chars": 13886,
    "preview": "CREATE DATABASE /*!32312 IF NOT EXISTS*/ `otter` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */;\n\nUSE `otter`;\n"
  },
  {
    "path": "docker/image/admin/health.sh",
    "chars": 280,
    "preview": "#!/bin/sh\nCHECK_URL=\"http://127.0.0.1:8080/ok.htm\"\nCHECK_POINT=\"ok\"\nCHECK_COUNT=`curl -s --connect-timeout 7 --max-time "
  },
  {
    "path": "docker/image/alidata/bin/exec_rc_local.sh",
    "chars": 262,
    "preview": "#!/bin/bash\n\nif [ \"${SKIP_EXEC_RC_LOCAL}\" = \"YES\" ] ; then\n\techo \"skip /etc/rc.local: SKIP_EXEC_RC_LOCAL=${SKIP_EXEC_RC_"
  },
  {
    "path": "docker/image/alidata/bin/lark-wait",
    "chars": 86,
    "preview": "#!/bin/bash\nset -e\n\nchown admin: -R /home/admin/\nsource /alidata/lib/proc.sh\nwaitterm\n"
  },
  {
    "path": "docker/image/alidata/bin/main.sh",
    "chars": 553,
    "preview": "#!/bin/bash\n\n[ -n \"${DOCKER_DEPLOY_TYPE}\" ] || DOCKER_DEPLOY_TYPE=\"VM\"\necho \"DOCKER_DEPLOY_TYPE=${DOCKER_DEPLOY_TYPE}\"\n\n"
  },
  {
    "path": "docker/image/alidata/init/02init-sshd.sh",
    "chars": 511,
    "preview": "#!/bin/bash\n\n# set port\nif [ -z \"${SSHD_PORT}\" ] ; then\n\tSSHD_PORT=22\n\t[ \"${DOCKER_DEPLOY_TYPE}\" = \"HOST\" ] && SSHD_PORT"
  },
  {
    "path": "docker/image/alidata/init/fix-hosts.py",
    "chars": 1671,
    "preview": "#!/usr/bin/python\n# -*- coding: utf-8 -*-\n#****************************************************************#\n# Create Da"
  },
  {
    "path": "docker/image/alidata/lib/proc.sh",
    "chars": 976,
    "preview": "# waitterm\n#   wait TERM/INT signal.\n#   see: http://veithen.github.io/2014/11/16/sigterm-propagation.html\nwaitterm() {\n"
  },
  {
    "path": "docker/run.sh",
    "chars": 1880,
    "preview": "#!/bin/bash\n\nfunction usage() {\n    echo \"Usage:\"\n    echo \"  run.sh [CONFIG]\"\n    echo \"example:\"\n    echo \"  run.sh NO"
  },
  {
    "path": "lib/install.bat",
    "chars": 540,
    "preview": "call mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.1.0.7.0 -Dpackaging=jar -Dfile=ojdbc"
  },
  {
    "path": "lib/install.sh",
    "chars": 537,
    "preview": "#!/bin/bash\nmvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.1.0.7.0 -Dpackaging=jar -Dfil"
  },
  {
    "path": "lib/jmockit-0.999.10.pom",
    "chars": 4057,
    "preview": "<project\r\n   xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n   xsi:sch"
  },
  {
    "path": "lib/jtester-1.1.8.pom",
    "chars": 4020,
    "preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\r\n\txsi:schemaLoc"
  },
  {
    "path": "manager/biz/pom.xml",
    "chars": 3662,
    "preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocat"
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/autokeeper/AutoKeeperStatService.java",
    "chars": 1924,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/autokeeper/impl/AutoKeeperCollector.java",
    "chars": 18676,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/autokeeper/impl/AutoKeeperData.java",
    "chars": 3257,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/autokeeper/impl/AutoKeeperPersist.java",
    "chars": 869,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/autokeeper/impl/AutoKeeperStatServiceImpl.java",
    "chars": 2963,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/DataSourceCreator.java",
    "chars": 8724,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/alarm/AbstractAlarmService.java",
    "chars": 3927,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/alarm/AlarmMessage.java",
    "chars": 1043,
    "preview": "package com.alibaba.otter.manager.biz.common.alarm;\n\nimport java.io.Serializable;\n\nimport org.apache.commons.lang.builde"
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/alarm/AlarmService.java",
    "chars": 1056,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/alarm/DefaultAlarmService.java",
    "chars": 3346,
    "preview": "package com.alibaba.otter.manager.biz.common.alarm;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport org.apac"
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/arbitrate/ArbitrateConfigImpl.java",
    "chars": 5931,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/arbitrate/DeadNodeListener.java",
    "chars": 8767,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/basedao/GenericDAO.java",
    "chars": 1213,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/baseservice/GenericService.java",
    "chars": 1173,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/exceptions/InvalidConfigureException.java",
    "chars": 458,
    "preview": "package com.alibaba.otter.manager.biz.common.exceptions;\n\npublic class InvalidConfigureException extends RuntimeExceptio"
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/exceptions/ManagerException.java",
    "chars": 1112,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/common/exceptions/RepeatConfigureException.java",
    "chars": 1102,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/alarm/AlarmRuleService.java",
    "chars": 1798,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/alarm/dal/AlarmRuleDAO.java",
    "chars": 1523,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/alarm/dal/dataobject/AlarmRuleDO.java",
    "chars": 3231,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/alarm/dal/dataobject/AlarmRuleParameter.java",
    "chars": 1842,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/alarm/dal/ibatis/AlarmRuleParameterTypeHandler.java",
    "chars": 1659,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/alarm/dal/ibatis/IbatisAlarmRuleDAO.java",
    "chars": 3541,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/alarm/impl/AlarmRuleServiceImpl.java",
    "chars": 8704,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/autokeeper/AutoKeeperClusterService.java",
    "chars": 1260,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/autokeeper/dal/AutoKeeperClusterDAO.java",
    "chars": 1218,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/autokeeper/dal/dataobject/AutoKeeperClusterDO.java",
    "chars": 2238,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/autokeeper/dal/ibatis/IbatisAutoKeeperClusterDAO.java",
    "chars": 2591,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/autokeeper/impl/AutoKeeperClusterServiceImpl.java",
    "chars": 4505,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/canal/CanalService.java",
    "chars": 1257,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/canal/dal/CanalDAO.java",
    "chars": 973,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/canal/dal/dataobject/CanalDO.java",
    "chars": 2676,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/canal/dal/ibatis/CanalParameterTypeHandler.java",
    "chars": 1625,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/canal/dal/ibatis/IbatisCanalDAO.java",
    "chars": 2836,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/canal/impl/CanalServiceImpl.java",
    "chars": 10501,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/channel/ChannelService.java",
    "chars": 1667,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/channel/dal/ChannelDAO.java",
    "chars": 983,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/channel/dal/dataobject/ChannelDO.java",
    "chars": 2613,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/channel/dal/ibatis/ChannelParameterTypeHandler.java",
    "chars": 1646,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/channel/dal/ibatis/IbatisChannelDAO.java",
    "chars": 3209,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/channel/impl/ChannelServiceImpl.java",
    "chars": 27867,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datacolumnpair/DataColumnPairGroupService.java",
    "chars": 1289,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datacolumnpair/DataColumnPairService.java",
    "chars": 1340,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datacolumnpair/dal/DataColumnPairDAO.java",
    "chars": 1340,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datacolumnpair/dal/DataColumnPairGroupDAO.java",
    "chars": 1298,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datacolumnpair/dal/dataobject/DataColumnPairDO.java",
    "chars": 2327,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datacolumnpair/dal/dataobject/DataColumnPairGroupDO.java",
    "chars": 2038,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datacolumnpair/dal/ibatis/IbatisDataColumnPairDAO.java",
    "chars": 4809,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datacolumnpair/dal/ibatis/IbatisDataColumnPairGroupDAO.java",
    "chars": 3694,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datacolumnpair/impl/DataColumnPairGroupServiceImpl.java",
    "chars": 8176,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datacolumnpair/impl/DataColumnPairServiceImpl.java",
    "chars": 9541,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamatrix/DataMatrixService.java",
    "chars": 1284,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamatrix/dal/DataMatrixDAO.java",
    "chars": 961,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamatrix/dal/dataobject/DataMatrixDO.java",
    "chars": 2388,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamatrix/dal/ibatis/IbatisDataMatrixDAO.java",
    "chars": 3001,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamatrix/impl/DataMatrixServiceImpl.java",
    "chars": 9416,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamedia/DataMediaService.java",
    "chars": 1279,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamedia/dal/DataMediaDAO.java",
    "chars": 1100,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamedia/dal/dataobject/DataMediaDO.java",
    "chars": 2364,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamedia/dal/ibatis/IbatisDataMediaDAO.java",
    "chars": 3669,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamedia/impl/DataMediaServiceImpl.java",
    "chars": 12851,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamediapair/DataMediaPairService.java",
    "chars": 1307,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamediapair/dal/DataMediaPairDAO.java",
    "chars": 1108,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamediapair/dal/dataobject/DataMediaPairDO.java",
    "chars": 3496,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamediapair/dal/ibatis/IbatisDataMediaPairDAO.java",
    "chars": 4248,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamediapair/impl/DataMediaPairServiceImpl.java",
    "chars": 17076,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamediasource/DataMediaSourceService.java",
    "chars": 1033,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamediasource/dal/DataMediaSourceDAO.java",
    "chars": 954,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamediasource/dal/dataobject/DataMediaSourceDO.java",
    "chars": 2095,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamediasource/dal/ibatis/IbatisDataMediaSourceDAO.java",
    "chars": 3601,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/datamediasource/impl/DataMediaSourceServiceImpl.java",
    "chars": 9687,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/node/NodeService.java",
    "chars": 900,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/node/dal/NodeDAO.java",
    "chars": 899,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/node/dal/dataobject/NodeDO.java",
    "chars": 3067,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/node/dal/ibatis/IbatisNodeDAO.java",
    "chars": 2810,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/node/dal/ibatis/NodeParameterTypeHandler.java",
    "chars": 1625,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/node/impl/NodeServiceImpl.java",
    "chars": 10712,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/parameter/SystemParameterService.java",
    "chars": 957,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/parameter/dal/SystemParameterDAO.java",
    "chars": 967,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/parameter/dal/dataobject/SystemParameterDO.java",
    "chars": 1918,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/parameter/dal/ibatis/IbatisSystemParameterDAO.java",
    "chars": 2523,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/parameter/dal/ibatis/SystemParameterTypeHandler.java",
    "chars": 1645,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/parameter/impl/SystemParameterServiceImpl.java",
    "chars": 3425,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/pipeline/PipelineService.java",
    "chars": 1341,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/pipeline/dal/PipelineDAO.java",
    "chars": 1085,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/pipeline/dal/PipelineNodeRelationDAO.java",
    "chars": 1444,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/pipeline/dal/dataobject/PipelineDO.java",
    "chars": 2432,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/pipeline/dal/dataobject/PipelineNodeRelationDO.java",
    "chars": 2431,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/pipeline/dal/ibatis/IbatisPipelineDAO.java",
    "chars": 3637,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/pipeline/dal/ibatis/IbatisPipelineNodeRelationDAO.java",
    "chars": 4504,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/pipeline/dal/ibatis/PipelineParameterTypeHandler.java",
    "chars": 1669,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/pipeline/impl/PipelineServiceImpl.java",
    "chars": 25838,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/record/LogRecordService.java",
    "chars": 1205,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/record/dal/LogRecordDAO.java",
    "chars": 1147,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/record/dal/dataobject/LogRecordDO.java",
    "chars": 2390,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/record/dal/ibatis/IbatisLogRecordDAO.java",
    "chars": 3750,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/record/impl/LogRecordServiceImpl.java",
    "chars": 8647,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/utils/ListTypeHandler.java",
    "chars": 1619,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/config/utils/MapTypeHandler.java",
    "chars": 1538,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/AlarmController.java",
    "chars": 977,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/AlarmRecovery.java",
    "chars": 1151,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/Monitor.java",
    "chars": 1007,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/MonitorRuleExplorerRegisty.java",
    "chars": 3590,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/MonitorTimer.java",
    "chars": 1027,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/PassiveMonitor.java",
    "chars": 1002,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/impl/AbstractRuleMonitor.java",
    "chars": 6584,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/impl/AlarmRecoveryDelayed.java",
    "chars": 3422,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/impl/DefaultAlarmController.java",
    "chars": 5684,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/impl/DelayStatRuleMonitor.java",
    "chars": 3978,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/impl/ExceptionRuleMonitor.java",
    "chars": 3778,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/impl/GlobalMonitor.java",
    "chars": 9482,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/impl/PipelineMonitor.java",
    "chars": 4774,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/impl/PipelineTimeoutRuleMonitor.java",
    "chars": 3518,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/impl/PositionTimeoutRuleMonitor.java",
    "chars": 3808,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/impl/ProcessTimeoutRuleMonitor.java",
    "chars": 4182,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/impl/RestartAlarmRecovery.java",
    "chars": 6972,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/monitor/impl/SelfMonitor.java",
    "chars": 3133,
    "preview": "package com.alibaba.otter.manager.biz.monitor.impl;\n\nimport java.util.List;\nimport java.util.concurrent.ScheduledExecuto"
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/remote/ArbitrateRemoteService.java",
    "chars": 1225,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/remote/CanalRemoteService.java",
    "chars": 1196,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/remote/ConfigRemoteService.java",
    "chars": 1715,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/remote/NodeRemoteService.java",
    "chars": 2950,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/remote/StatsRemoteService.java",
    "chars": 1287,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/remote/impl/ArbitrateRemoteServiceImpl.java",
    "chars": 3675,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/remote/impl/CanalRemoteServiceImpl.java",
    "chars": 2868,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/remote/impl/ConfigRemoteServiceImpl.java",
    "chars": 7626,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/remote/impl/NodeMBeanServiceImpl.java",
    "chars": 7577,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/remote/impl/StatsRemoteServiceImpl.java",
    "chars": 9331,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/remote/interceptor/RemoteExceptionLoggerInterceptor.java",
    "chars": 2330,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/delay/DelayCounter.java",
    "chars": 958,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/delay/DelayStatService.java",
    "chars": 1349,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/delay/dal/DelayStatDAO.java",
    "chars": 1498,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/delay/dal/dataobject/DelayStatDO.java",
    "chars": 2323,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/delay/dal/ibatis/IbatisDelayStatDAO.java",
    "chars": 3417,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/delay/impl/DelayStatServiceImpl.java",
    "chars": 4995,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/delay/param/DelayCountParam.java",
    "chars": 1108,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/delay/param/DelayStatInfo.java",
    "chars": 1935,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/delay/param/TimelineDelayCondition.java",
    "chars": 1273,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/delay/param/TopDelayStat.java",
    "chars": 3361,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/stage/ProcessStatService.java",
    "chars": 1201,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/stage/dal/ProcessDAO.java",
    "chars": 1263,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/stage/dal/dataobject/ProcessStatDO.java",
    "chars": 1956,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/stage/dal/ibatis/IbatisProcessDAO.java",
    "chars": 2043,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/stage/impl/ProcessStatServiceImpl.java",
    "chars": 2400,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/table/TableStatService.java",
    "chars": 1501,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/table/dal/TableHistoryStatDAO.java",
    "chars": 1188,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/table/dal/TableStatDAO.java",
    "chars": 1328,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/table/dal/dataobject/TableHistoryStatDO.java",
    "chars": 3561,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/table/dal/dataobject/TableStatDO.java",
    "chars": 3174,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/table/dal/ibatis/IbatisTableHistoryStatDAO.java",
    "chars": 1622,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/table/dal/ibatis/IbatisTableStatDAO.java",
    "chars": 2983,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/table/impl/TableStatServiceImpl.java",
    "chars": 11561,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/table/param/BehaviorHistoryCondition.java",
    "chars": 1383,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/table/param/BehaviorHistoryInfo.java",
    "chars": 5853,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/table/param/TimelineBehaviorHistoryCondition.java",
    "chars": 1144,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/throughput/ThroughputStatService.java",
    "chars": 1812,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/throughput/dal/ThroughputDAO.java",
    "chars": 1911,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/throughput/dal/dataobject/ThroughputStatDO.java",
    "chars": 2908,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/throughput/dal/ibatis/IbatisThroughputDAO.java",
    "chars": 3646,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/throughput/impl/ThroughputStatServiceImpl.java",
    "chars": 8316,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/throughput/param/AnalysisType.java",
    "chars": 976,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/throughput/param/RealtimeThroughputCondition.java",
    "chars": 1751,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/throughput/param/ThroughputCondition.java",
    "chars": 1687,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/throughput/param/ThroughputInfo.java",
    "chars": 3074,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/statistics/throughput/param/TimelineThroughputCondition.java",
    "chars": 1138,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/user/UserService.java",
    "chars": 1213,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/user/dal/UserDAO.java",
    "chars": 1328,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/user/dal/dataobject/UserDO.java",
    "chars": 2485,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/user/dal/ibatis/IbatisUserDAO.java",
    "chars": 2917,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/user/impl/UserServiceImpl.java",
    "chars": 5285,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/utils/DataSourceChecker.java",
    "chars": 13889,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/java/com/alibaba/otter/manager/biz/utils/RegexUtils.java",
    "chars": 2306,
    "preview": "/*\n * Copyright (C) 2010-2101 Alibaba Group Holding Limited.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": "manager/biz/src/main/resources/spring/otter-manager-alarm.xml",
    "chars": 2118,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www"
  },
  {
    "path": "manager/biz/src/main/resources/spring/otter-manager-arbitrate.xml",
    "chars": 1364,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\" xmlns:xsi=\"http://www."
  },
  {
    "path": "manager/biz/src/main/resources/spring/otter-manager-autokeeper.xml",
    "chars": 1304,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<beans xmlns=\"http://www.springframework.org/schema/beans\"\n\txmlns:xsi=\"http://www"
  }
]

// ... and 953 more files (download for full content)

About this extraction

This page contains the full source code of the alibaba/otter GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1153 files (4.9 MB), approximately 1.4M tokens, and a symbol index with 7681 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!