├── .github └── workflows │ └── ci.yml ├── .gitignore ├── .mvn └── wrapper │ ├── maven-wrapper.jar │ └── maven-wrapper.properties ├── DEVELOPMENT.md ├── Dockerfile ├── LICENSE ├── Makefile ├── README.md ├── dev ├── APACHE-2.txt └── google_checks.xml ├── docker-compose.yml ├── jax-api-flink-1_12 ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── eoi │ └── jax │ └── api │ ├── CustomStatementSet.java │ ├── CustomStreamTableEnvironmentImpl.java │ ├── CustomTableEnvironmentImpl.java │ ├── FlinkDebugSinker.java │ ├── FlinkEnvironment.java │ ├── FlinkProcessJobBuilder.java │ ├── FlinkSinkJobBuilder.java │ ├── FlinkSourceJobBuilder.java │ ├── FlinkSqlJobBuilder.java │ ├── InsertResultIterator.java │ └── TableResultImpl.java ├── jax-api-flink-1_9 ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── eoi │ └── jax │ └── api │ ├── FlinkDebugSinker.java │ ├── FlinkEnvironment.java │ ├── FlinkProcessJobBuilder.java │ ├── FlinkSinkJobBuilder.java │ ├── FlinkSourceJobBuilder.java │ └── FlinkSqlJobBuilder.java ├── jax-api ├── pom.xml └── src │ ├── main │ └── java │ │ └── com │ │ └── eoi │ │ └── jax │ │ └── api │ │ ├── BatchProcessBuilder.java │ │ ├── BatchSinkBuilder.java │ │ ├── BatchSourceBuilder.java │ │ ├── BatchSqlBuilder.java │ │ ├── Builder.java │ │ ├── ConfigUtil.java │ │ ├── ConfigValidatable.java │ │ ├── EmptyConfig.java │ │ ├── FlinkDebugSinkerMeta.java │ │ ├── InvalidConfigParam.java │ │ ├── JobConfigValidationException.java │ │ ├── JobFailedException.java │ │ ├── JobMetaConfig.java │ │ ├── OutputTableConfig.java │ │ ├── SparkCacheableJobBuilder.java │ │ ├── SparkDebugSinker.java │ │ ├── SparkDebugSinkerMeta.java │ │ ├── SparkEnvironment.java │ │ ├── SparkMergeableJobBuilder.java │ │ ├── SparkProcessJobBuilder.java │ │ ├── SparkProcessTableBuilder.java │ │ ├── SparkSinkJobBuilder.java │ │ ├── SparkSinkTableBuilder.java │ │ ├── SparkSourceJobBuilder.java │ │ ├── SparkSourceTableBuilder.java │ │ ├── StreamingDebugSinker.java │ │ ├── StreamingProcessBuilder.java │ │ ├── StreamingSinkBuilder.java │ │ ├── StreamingSourceBuilder.java │ │ ├── StreamingSqlBuilder.java │ │ ├── annotation │ │ ├── DataType.java │ │ ├── FlatStringMap.java │ │ ├── InputType.java │ │ ├── Job.java │ │ ├── Parameter.java │ │ ├── Shift.java │ │ └── model │ │ │ ├── JobParamMeta.java │ │ │ └── ParamMeta.java │ │ ├── reflect │ │ ├── FieldScanner.java │ │ ├── JobParamReflector.java │ │ ├── JobParamValidator.java │ │ ├── ParamTypeAnalyzer.java │ │ ├── ParamUtil.java │ │ ├── ParamValueConverter.java │ │ └── ReflectUtil.java │ │ └── tuple │ │ ├── StringUtils.java │ │ ├── Tuple.java │ │ ├── Tuple0.java │ │ ├── Tuple1.java │ │ ├── Tuple2.java │ │ ├── Tuple3.java │ │ ├── Tuple4.java │ │ └── builder │ │ ├── Tuple0Builder.java │ │ ├── Tuple1Builder.java │ │ ├── Tuple2Builder.java │ │ ├── Tuple3Builder.java │ │ └── Tuple4Builder.java │ └── test │ └── java │ └── com │ └── eoi │ └── jax │ └── api │ └── reflect │ └── v2 │ ├── Config1.java │ ├── Config2.java │ ├── Config3.java │ ├── Config4.java │ ├── Config5.java │ ├── Config6.java │ ├── Config7.java │ ├── Config8.java │ ├── Config9.java │ ├── ConfigX.java │ ├── ConfigY.java │ ├── ConfigZ.java │ ├── ParamUtilTest.java │ └── ScanParamsTest.java ├── jax-common ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── eoi │ │ │ └── jax │ │ │ └── common │ │ │ ├── ConverterUtil.java │ │ │ ├── CopyUtil.java │ │ │ ├── JsonUtil.java │ │ │ ├── KafkaUtil.java │ │ │ ├── NashornUtil.java │ │ │ ├── NumberFormatUtil.java │ │ │ ├── OperatorCategory.java │ │ │ ├── PythonHelper.java │ │ │ ├── ReflectUtil.java │ │ │ ├── VersionUtil.java │ │ │ ├── converter │ │ │ ├── BooleanConverter.java │ │ │ ├── ConvertOption.java │ │ │ ├── Converter.java │ │ │ ├── ConverterException.java │ │ │ ├── DoubleConverter.java │ │ │ ├── FloatConverter.java │ │ │ ├── IntegerConverter.java │ │ │ ├── LongConverter.java │ │ │ └── StringConverter.java │ │ │ ├── dissect │ │ │ ├── DissectContext.java │ │ │ ├── DissectException.java │ │ │ ├── DissectKey.java │ │ │ ├── DissectMatch.java │ │ │ └── DissectPair.java │ │ │ ├── geoip │ │ │ ├── CityInfo.java │ │ │ ├── CnRegionInfo.java │ │ │ ├── CountryInfo.java │ │ │ ├── IpEntry.java │ │ │ ├── IpSeeker.java │ │ │ ├── ProvinceInfo.java │ │ │ └── RegionDetail.java │ │ │ ├── grok │ │ │ ├── GrokKeyValue.java │ │ │ ├── GrokParseException.java │ │ │ └── GrokParser.java │ │ │ ├── map │ │ │ └── LRUMap.java │ │ │ └── uaparser │ │ │ ├── CachingParser.java │ │ │ ├── Client.java │ │ │ ├── Constants.java │ │ │ ├── Device.java │ │ │ ├── DeviceParser.java │ │ │ ├── OS.java │ │ │ ├── OsParser.java │ │ │ ├── Parser.java │ │ │ ├── UserAgent.java │ │ │ └── UserAgentParser.java │ └── resources │ │ ├── grok.patterns │ │ ├── aws │ │ ├── bacula │ │ ├── bro │ │ ├── exim │ │ ├── firewalls │ │ ├── grok-patterns │ │ ├── haproxy │ │ ├── java │ │ ├── junos │ │ ├── linux-syslog │ │ ├── mcollective │ │ ├── mcollective-patterns │ │ ├── mongodb │ │ ├── nagios │ │ ├── postgresql │ │ ├── rails │ │ ├── redis │ │ └── ruby │ │ └── qqwry.dat │ └── test │ ├── java │ └── com │ │ └── eoi │ │ └── jax │ │ └── common │ │ └── test │ │ ├── ConverterUtilTest.java │ │ ├── GrokParserTest.java │ │ ├── VersionUtilTest.java │ │ └── reflect │ │ ├── CommonInterface.java │ │ ├── CommonInterface2.java │ │ ├── CommonInterface3.java │ │ ├── ParameterizedInterface.java │ │ ├── ReflectUtilTest.java │ │ ├── TestSubClass1.java │ │ ├── TestSubClass2.java │ │ ├── TestSubClass4.java │ │ └── nested │ │ ├── ClassFlag.java │ │ ├── Flag.java │ │ ├── FourthClass.java │ │ ├── FourthClass2.java │ │ ├── FourthClass3.java │ │ ├── FourthClass4.java │ │ ├── FourthInterface.java │ │ ├── SecondInterface.java │ │ ├── T0.java │ │ ├── T1.java │ │ ├── T2.java │ │ ├── ThirdInterface.java │ │ ├── ThridClass.java │ │ └── TopInterface.java │ └── resources │ └── haproxy ├── jax-core ├── pom.xml └── src │ ├── main │ └── java │ │ └── com │ │ └── eoi │ │ └── jax │ │ └── core │ │ ├── AbstractDAGNode.java │ │ ├── AbstractDAGVisitor.java │ │ ├── BaseJobDAGBuilder.java │ │ ├── BaseJobNode.java │ │ ├── CheckConfigDAGBuilder.java │ │ ├── CheckConfigNode.java │ │ ├── DAGVisitException.java │ │ ├── FlinkJobDAGBuilder.java │ │ ├── FlinkJobNode.java │ │ ├── FlinkJobOpts.java │ │ ├── GraphCircleDetectedException.java │ │ ├── InvalidTopologyException.java │ │ ├── JobBuildException.java │ │ ├── JobInfo.java │ │ ├── JobMeta.java │ │ ├── JobMetaException.java │ │ ├── JobMetaScanner.java │ │ ├── NoSourceNodeException.java │ │ ├── PythonJobInfo.java │ │ ├── SparkJobDAGBuilder.java │ │ ├── SparkJobNode.java │ │ ├── SparkJobOpts.java │ │ ├── UnsupportJobBuidlerException.java │ │ ├── WebSocketClient.java │ │ ├── WebsocketDebugSinkerConfig.java │ │ ├── entry │ │ ├── EdgeDescription.java │ │ └── JobDescription.java │ │ ├── flink │ │ ├── debug │ │ │ ├── WebSocketTextSinkFunction.java │ │ │ └── WebsocketDebugSinker.java │ │ └── python │ │ │ ├── Constants.java │ │ │ ├── KeySelectorForMap.java │ │ │ ├── PythonEntryPoint.java │ │ │ ├── PythonRunner.java │ │ │ ├── PythonWrapperJob.java │ │ │ ├── PythonWrapperJobConfig.java │ │ │ └── PythonWrapperJobFunction.java │ │ └── spark │ │ ├── debug │ │ └── WebsocketDebugSinker.java │ │ └── python │ │ ├── BridgeJob.scala │ │ ├── BridgeJobConfig.java │ │ ├── Logging.scala │ │ ├── PythonJobEndpoint.scala │ │ ├── PythonOnDriverException.java │ │ └── PythonSync.java │ └── test │ └── java │ └── com │ └── eoi │ └── jax │ └── core │ └── test │ ├── AbstractDAGVisitorMultiSlotTest.java │ ├── AbstractDAGVisitorTest.java │ ├── CheckConfigDAGBuilderTest.java │ ├── EdgeDescriptionTest.java │ ├── ExampleCountSource.java │ ├── FlinkJobDAGBuilderTest.java │ ├── JobMetaScannerTest.java │ ├── PrintDebugSinker.java │ ├── PrintDebugSinkerConfig.java │ ├── Py4jTest.java │ ├── SparkJobDAGBuilderDebugTest.java │ ├── SparkJobDAGBuilderTest.java │ ├── SparkPrintDebugSinker.java │ ├── TestAbstractDAGNode.java │ ├── TestAbstractDAGVisitor.java │ ├── TestDAGChain.java │ ├── TestJob.java │ ├── TestProcessJob.java │ ├── TestProcessJob0.java │ ├── TestProcessJob1.java │ ├── TestProcessJob2.java │ ├── TestProcessJob2Config.java │ ├── TestProcessJob3.java │ ├── TestSinkJob.java │ ├── TestSourceJob.java │ └── TestSourceMapJob.java ├── jax-flink-entry-1_12 ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── eoi │ └── jax │ └── flink_entry │ ├── FlinkContextMainBuilder.java │ ├── FlinkLocalMiniCluster.java │ ├── FlinkMainEntry.java │ ├── FlinkParamException.java │ └── FlinkPipelineDescription.java ├── jax-flink-entry-1_9 ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── eoi │ └── jax │ └── flink_entry │ ├── FlinkContextMainBuilder.java │ ├── FlinkLocalMiniCluster.java │ ├── FlinkMainEntry.java │ ├── FlinkParamException.java │ └── FlinkPipelineDescription.java ├── jax-flink-job-1_12 ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── eoi │ │ └── jax │ │ └── flink1_12 │ │ └── job │ │ ├── common │ │ ├── ElasticSearchHttpClientConfigCallback.java │ │ └── ElasticSearchRestClientConfigFactory.java │ │ ├── process │ │ ├── AvroDecoderFunction.java │ │ ├── AvroDecoderJob.java │ │ ├── SqlExecuteJob.java │ │ ├── SqlExecuteJobConfig.java │ │ ├── SqlJob.java │ │ ├── StreamToTableJob.java │ │ ├── TableToStreamJob.java │ │ ├── WatermarkJob.java │ │ ├── WatermarkJobConfig.java │ │ └── WatermarkPeriodicAssigner.java │ │ ├── sink │ │ ├── ElasticSearchMapSinkFunction.java │ │ ├── ElasticSearchSinkJob.java │ │ ├── ElasticsearchFailureHandler.java │ │ ├── FileSinkJob.java │ │ ├── FileSinkJobConfig.java │ │ ├── JDBCSinkJob.java │ │ ├── KafkaSinkJob.java │ │ └── MapKafkaSerializationSchema.java │ │ └── source │ │ ├── KafkaByteDeserialization.java │ │ ├── KafkaByteSourceJob.java │ │ ├── KafkaOffsetSetting.java │ │ ├── KafkaSourceDeserialization.java │ │ ├── KafkaSourceJob.java │ │ ├── KafkaSourceJobConfig.java │ │ └── KafkaSpecifiedOffset.java │ └── resources │ ├── JOB-DOC │ ├── AvroDecoderJob.md │ ├── ElasticSearchSinkJob.md │ ├── FileSinkJob.md │ ├── JDBCSinkJob.md │ ├── KafkaByteSourceJob.md │ ├── KafkaSinkJob.md │ ├── KafkaSourceJob.md │ ├── SqlJob.md │ └── WatermarkJob.md │ ├── JOB-ICON │ ├── AvroDecoderJob.svg │ ├── ElasticSearchSinkJob.svg │ ├── FileSinkJob.svg │ ├── JDBCSinkJob.svg │ ├── KafkaByteSourceJob.svg │ ├── KafkaSinkJob.svg │ ├── SqlJob.svg │ ├── StreamToTableJob.svg │ ├── TableToStreamJob.svg │ └── WatermarkJob.svg │ ├── META-INF │ └── services │ │ └── com.eoi.jax.api.Builder │ └── supportVersion ├── jax-flink-job-1_9 ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── eoi │ │ └── jax │ │ └── flink │ │ └── job │ │ ├── common │ │ ├── ElasticSearchHttpClientConfigCallback.java │ │ └── ElasticSearchRestClientConfigFactory.java │ │ ├── process │ │ ├── AvroDecoderFunction.java │ │ ├── AvroDecoderJob.java │ │ ├── SqlJob.java │ │ ├── StreamToTableJob.java │ │ └── TableToStreamJob.java │ │ ├── sink │ │ ├── ElasticSearchMapSinkFunction.java │ │ ├── ElasticSearchSinkJob.java │ │ ├── ElasticsearchFailureHandler.java │ │ ├── FileSinkJob.java │ │ ├── JDBCSinkJob.java │ │ ├── KafkaSinkJob.java │ │ └── MapKafkaSerializationSchema.java │ │ └── source │ │ ├── KafkaByteDeserialization.java │ │ └── KafkaByteSourceJob.java │ └── resources │ ├── JOB-DOC │ ├── AvroDecoderJob.md │ ├── ElasticSearchSinkJob.md │ ├── FileSinkJob.md │ ├── JDBCSinkJob.md │ ├── KafkaByteSourceJob.md │ ├── KafkaSinkJob.md │ └── SqlJob.md │ ├── JOB-ICON │ ├── AvroDecoderJob.svg │ ├── ElasticSearchSinkJob.svg │ ├── FileSinkJob.svg │ ├── JDBCSinkJob.svg │ ├── KafkaByteSourceJob.svg │ ├── KafkaSinkJob.svg │ ├── SqlJob.svg │ ├── StreamToTableJob.svg │ └── TableToStreamJob.svg │ ├── META-INF │ └── services │ │ └── com.eoi.jax.api.Builder │ └── supportVersion ├── jax-flink-job-common ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── eoi │ └── jax │ └── flink │ └── job │ ├── common │ ├── AdvanceConfig.java │ ├── AvroDecoderJobConfig.java │ ├── DecoderException.java │ ├── DecoderFunction.java │ ├── DecoderJobConfig.java │ ├── ElasticSearchIndexFormatter.java │ ├── ElasticSearchSinkJobConfig.java │ ├── ElasticSearchSourceJobConfig.java │ ├── FileSinkJobConfig.java │ ├── FileSinkMapFunction.java │ ├── FlinkKafkaPartitionType.java │ ├── KafkaByteSourceItem.java │ ├── KafkaByteSourceJobConfig.java │ ├── KafkaSecurityConfig.java │ ├── KafkaSinkJobConfig.java │ ├── KafkaSourceMetaData.java │ ├── KafkaTopicCreateConfig.java │ ├── KafkaUtil.java │ ├── TimestampConvertJobConfig.java │ └── TimestampConvertUtil.java │ ├── process │ ├── EventFilter.java │ ├── EventTimeExtract.java │ ├── JDBCSinkJobConfig.java │ ├── JDBCSinkJobConfigBase.java │ ├── MapStreamTableSource.java │ ├── MapToRowMapFunction.java │ ├── SchemaColumnDef.java │ ├── SqlJobConfig.java │ ├── StreamToTableJobConfig.java │ ├── TableToStreamMapFunction.java │ └── TimestampMapper.java │ └── sink │ ├── JDBCSinkJobConfig.java │ ├── JDBCSinkJobConfigBase.java │ ├── MapPrintSinkFunction.java │ └── OutputTagsWrapper.java ├── jax-flink-job ├── pom.xml └── src │ └── main │ ├── java │ └── com │ │ └── eoi │ │ └── jax │ │ └── flink │ │ └── job │ │ ├── common │ │ ├── AviatorUtil.java │ │ └── KeySelectorForMap.java │ │ ├── process │ │ ├── AddFieldsDef.java │ │ ├── AddFieldsJob.java │ │ ├── AddFieldsJobConfig.java │ │ ├── AggDef.java │ │ ├── AviatorProcessJob.java │ │ ├── AviatorProcessJobConfig.java │ │ ├── AviatorProcessJobFunction.java │ │ ├── ColumnOpDef.java │ │ ├── ColumnOpFunction.java │ │ ├── DissectFunction.java │ │ ├── DissectJob.java │ │ ├── DissectJobConfig.java │ │ ├── EnrichByAsyncIOFunction.java │ │ ├── EnrichByAsyncIOJob.java │ │ ├── EnrichByAsyncIOJobConfig.java │ │ ├── EnrichByAsyncIOKey.java │ │ ├── EnrichByBroadcastFunction.java │ │ ├── EnrichByBroadcastJob.java │ │ ├── EnrichByBroadcastJobConfig.java │ │ ├── ExplodeJob.java │ │ ├── ExplodeJobConfig.java │ │ ├── ExplodeJobFunction.java │ │ ├── FilterFieldJob.java │ │ ├── FilterFieldJobConfig.java │ │ ├── FilterFieldJobFunction.java │ │ ├── FilterFunction.java │ │ ├── FilterJob.java │ │ ├── FilterJobConfig.java │ │ ├── GeoIPFunction.java │ │ ├── GeoIPJob.java │ │ ├── GeoIPJobConfig.java │ │ ├── GrokParseFunction.java │ │ ├── GrokParseJob.java │ │ ├── GrokParseJobConfig.java │ │ ├── GsubFunction.java │ │ ├── GsubJob.java │ │ ├── GsubJobConfig.java │ │ ├── JavascriptProcessJob.java │ │ ├── JavascriptProcessJobConfig.java │ │ ├── JavascriptProcessJobFunction.java │ │ ├── JsonDecoderFunction.java │ │ ├── JsonDecoderJob.java │ │ ├── JsonDecoderJobConfig.java │ │ ├── JsonParseJob.java │ │ ├── JsonParseJobConfig.java │ │ ├── JsonParseJobFunction.java │ │ ├── JsonStringToMapFunction.java │ │ ├── JsonStringToMapJob.java │ │ ├── JsonStringToMapJobConfig.java │ │ ├── KeyValueParseFunction.java │ │ ├── KeyValueParseJob.java │ │ ├── KeyValueParseJobConfig.java │ │ ├── PartitionJob.java │ │ ├── PartitionJobConfig.java │ │ ├── RemoveFieldsJob.java │ │ ├── RemoveFieldsJobConfig.java │ │ ├── RenameFieldsDef.java │ │ ├── RenameFieldsJob.java │ │ ├── RenameFieldsJobConfig.java │ │ ├── SchemaInvalidException.java │ │ ├── StringDecoderFunction.java │ │ ├── StringDecoderJob.java │ │ ├── StringDecoderJobConfig.java │ │ ├── TimestampConvertFunction.java │ │ ├── TimestampConvertJob.java │ │ ├── TranslateFunction.java │ │ ├── TranslateJob.java │ │ ├── TranslateJobConfig.java │ │ ├── TypeConvertFunction.java │ │ ├── TypeConvertJob.java │ │ ├── TypeConvertJobConfig.java │ │ ├── TypeConvertJobParam.java │ │ ├── UAParseFunction.java │ │ ├── UAParseJob.java │ │ ├── UAParseJobConfig.java │ │ ├── UnPivotJob.java │ │ ├── UnPivotJobConfig.java │ │ ├── UnPivotJobFunction.java │ │ ├── UnionJob.java │ │ ├── WatermarkJob.java │ │ ├── WatermarkJobConfig.java │ │ ├── WatermarkPeriodicAssigner.java │ │ ├── WindowAggAccItem.java │ │ ├── WindowAggFunction.java │ │ ├── WindowAggJob.java │ │ ├── WindowAggJobConfig.java │ │ ├── WindowProcessFunction.java │ │ ├── WindowTriggerByCount.java │ │ ├── WindowTriggerByDelta.java │ │ ├── WindowTriggerByExp.java │ │ └── WindowTriggerDeltaFunction.java │ │ ├── sink │ │ ├── RedisSinkFunction.java │ │ ├── RedisSinkJob.java │ │ ├── RedisSinkJobConfig.java │ │ └── RedisSinkMapper.java │ │ └── source │ │ ├── JDBCSourceFunction.java │ │ ├── JDBCSourceJob.java │ │ ├── JDBCSourceJobConfig.java │ │ ├── JavascriptSimulateMapSourceFunction.java │ │ ├── JavascriptSimulateMapSourceJob.java │ │ ├── JavascriptSimulateMapSourceJobConfig.java │ │ ├── WebSocketMapSourceFunction.java │ │ ├── WebsocketSourceJob.java │ │ └── WebsocketSourceJobConfig.java │ └── resources │ ├── JOB-DOC │ ├── AddFieldsJob.md │ ├── AviatorProcessJob.md │ ├── DissectJob.md │ ├── EnrichByAsyncIOJob.md │ ├── EnrichByBroadcastJob.md │ ├── ExplodeJob.md │ ├── FilterFieldJob.md │ ├── FilterJob.md │ ├── GeoIPJob.md │ ├── GrokParseJob.md │ ├── GsubJob.md │ ├── JDBCSourceJob.md │ ├── JavascriptProcessJob.md │ ├── JavascriptSimulateMapSourceJob.md │ ├── JsonDecoderJob.md │ ├── JsonParseJob.md │ ├── JsonStringToMapJob.md │ ├── KeyValueParseJob.md │ ├── PartitionJob.md │ ├── RedisSinkJob.md │ ├── RemoveFieldsJob.md │ ├── RenameFieldsJob.md │ ├── StringDecoderJob.md │ ├── TimestampConvertJob.md │ ├── TranslateJob.md │ ├── TypeConvertJob.md │ ├── UAParseJob.md │ ├── UnPivotJob.md │ ├── UnionJob.md │ ├── WatermarkJob.md │ ├── WebsocketSourceJob.md │ └── WindowAggJob.md │ ├── JOB-ICON │ ├── AddFieldsJob.svg │ ├── AviatorProcessJob.svg │ ├── DissectJob.svg │ ├── EnrichByAsyncIOJob.svg │ ├── EnrichByBroadcastJob.svg │ ├── ExplodeJob.svg │ ├── FilterFieldJob.svg │ ├── FilterJob.svg │ ├── GeoIPJob.svg │ ├── GrokParseJob.svg │ ├── GsubJob.svg │ ├── JDBCSourceJob.svg │ ├── JavascriptProcessJob.svg │ ├── JsonDecoderJob.svg │ ├── JsonParseJob.svg │ ├── JsonStringToMapJob.svg │ ├── KeyValueParseJob.svg │ ├── PartitionJob.svg │ ├── RedisSinkJob.svg │ ├── RemoveFieldsJob.svg │ ├── RenameFieldsJob.svg │ ├── StringDecoderJob.svg │ ├── TimestampConvertJob.svg │ ├── TranslateJob.svg │ ├── TypeConvertJob.svg │ ├── UAParseJob.svg │ ├── UnPivotJob.svg │ ├── UnionJob.svg │ ├── WatermarkJob.svg │ ├── WebsocketSourceJob.svg │ └── WindowAggJob.svg │ ├── META-INF │ └── services │ │ └── com.eoi.jax.api.Builder │ └── supportVersion ├── jax-manager ├── pom.xml └── src │ └── main │ └── java │ └── com │ └── eoi │ └── jax │ └── manager │ ├── JaxManager.java │ ├── api │ ├── JobGetParam.java │ ├── JobGetResult.java │ ├── JobListParam.java │ ├── JobListResult.java │ ├── JobParam.java │ ├── JobResult.java │ ├── JobStartParam.java │ ├── JobStartResult.java │ ├── JobStopParam.java │ ├── JobStopResult.java │ ├── UUID.java │ ├── VersionParam.java │ └── VersionResult.java │ ├── exception │ ├── InvalidParamException.java │ ├── JaxManagerException.java │ └── ProcessErrorException.java │ ├── flink │ ├── BaseFlinkJob.java │ ├── BaseFlinkJobParam.java │ ├── BaseFlinkJobResult.java │ ├── FlinkCmdStartParam.java │ ├── FlinkJobGetParam.java │ ├── FlinkJobGetResult.java │ ├── FlinkJobListParam.java │ ├── FlinkJobListResult.java │ ├── FlinkJobStartParam.java │ ├── FlinkJobStartResult.java │ ├── FlinkJobState.java │ ├── FlinkJobStopParam.java │ ├── FlinkJobStopResult.java │ ├── FlinkManager.java │ ├── FlinkVersionParam.java │ └── FlinkVersiontResult.java │ ├── process │ ├── IProcessRunner.java │ ├── LineHandler.java │ ├── ProcessOutput.java │ └── ProcessRunner.java │ ├── spark │ ├── BaseSparkJob.java │ ├── BaseSparkJobParam.java │ ├── BaseSparkJobResult.java │ ├── SparkJobStartParam.java │ ├── SparkJobStartResult.java │ ├── SparkJobStopParam.java │ ├── SparkJobStopResult.java │ └── SparkManager.java │ ├── util │ ├── LineOutputStream.java │ └── StreamLineReader.java │ └── yarn │ ├── BaseYarnJob.java │ ├── JaxYarnClient.java │ ├── JaxYarnParam.java │ ├── YarnAppReport.java │ ├── YarnJobGetParam.java │ ├── YarnJobGetResult.java │ ├── YarnJobListParam.java │ ├── YarnJobListResult.java │ ├── YarnJobStopParam.java │ ├── YarnJobStopResult.java │ └── YarnManager.java ├── jax-tool ├── pom.xml ├── release │ ├── jax-tool.sh │ └── release-assembly.xml └── src │ └── main │ └── java │ └── com │ └── eoi │ └── jax │ └── tool │ ├── CliArgTool.java │ ├── IJaxScanner.java │ ├── JavaJarScanner.java │ ├── JaxDAGValidator.java │ ├── JaxJobScanner.java │ ├── JaxTool.java │ ├── JobMeta.java │ ├── PipelineDAG.java │ ├── PythonZipScanner.java │ ├── ScanResult.java │ └── ValidateResult.java ├── jax-ui ├── .browserslistrc ├── .eslintignore ├── .eslintrc.json ├── .gitignore ├── .gitlab-ci.yml ├── Makefile ├── README.md ├── babel.config.js ├── package.json ├── postcss.config.js ├── public │ ├── favicon.ico │ └── index.html ├── src │ ├── apis │ │ ├── cluster-api.ts │ │ ├── diagnosis.ts │ │ ├── index.ts │ │ ├── jar.ts │ │ ├── job-share.ts │ │ ├── job.ts │ │ ├── opts-api.ts │ │ └── pipeline.ts │ ├── app │ │ ├── element-variables.scss │ │ ├── filters.ts │ │ ├── global.scss │ │ ├── index.ts │ │ ├── runs.ts │ │ └── variables.scss │ ├── assets │ │ ├── fonts │ │ │ ├── PFDinMono │ │ │ │ ├── PFDinMono-Bold.eot │ │ │ │ ├── PFDinMono-Bold.ttf │ │ │ │ ├── PFDinMono-Bold.woff │ │ │ │ ├── PFDinMono-Bold.woff2 │ │ │ │ ├── PFDinMono-BoldItalic.eot │ │ │ │ ├── PFDinMono-BoldItalic.ttf │ │ │ │ ├── PFDinMono-BoldItalic.woff │ │ │ │ ├── PFDinMono-BoldItalic.woff2 │ │ │ │ ├── PFDinMono-Italic.eot │ │ │ │ ├── PFDinMono-Italic.ttf │ │ │ │ ├── PFDinMono-Italic.woff │ │ │ │ ├── PFDinMono-Italic.woff2 │ │ │ │ ├── PFDinMono-Light.eot │ │ │ │ ├── PFDinMono-Light.ttf │ │ │ │ ├── PFDinMono-Light.woff │ │ │ │ ├── PFDinMono-Light.woff2 │ │ │ │ ├── PFDinMono-LightItalic.eot │ │ │ │ ├── PFDinMono-LightItalic.ttf │ │ │ │ ├── PFDinMono-LightItalic.woff │ │ │ │ ├── PFDinMono-LightItalic.woff2 │ │ │ │ ├── PFDinMono-Medium.eot │ │ │ │ ├── PFDinMono-Medium.ttf │ │ │ │ ├── PFDinMono-Medium.woff │ │ │ │ ├── PFDinMono-Medium.woff2 │ │ │ │ ├── PFDinMono-MediumItalic.eot │ │ │ │ ├── PFDinMono-MediumItalic.ttf │ │ │ │ ├── PFDinMono-MediumItalic.woff │ │ │ │ ├── PFDinMono-MediumItalic.woff2 │ │ │ │ ├── PFDinMono-Regular.eot │ │ │ │ ├── PFDinMono-Regular.ttf │ │ │ │ ├── PFDinMono-Regular.woff │ │ │ │ ├── PFDinMono-Regular.woff2 │ │ │ │ ├── PFDinMono-Thin.eot │ │ │ │ ├── PFDinMono-Thin.ttf │ │ │ │ ├── PFDinMono-Thin.woff │ │ │ │ ├── PFDinMono-Thin.woff2 │ │ │ │ ├── PFDinMono-ThinItalic.eot │ │ │ │ ├── PFDinMono-ThinItalic.ttf │ │ │ │ ├── PFDinMono-ThinItalic.woff │ │ │ │ ├── PFDinMono-ThinItalic.woff2 │ │ │ │ ├── PFDinMono-XThin.eot │ │ │ │ ├── PFDinMono-XThin.ttf │ │ │ │ ├── PFDinMono-XThin.woff │ │ │ │ ├── PFDinMono-XThin.woff2 │ │ │ │ ├── PFDinMono-XThinItalic.eot │ │ │ │ ├── PFDinMono-XThinItalic.ttf │ │ │ │ ├── PFDinMono-XThinItalic.woff │ │ │ │ ├── PFDinMono-XThinItalic.woff2 │ │ │ │ └── stylesheet.css │ │ │ └── icomoon │ │ │ │ ├── fonts │ │ │ │ ├── icomoon.eot │ │ │ │ ├── icomoon.svg │ │ │ │ ├── icomoon.ttf │ │ │ │ └── icomoon.woff │ │ │ │ ├── style.scss │ │ │ │ └── variables.scss │ │ └── images │ │ │ ├── autoZoom.svg │ │ │ ├── chart-active.svg │ │ │ ├── chart.svg │ │ │ ├── debug-active.svg │ │ │ ├── debug.svg │ │ │ ├── icon-mini-running-color.png │ │ │ ├── icon-mini-running.svg │ │ │ ├── icon-small-app.svg │ │ │ ├── icon-small-group-yellow.svg │ │ │ ├── icon-small-group.svg │ │ │ ├── json-active.svg │ │ │ ├── json.svg │ │ │ ├── layout.svg │ │ │ ├── logo-w.svg │ │ │ ├── mark.svg │ │ │ ├── no-data.svg │ │ │ ├── process.svg │ │ │ ├── realZoom.svg │ │ │ ├── recover.svg │ │ │ ├── repeal.svg │ │ │ ├── sink.svg │ │ │ ├── source.svg │ │ │ ├── straw-active.svg │ │ │ ├── straw.svg │ │ │ ├── table-active.svg │ │ │ └── table.svg │ ├── common │ │ ├── README.md │ │ ├── VueComponentBase.ts │ │ ├── app │ │ │ ├── detectFeatures.ts │ │ │ ├── element-variables.scss │ │ │ ├── filters.ts │ │ │ ├── global.scss │ │ │ ├── hackElementUI.ts │ │ │ ├── polyfill.js │ │ │ ├── run.ts │ │ │ └── validateMessges.ts │ │ ├── components │ │ │ ├── child-view-holder.tsx │ │ │ ├── index.ts │ │ │ ├── number-animation.tsx │ │ │ ├── r-tabset │ │ │ │ ├── index.ts │ │ │ │ ├── r-tabset.scss │ │ │ │ ├── r-tabset.ts │ │ │ │ └── r-tabset.vue │ │ │ ├── sharp-modal-drawer │ │ │ │ ├── README.md │ │ │ │ ├── index.ts │ │ │ │ ├── modal-drawer-mixin.ts │ │ │ │ ├── sharp-drawer.ts │ │ │ │ ├── sharp-drawer.vue │ │ │ │ ├── sharp-modal.ts │ │ │ │ └── sharp-modal.vue │ │ │ ├── sharp-pagination.tsx │ │ │ ├── sharp-selector-next │ │ │ │ ├── components │ │ │ │ │ ├── cascader │ │ │ │ │ │ ├── cascader.ts │ │ │ │ │ │ ├── cascader.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── date-range │ │ │ │ │ │ ├── date-range.ts │ │ │ │ │ │ ├── date-range.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── date │ │ │ │ │ │ ├── date.ts │ │ │ │ │ │ ├── date.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── input-style.scss │ │ │ │ │ ├── input │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── input.ts │ │ │ │ │ │ └── input.vue │ │ │ │ │ └── select │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── select.ts │ │ │ │ │ │ └── select.vue │ │ │ │ ├── index.ts │ │ │ │ └── main │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── sharp-selector.scss │ │ │ │ │ ├── sharp-selector.ts │ │ │ │ │ └── sharp-selector.vue │ │ │ ├── sharp-selector │ │ │ │ ├── components │ │ │ │ │ ├── duration.vue │ │ │ │ │ ├── filter.vue │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── input.vue │ │ │ │ │ ├── multi.vue │ │ │ │ │ ├── range.vue │ │ │ │ │ └── single.vue │ │ │ │ ├── index.ts │ │ │ │ └── main │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── sharp-selector.scss │ │ │ │ │ ├── sharp-selector.ts │ │ │ │ │ └── sharp-selector.vue │ │ │ ├── sharp-tooltip.tsx │ │ │ ├── table-selection │ │ │ │ ├── index.ts │ │ │ │ ├── table-selection.ts │ │ │ │ └── table-selection.vue │ │ │ ├── tag-manager │ │ │ │ ├── index.ts │ │ │ │ ├── tag-manager.scss │ │ │ │ ├── tag-manager.ts │ │ │ │ └── tag-manager.vue │ │ │ ├── time-range │ │ │ │ ├── btn-bg.svg │ │ │ │ ├── index.ts │ │ │ │ ├── time-range.scss │ │ │ │ ├── time-range.ts │ │ │ │ └── time-range.vue │ │ │ ├── v-collapse-text │ │ │ │ ├── index.ts │ │ │ │ ├── v-collapse-text.ts │ │ │ │ └── v-collapse-text.vue │ │ │ ├── v-collapse │ │ │ │ ├── index.ts │ │ │ │ ├── v-collapse.ts │ │ │ │ └── v-collapse.vue │ │ │ ├── v-loading │ │ │ │ ├── README.md │ │ │ │ ├── index.ts │ │ │ │ ├── v-loading.scss │ │ │ │ ├── v-loading.ts │ │ │ │ └── v-loading.vue │ │ │ ├── vue-ace-editor.ts │ │ │ ├── vue-echarts │ │ │ │ ├── index.ts │ │ │ │ └── vue-echarts.ts │ │ │ └── vue-progressbar.tsx │ │ ├── configureWebpack.js │ │ ├── constants │ │ │ ├── PrimaryColor.ts │ │ │ ├── Project.ts │ │ │ └── index.ts │ │ ├── directives │ │ │ ├── index.ts │ │ │ ├── ref.ts │ │ │ └── tooltip.ts │ │ ├── git-repo-info.js │ │ ├── helpers │ │ │ ├── PaginationConfig.ts │ │ │ ├── callbackToAsync.ts │ │ │ ├── debounce.ts │ │ │ ├── delay.ts │ │ │ ├── downloadFile.ts │ │ │ ├── exportImage.ts │ │ │ ├── getElTextWidth.ts │ │ │ ├── hasOwn.ts │ │ │ ├── html2svg.ts │ │ │ ├── htmlEscape.ts │ │ │ ├── index.ts │ │ │ ├── jsonStableStringify.ts │ │ │ ├── minMax.ts │ │ │ ├── parseJsonSafe.ts │ │ │ ├── pushOrCreate.ts │ │ │ └── readFile.ts │ │ ├── models │ │ │ ├── drawer.ts │ │ │ ├── global.ts │ │ │ ├── index.ts │ │ │ ├── modal.ts │ │ │ ├── root.ts │ │ │ ├── sharp-selector-next.ts │ │ │ └── sharp-selector.ts │ │ ├── services │ │ │ ├── dialog.ts │ │ │ ├── index.ts │ │ │ ├── loading.ts │ │ │ ├── message.ts │ │ │ ├── modal.ts │ │ │ ├── progress.ts │ │ │ └── root.ts │ │ └── typings │ │ │ ├── shims-global.d.ts │ │ │ ├── shims-images.d.ts │ │ │ ├── shims-tsx.d.ts │ │ │ ├── shims-vue.d.ts │ │ │ └── shims-worker.d.ts │ ├── components │ │ ├── index.ts │ │ └── input-json │ │ │ ├── index.ts │ │ │ ├── input-json.ts │ │ │ └── input-json.vue │ ├── constants │ │ ├── ClusterType.ts │ │ ├── FinkDetectIdType.ts │ │ ├── FinkDiagnoseType.ts │ │ ├── FinkStatus.ts │ │ ├── FrameType.ts │ │ ├── InitJson.ts │ │ ├── InternalStatus.ts │ │ ├── JobRoleType.ts │ │ ├── MsgCode.ts │ │ ├── PipelineStatus.ts │ │ ├── PipelineType.ts │ │ ├── UserRole.ts │ │ ├── WorkStatus.ts │ │ ├── index.ts │ │ └── v1ApiPrefix.ts │ ├── directives │ │ └── index.ts │ ├── helpers │ │ ├── index.ts │ │ ├── parseObjectJsonString.ts │ │ ├── truncateText.ts │ │ └── websocket.ts │ ├── main.tsx │ ├── models │ │ ├── base.ts │ │ ├── cluster.ts │ │ ├── diagnosis.ts │ │ ├── global.ts │ │ ├── index.ts │ │ ├── jar.ts │ │ ├── job-dagre.ts │ │ ├── job-debug.ts │ │ ├── job.ts │ │ ├── opts.ts │ │ ├── pipeline.ts │ │ ├── root.ts │ │ └── socket.ts │ ├── services │ │ ├── index.ts │ │ └── router.ts │ └── views │ │ ├── home │ │ ├── index.ts │ │ ├── main │ │ │ ├── home.vue │ │ │ └── index.ts │ │ ├── menu-list │ │ │ ├── index.ts │ │ │ └── menu-list.vue │ │ └── v-header │ │ │ ├── index.ts │ │ │ ├── v-header.scss │ │ │ └── v-header.vue │ │ ├── index.ts │ │ ├── job-repo │ │ ├── index.ts │ │ ├── jars │ │ │ ├── detail │ │ │ │ ├── detail.ts │ │ │ │ ├── detail.vue │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ └── main │ │ │ │ ├── index.ts │ │ │ │ ├── jars.ts │ │ │ │ └── jars.vue │ │ ├── list │ │ │ ├── index.ts │ │ │ ├── list.ts │ │ │ ├── list.vue │ │ │ └── markdown-html │ │ │ │ ├── index.ts │ │ │ │ ├── markdown-file.scss │ │ │ │ ├── markdown-file.ts │ │ │ │ └── markdown-file.vue │ │ └── main │ │ │ ├── index.ts │ │ │ └── job-repo.vue │ │ ├── system-manage │ │ ├── cluster-manage │ │ │ ├── components │ │ │ │ ├── cluster-card │ │ │ │ │ ├── cluster-card.scss │ │ │ │ │ ├── cluster-card.tsx │ │ │ │ │ ├── cluster-card.vue │ │ │ │ │ └── index.ts │ │ │ │ ├── created-edit-modal │ │ │ │ │ ├── created-edit-modal.ts │ │ │ │ │ ├── created-edit-modal.vue │ │ │ │ │ └── index.ts │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ └── main │ │ │ │ ├── index.ts │ │ │ │ ├── main.ts │ │ │ │ └── main.vue │ │ ├── frame-config │ │ │ ├── created-edit │ │ │ │ ├── components │ │ │ │ │ ├── config │ │ │ │ │ │ ├── config.ts │ │ │ │ │ │ ├── config.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ └── index.ts │ │ │ │ ├── created-edit.ts │ │ │ │ ├── created-edit.vue │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ └── main │ │ │ │ ├── index.ts │ │ │ │ ├── main.tsx │ │ │ │ └── main.vue │ │ ├── index.ts │ │ └── main │ │ │ ├── index.ts │ │ │ └── main.vue │ │ └── work-manage │ │ ├── config │ │ ├── componemts │ │ │ ├── advanced-config-modal │ │ │ │ ├── advanced-config-modal.ts │ │ │ │ ├── advanced-config-modal.vue │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ ├── job-config-drawer │ │ │ │ ├── components │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── job-parameter │ │ │ │ │ │ ├── components │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ ├── input-string │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ ├── input-string.ts │ │ │ │ │ │ │ │ └── input-string.vue │ │ │ │ │ │ │ └── map-list │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ ├── map-list.ts │ │ │ │ │ │ │ │ └── map-list.vue │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── job-parameter.scss │ │ │ │ │ │ ├── job-parameter.ts │ │ │ │ │ │ └── job-parameter.vue │ │ │ │ │ └── save-job-share-modal │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── save-job-share-modal.ts │ │ │ │ │ │ └── save-job-share-modal.vue │ │ │ │ ├── index.ts │ │ │ │ ├── job-config-drawer.ts │ │ │ │ ├── job-config-drawer.vue │ │ │ │ └── utils.ts │ │ │ ├── job-dagre │ │ │ │ ├── config │ │ │ │ │ ├── g6-config.ts │ │ │ │ │ ├── g6-event.ts │ │ │ │ │ ├── g6-utils.ts │ │ │ │ │ ├── registerEdge.ts │ │ │ │ │ ├── registerNode.ts │ │ │ │ │ └── utils.ts │ │ │ │ ├── index.ts │ │ │ │ ├── job-dagre.ts │ │ │ │ └── job-dagre.vue │ │ │ ├── job-debug-drawer │ │ │ │ ├── components │ │ │ │ │ ├── data-show │ │ │ │ │ │ ├── components │ │ │ │ │ │ │ ├── data-show-type │ │ │ │ │ │ │ │ ├── data-show-type.ts │ │ │ │ │ │ │ │ ├── data-show-type.vue │ │ │ │ │ │ │ │ └── index.ts │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ └── table │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ ├── table.ts │ │ │ │ │ │ │ │ └── table.vue │ │ │ │ │ │ ├── data-show.ts │ │ │ │ │ │ ├── data-show.vue │ │ │ │ │ │ └── index.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── observe-debug │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── observe-debug.ts │ │ │ │ │ │ └── observe-debug.vue │ │ │ │ │ ├── running-log │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── running-log.ts │ │ │ │ │ │ └── running-log.vue │ │ │ │ │ └── simulate-inject │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── simulate-inject.ts │ │ │ │ │ │ └── simulate-inject.vue │ │ │ │ ├── constants.ts │ │ │ │ ├── index.ts │ │ │ │ ├── job-debug-drawer.scss │ │ │ │ ├── job-debug-drawer.ts │ │ │ │ ├── job-debug-drawer.vue │ │ │ │ └── utils.ts │ │ │ ├── job-list │ │ │ │ ├── index.ts │ │ │ │ ├── job-list.ts │ │ │ │ └── job-list.vue │ │ │ └── json-modal │ │ │ │ ├── index.ts │ │ │ │ ├── json-modal.ts │ │ │ │ └── json-modal.vue │ │ ├── index.ts │ │ ├── interface.ts │ │ └── main │ │ │ ├── index.ts │ │ │ ├── main.tsx │ │ │ ├── main.vue │ │ │ └── utils.ts │ │ ├── fink-diagnose │ │ ├── index.ts │ │ └── main │ │ │ ├── index.ts │ │ │ ├── main.scss │ │ │ ├── main.tsx │ │ │ └── main.vue │ │ ├── index.ts │ │ ├── list │ │ ├── components │ │ │ ├── import-error-modal │ │ │ │ ├── import-error-modal.ts │ │ │ │ ├── import-error-modal.vue │ │ │ │ └── index.ts │ │ │ └── index.ts │ │ ├── index.ts │ │ ├── main │ │ │ ├── index.ts │ │ │ ├── list.tsx │ │ │ └── list.vue │ │ ├── operation-log │ │ │ ├── index.ts │ │ │ ├── operation-log.ts │ │ │ └── operation-log.vue │ │ └── pipeline-status │ │ │ ├── index.ts │ │ │ ├── pipeline-status.scss │ │ │ ├── pipeline-status.ts │ │ │ └── pipeline-status.vue │ │ ├── log-detail │ │ ├── index.ts │ │ ├── log-detail.ts │ │ └── log-detail.vue │ │ └── main │ │ ├── index.ts │ │ └── main.vue ├── tsconfig.json ├── vue.config.js └── yarn.lock ├── jax-web ├── pom.xml ├── release │ ├── application.yml │ ├── debug │ │ ├── debug.sh │ │ ├── flink-debug-docker.properties │ │ ├── flink-debug.xml │ │ ├── spark-debug.sh │ │ └── spark-log4j.properties │ ├── logback-spring-docker.xml │ ├── logback-spring.xml │ ├── release-assembly.xml │ ├── start-docker.sh │ ├── start.sh │ └── stop.sh └── src │ └── main │ ├── java │ └── com │ │ └── eoi │ │ └── jax │ │ └── web │ │ ├── JaxApp.java │ │ ├── JaxLifecycle.java │ │ ├── JaxService.java │ │ ├── client │ │ ├── FlinkOverview.java │ │ ├── FlinkRestClient.java │ │ ├── SparkOverview.java │ │ ├── SparkRestClient.java │ │ ├── YarnClusterMetric.java │ │ ├── YarnOverview.java │ │ └── YarnRestClient.java │ │ ├── common │ │ ├── ContextHolder.java │ │ ├── ResponseCode.java │ │ ├── ResponseResult.java │ │ ├── Tuple.java │ │ ├── annotation │ │ │ ├── EnableExceptionHandler.java │ │ │ └── GlobalExceptionHandler.java │ │ ├── config │ │ │ ├── AppConfig.java │ │ │ ├── BuildInConfig.java │ │ │ ├── ConfigLoader.java │ │ │ ├── ConfigToMap.java │ │ │ ├── DebugConfig.java │ │ │ ├── JaxConfig.java │ │ │ ├── MybatisPlusConfig.java │ │ │ ├── RouterConfig.java │ │ │ ├── ScheduleConfig.java │ │ │ ├── ServerConfig.java │ │ │ ├── ThreadPoolConfig.java │ │ │ ├── ToolConfig.java │ │ │ ├── VersionConfig.java │ │ │ ├── WebSocketConfig.java │ │ │ └── WebsiteConfig.java │ │ ├── consts │ │ │ ├── ClusterMode.java │ │ │ ├── ClusterType.java │ │ │ ├── DataType.java │ │ │ ├── FlinkStatus.java │ │ │ ├── InputType.java │ │ │ ├── JarType.java │ │ │ ├── JobRole.java │ │ │ ├── OptsType.java │ │ │ ├── PipelineStatus.java │ │ │ ├── PipelineType.java │ │ │ ├── SparkStatus.java │ │ │ └── YarnState.java │ │ ├── exception │ │ │ ├── BizException.java │ │ │ └── JaxException.java │ │ └── util │ │ │ ├── Common.java │ │ │ ├── HadoopUtil.java │ │ │ ├── JsonUtil.java │ │ │ ├── UClassloader.java │ │ │ └── ZipUtil.java │ │ ├── controller │ │ ├── BaseController.java │ │ ├── ClusterController.java │ │ ├── DiagosisController.java │ │ ├── JarController.java │ │ ├── JobController.java │ │ ├── JobShareController.java │ │ ├── ListenerController.java │ │ ├── OptsController.java │ │ ├── PipelineController.java │ │ ├── SystemController.java │ │ └── V1Controller.java │ │ ├── dao │ │ ├── entity │ │ │ ├── TbCluster.java │ │ │ ├── TbJar.java │ │ │ ├── TbJob.java │ │ │ ├── TbJobShare.java │ │ │ ├── TbOptsFlink.java │ │ │ ├── TbOptsSpark.java │ │ │ ├── TbPipeline.java │ │ │ ├── TbPipelineConsole.java │ │ │ ├── TbPipelineJob.java │ │ │ ├── TbPipelineLog.java │ │ │ ├── TbSparkEvent.java │ │ │ └── TbUser.java │ │ ├── mapper │ │ │ ├── TbClusterMapper.java │ │ │ ├── TbJarMapper.java │ │ │ ├── TbJobMapper.java │ │ │ ├── TbJobShareMapper.java │ │ │ ├── TbOptsFlinkMapper.java │ │ │ ├── TbOptsSparkMapper.java │ │ │ ├── TbPipelineConsoleMapper.java │ │ │ ├── TbPipelineJobMapper.java │ │ │ ├── TbPipelineLogMapper.java │ │ │ ├── TbPipelineMapper.java │ │ │ ├── TbSparkEventMapper.java │ │ │ └── TbUserMapper.java │ │ └── service │ │ │ ├── TbClusterService.java │ │ │ ├── TbJarService.java │ │ │ ├── TbJobService.java │ │ │ ├── TbJobShareService.java │ │ │ ├── TbOptsFlinkService.java │ │ │ ├── TbOptsSparkService.java │ │ │ ├── TbPipelineConsoleService.java │ │ │ ├── TbPipelineJobService.java │ │ │ ├── TbPipelineLogService.java │ │ │ ├── TbPipelineService.java │ │ │ ├── TbSparkEventService.java │ │ │ ├── TbUserService.java │ │ │ └── impl │ │ │ ├── TbClusterServiceImpl.java │ │ │ ├── TbJarServiceImpl.java │ │ │ ├── TbJobServiceImpl.java │ │ │ ├── TbJobShareServiceImpl.java │ │ │ ├── TbOptsFlinkServiceImpl.java │ │ │ ├── TbOptsSparkServiceImpl.java │ │ │ ├── TbPipelineConsoleServiceImpl.java │ │ │ ├── TbPipelineJobServiceImpl.java │ │ │ ├── TbPipelineLogServiceImpl.java │ │ │ ├── TbPipelineServiceImpl.java │ │ │ ├── TbSparkEventServiceImpl.java │ │ │ └── TbUserServiceImpl.java │ │ ├── debug │ │ ├── DebugManager.java │ │ ├── DebugMessage.java │ │ ├── DebugSession.java │ │ ├── DebugSessionManager.java │ │ ├── MsgCode.java │ │ ├── PipelineProcess.java │ │ ├── PipelineProcessManager.java │ │ ├── PongSessionType.java │ │ ├── SessionExtend.java │ │ ├── WebsocketPingEndpoint.java │ │ └── WebsocketPongEndpoint.java │ │ ├── model │ │ ├── BaseFilter.java │ │ ├── BaseModel.java │ │ ├── BaseQuery.java │ │ ├── BaseSort.java │ │ ├── Paged.java │ │ ├── cluster │ │ │ ├── ClusterEntity.java │ │ │ ├── ClusterReq.java │ │ │ └── ClusterResp.java │ │ ├── diagnosis │ │ │ ├── DiagnosisReq.java │ │ │ ├── DiagnosisResp.java │ │ │ ├── DiagnosisResult.java │ │ │ ├── SourceResp.java │ │ │ └── SourceStat.java │ │ ├── jar │ │ │ ├── JarFilterReq.java │ │ │ ├── JarQueryReq.java │ │ │ ├── JarReq.java │ │ │ ├── JarResp.java │ │ │ └── JarSortReq.java │ │ ├── job │ │ │ ├── JobFilterReq.java │ │ │ ├── JobQueryReq.java │ │ │ ├── JobResp.java │ │ │ ├── JobShareReq.java │ │ │ ├── JobShareResp.java │ │ │ └── JobSortReq.java │ │ ├── listener │ │ │ └── SparkStateReq.java │ │ ├── manager │ │ │ ├── FileUrl.java │ │ │ ├── FlinkPipelineDefine.java │ │ │ ├── JobJar.java │ │ │ ├── OpType.java │ │ │ ├── OpUUID.java │ │ │ ├── Pipeline.java │ │ │ ├── PipelineDefine.java │ │ │ ├── PipelineEdgeDefine.java │ │ │ ├── PipelineJar.java │ │ │ ├── PipelineJobDefine.java │ │ │ └── SparkPipelineDefine.java │ │ ├── opts │ │ │ ├── MigrationResp.java │ │ │ ├── OptsDescribe.java │ │ │ ├── OptsFlinkReq.java │ │ │ ├── OptsFlinkResp.java │ │ │ ├── OptsReq.java │ │ │ ├── OptsResp.java │ │ │ ├── OptsSparkReq.java │ │ │ ├── OptsSparkResp.java │ │ │ ├── OptsValue.java │ │ │ └── OptsValueType.java │ │ └── pipeline │ │ │ ├── JobDebugOpts.java │ │ │ ├── PipelineBuildIn.java │ │ │ ├── PipelineConfig.java │ │ │ ├── PipelineConfigOpts.java │ │ │ ├── PipelineEdge.java │ │ │ ├── PipelineExportFormReq.java │ │ │ ├── PipelineExportReq.java │ │ │ ├── PipelineFilterReq.java │ │ │ ├── PipelineJob.java │ │ │ ├── PipelineQueryReq.java │ │ │ ├── PipelineReq.java │ │ │ ├── PipelineResp.java │ │ │ └── PipelineSortReq.java │ │ ├── provider │ │ ├── FlinkPipelineManager.java │ │ ├── JarFileProvider.java │ │ ├── JaxScanner.java │ │ ├── JaxValidator.java │ │ ├── ProcessRunnerProvider.java │ │ ├── ResourceManagerProvider.java │ │ ├── SparkPipelineManager.java │ │ ├── cluster │ │ │ ├── Cluster.java │ │ │ ├── ClusterFlinkOpts.java │ │ │ ├── ClusterProvider.java │ │ │ ├── ClusterSparkOpts.java │ │ │ └── ClusterVariable.java │ │ ├── jar │ │ │ ├── ClassPath.java │ │ │ ├── HdfsFileSystem.java │ │ │ ├── JarCache.java │ │ │ ├── JarFileCache.java │ │ │ ├── JarFileProviderImpl.java │ │ │ ├── JobJarClassPath.java │ │ │ └── LocalFileSystem.java │ │ ├── manager │ │ │ ├── AbstractConsoleLogLineQueue.java │ │ │ ├── BasePipelineManager.java │ │ │ ├── ConsoleLogLineQueue.java │ │ │ ├── FlinkPipelineManagerImpl.java │ │ │ ├── JarUrlProvider.java │ │ │ ├── JaxManagerProvider.java │ │ │ ├── ProcessRunnerProviderImpl.java │ │ │ └── SparkPipelineManagerImpl.java │ │ ├── resource │ │ │ ├── ClusterResourcePool.java │ │ │ └── ResourceManagerProviderImpl.java │ │ ├── scanner │ │ │ ├── JaxScannerImpl.java │ │ │ ├── JobMeta.java │ │ │ └── ScanResult.java │ │ └── validator │ │ │ ├── InvalidPipeline.java │ │ │ ├── JaxValidatorImpl.java │ │ │ ├── PipelineDAG.java │ │ │ └── ValidateResult.java │ │ ├── schedule │ │ ├── JaxScheduler.java │ │ ├── async │ │ │ ├── BasePipelineAsync.java │ │ │ ├── FlinkPipelineAsync.java │ │ │ ├── SparkPipelineAsync.java │ │ │ └── StatusPipelineAsync.java │ │ ├── service │ │ │ ├── BasePipelineService.java │ │ │ ├── FlinkPipelineService.java │ │ │ └── SparkPipelineService.java │ │ └── task │ │ │ ├── FlinkTask.java │ │ │ ├── SparkTask.java │ │ │ └── StatusTask.java │ │ └── service │ │ ├── ClusterService.java │ │ ├── JarService.java │ │ ├── JobService.java │ │ ├── JobShareService.java │ │ ├── ListenerService.java │ │ ├── OptsService.java │ │ ├── PipelineService.java │ │ └── diagnosis │ │ ├── CheckpointDiagnosis.java │ │ ├── ClusterDiagnosis.java │ │ ├── DiagnosisService.java │ │ ├── ExceptionDiagnosis.java │ │ ├── FlinkDiagnosisBase.java │ │ ├── FlinkDiagnosisFactory.java │ │ ├── IFlinkDiagnosis.java │ │ ├── LogDiagnosis.java │ │ ├── TaskDiagnosis.java │ │ └── TaskmanagerDiagnosis.java │ └── resources │ ├── application.yml │ ├── banner.txt │ ├── db │ └── migration │ │ └── mysql │ │ └── V1.0.0__Baseline.sql │ └── logback-spring.xml ├── mvnw ├── mvnw.cmd └── pom.xml /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: ci 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | 9 | env: 10 | # An envar that signals to tests we are executing in the CI environment 11 | CONTINUOUS_INTEGRATION: true 12 | 13 | jobs: 14 | maven-checks: 15 | runs-on: ubuntu-latest 16 | strategy: 17 | fail-fast: false 18 | timeout-minutes: 45 19 | steps: 20 | - uses: actions/checkout@v2 21 | - uses: actions/setup-java@v2 22 | with: 23 | distribution: 'zulu' 24 | java-version: 8 25 | - name: Maven Checks Flink1.9 26 | run: | 27 | ./mvnw validate 28 | - name: Maven Checks Flink1.12 29 | run: | 30 | ./mvnw -P flink12 validate 31 | - name: Maven Tests Flink1.9 32 | run: | 33 | ./mvnw clean test 34 | - name: Maven Tests Flink1.12 35 | run: | 36 | ./mvnw -P flink12 clean test -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # idea 2 | .idea 3 | *.iml 4 | 5 | # building 6 | target 7 | build 8 | tmp* 9 | dist 10 | test-output 11 | build.log 12 | jax/* 13 | 14 | # other scm 15 | .svn 16 | .CVS 17 | .hg* 18 | 19 | # project 20 | logs/ 21 | 22 | # mac 23 | .DS_Store 24 | dependency-reduced-pom.xml 25 | 26 | jax_python/__pycache__ 27 | node_modules 28 | 29 | *.pyc 30 | .gradle 31 | -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://maven.aliyun.com/repository/public/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip 2 | wrapperUrl=https://maven.aliyun.com/repository/public/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar 3 | -------------------------------------------------------------------------------- /DEVELOPMENT.md: -------------------------------------------------------------------------------- 1 | It is recommended to use IntelliJ IDEA as a development tool and install the [CheckStyle-IDEA](https://plugins.jetbrains.com/plugin/1065-checkstyle-idea). 2 | 3 | After installing the plug-in: 4 | 5 | 1. Open `Preferences` -> `Tools` -> `Checkstyle`, add a new item in the `Configuration File` list, and choose dev/google_checks.xml as the local Checkstyle file. 6 | 7 | 2. Open `Editor` -> `CodeStyle`, `Import schema` -> `CheckStyle Configuration`, choose dev/google_checks.xml to import. 8 | 9 | Run the following command to check code style: 10 | 11 | ```sh 12 | ./mvnw validate 13 | ``` -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM openjdk:8-alpine 2 | 3 | RUN echo "https://mirrors.aliyun.com/alpine/v3.8/main/" > /etc/apk/repositories 4 | 5 | RUN apk update \ 6 | && apk upgrade \ 7 | && apk add --no-cache bash \ 8 | && rm -rf /var/cache/apk/* 9 | 10 | COPY tmp/jax /app 11 | 12 | EXPOSE 9999 13 | 14 | VOLUME /app/jax/jar_dir 15 | 16 | CMD ["/app/start-docker.sh"] -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Package 2 | 3 | ```sh 4 | $ make package-all 5 | ``` 6 | 7 | # Docker 8 | 9 | requirements 10 | 11 | ``` 12 | node/npm/yarn 13 | wget 14 | docker/docker compose 15 | ``` 16 | 17 | With flink 1.9 standalone cluster: 18 | 19 | ```sh 20 | $ make image 21 | $ docker-compose up 22 | ``` 23 | 24 | With flink 1.12 standalone cluster: 25 | 26 | ```sh 27 | $ make image 28 | $ FLINK_IMAGE=flink:1.12.3-scala_2.11 docker-compose up 29 | ``` 30 | -------------------------------------------------------------------------------- /dev/APACHE-2.txt: -------------------------------------------------------------------------------- 1 | Licensed under the Apache License, Version 2.0 (the "License"); 2 | you may not use this file except in compliance with the License. 3 | You may obtain a copy of the License at 4 | 5 | http://www.apache.org/licenses/LICENSE-2.0 6 | 7 | Unless required by applicable law or agreed to in writing, software 8 | distributed under the License is distributed on an "AS IS" BASIS, 9 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 10 | See the License for the specific language governing permissions and 11 | limitations under the License. -------------------------------------------------------------------------------- /jax-api-flink-1_12/src/main/java/com/eoi/jax/api/FlinkSqlJobBuilder.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.api; 16 | 17 | public interface FlinkSqlJobBuilder extends StreamingSqlBuilder { 18 | 19 | void build(FlinkEnvironment context, C config, JobMetaConfig metaConfig) throws Throwable; 20 | } 21 | -------------------------------------------------------------------------------- /jax-api-flink-1_9/src/main/java/com/eoi/jax/api/FlinkSqlJobBuilder.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.api; 16 | 17 | public interface FlinkSqlJobBuilder extends StreamingSqlBuilder { 18 | 19 | void build(FlinkEnvironment context, C config, JobMetaConfig metaConfig) throws Throwable; 20 | } 21 | -------------------------------------------------------------------------------- /jax-api/src/main/java/com/eoi/jax/api/BatchProcessBuilder.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.api; 16 | 17 | public interface BatchProcessBuilder extends Builder { 18 | } 19 | -------------------------------------------------------------------------------- /jax-api/src/main/java/com/eoi/jax/api/BatchSinkBuilder.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.api; 16 | 17 | public interface BatchSinkBuilder extends Builder { 18 | } 19 | -------------------------------------------------------------------------------- /jax-api/src/main/java/com/eoi/jax/api/BatchSourceBuilder.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.api; 16 | 17 | public interface BatchSourceBuilder extends Builder { 18 | } 19 | -------------------------------------------------------------------------------- /jax-api/src/main/java/com/eoi/jax/api/BatchSqlBuilder.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.api; 16 | 17 | public interface BatchSqlBuilder extends Builder { 18 | } 19 | -------------------------------------------------------------------------------- /jax-api/src/main/java/com/eoi/jax/api/ConfigValidatable.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.api; 16 | 17 | public interface ConfigValidatable { 18 | void validate() throws JobConfigValidationException; 19 | } 20 | -------------------------------------------------------------------------------- /jax-api/src/main/java/com/eoi/jax/api/EmptyConfig.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.api; 16 | 17 | public class EmptyConfig implements ConfigValidatable { 18 | @Override 19 | public void validate() throws JobConfigValidationException { 20 | return; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /jax-api/src/main/java/com/eoi/jax/api/SparkProcessJobBuilder.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.api; 16 | 17 | public interface SparkProcessJobBuilder extends BatchProcessBuilder { 18 | OUT build(SparkEnvironment context, IN in, C config) throws Throwable; 19 | } 20 | -------------------------------------------------------------------------------- /jax-api/src/main/java/com/eoi/jax/api/SparkSinkJobBuilder.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.api; 16 | 17 | public interface SparkSinkJobBuilder extends BatchSinkBuilder { 18 | void build(SparkEnvironment context, IN in, C config) throws Throwable; 19 | } 20 | -------------------------------------------------------------------------------- /jax-api/src/main/java/com/eoi/jax/api/SparkSinkTableBuilder.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.api; 16 | 17 | import org.apache.spark.sql.Dataset; 18 | import org.apache.spark.sql.Row; 19 | 20 | public interface SparkSinkTableBuilder extends SparkSinkJobBuilder, C> { 21 | } 22 | -------------------------------------------------------------------------------- /jax-api/src/main/java/com/eoi/jax/api/StreamingDebugSinker.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.api; 16 | 17 | public interface StreamingDebugSinker extends Builder { 18 | } 19 | -------------------------------------------------------------------------------- /jax-api/src/main/java/com/eoi/jax/api/StreamingProcessBuilder.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.api; 16 | 17 | public interface StreamingProcessBuilder extends Builder { 18 | boolean compatibleWithLastConfig(C lastConfig, C currentConfig); 19 | } 20 | -------------------------------------------------------------------------------- /jax-api/src/main/java/com/eoi/jax/api/StreamingSinkBuilder.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.api; 16 | 17 | public interface StreamingSinkBuilder extends Builder { 18 | } 19 | -------------------------------------------------------------------------------- /jax-api/src/main/java/com/eoi/jax/api/StreamingSourceBuilder.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.api; 16 | 17 | public interface StreamingSourceBuilder extends Builder { 18 | } 19 | -------------------------------------------------------------------------------- /jax-api/src/main/java/com/eoi/jax/api/StreamingSqlBuilder.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.api; 16 | 17 | public interface StreamingSqlBuilder extends Builder { 18 | } 19 | -------------------------------------------------------------------------------- /jax-api/src/main/java/com/eoi/jax/api/annotation/InputType.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.api.annotation; 16 | 17 | public enum InputType { 18 | TEXT, PASSWORD, SQL, JSON, SPL, JAVASCRIPT, AVIATOR_SCRIPT, XML 19 | } 20 | -------------------------------------------------------------------------------- /jax-common/src/main/java/com/eoi/jax/common/converter/Converter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.common.converter; 16 | 17 | public interface Converter { 18 | 19 | Object convert(Object from); 20 | 21 | default Object convert(Object from, ConvertOption option) { 22 | return convert(from); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /jax-common/src/main/resources/grok.patterns/exim: -------------------------------------------------------------------------------- 1 | EXIM_MSGID [0-9A-Za-z]{6}-[0-9A-Za-z]{6}-[0-9A-Za-z]{2} 2 | EXIM_FLAGS (<=|[-=>*]>|[*]{2}|==) 3 | EXIM_DATE %{YEAR:exim_year}-%{MONTHNUM:exim_month}-%{MONTHDAY:exim_day} %{TIME:exim_time} 4 | EXIM_PID \[%{POSINT}\] 5 | EXIM_QT ((\d+y)?(\d+w)?(\d+d)?(\d+h)?(\d+m)?(\d+s)?) 6 | EXIM_EXCLUDE_TERMS (Message is frozen|(Start|End) queue run| Warning: | retry time not reached | no (IP address|host name) found for (IP address|host) | unexpected disconnection while reading SMTP command | no immediate delivery: |another process is handling this message) 7 | EXIM_REMOTE_HOST (H=(%{NOTSPACE:remote_hostname} )?(\(%{NOTSPACE:remote_heloname}\) )?\[%{IP:remote_host}\]) 8 | EXIM_INTERFACE (I=\[%{IP:exim_interface}\](:%{NUMBER:exim_interface_port})) 9 | EXIM_PROTOCOL (P=%{NOTSPACE:protocol}) 10 | EXIM_MSG_SIZE (S=%{NUMBER:exim_msg_size}) 11 | EXIM_HEADER_ID (id=%{NOTSPACE:exim_header_id}) 12 | EXIM_SUBJECT (T=%{QS:exim_subject}) 13 | 14 | -------------------------------------------------------------------------------- /jax-common/src/main/resources/grok.patterns/mcollective: -------------------------------------------------------------------------------- 1 | MCOLLECTIVEAUDIT %{TIMESTAMP_ISO8601:timestamp}: 2 | -------------------------------------------------------------------------------- /jax-common/src/main/resources/grok.patterns/mcollective-patterns: -------------------------------------------------------------------------------- 1 | # Remember, these can be multi-line events. 2 | MCOLLECTIVE ., \[%{TIMESTAMP_ISO8601:timestamp} #%{POSINT:pid}\]%{SPACE}%{LOGLEVEL:event_level} 3 | 4 | MCOLLECTIVEAUDIT %{TIMESTAMP_ISO8601:timestamp}: 5 | -------------------------------------------------------------------------------- /jax-common/src/main/resources/grok.patterns/mongodb: -------------------------------------------------------------------------------- 1 | MONGO_LOG %{SYSLOGTIMESTAMP:timestamp} \[%{WORD:component}\] %{GREEDYDATA:message} 2 | MONGO_QUERY \{ (?<={ ).*(?= } ntoreturn:) \} 3 | MONGO_SLOWQUERY %{WORD} %{MONGO_WORDDASH:database}\.%{MONGO_WORDDASH:collection} %{WORD}: %{MONGO_QUERY:query} %{WORD}:%{NONNEGINT:ntoreturn} %{WORD}:%{NONNEGINT:ntoskip} %{WORD}:%{NONNEGINT:nscanned}.*nreturned:%{NONNEGINT:nreturned}..+ (?[0-9]+)ms 4 | MONGO_WORDDASH \b[\w-]+\b 5 | MONGO3_SEVERITY \w 6 | MONGO3_COMPONENT %{WORD}|- 7 | MONGO3_LOG %{TIMESTAMP_ISO8601:timestamp} %{MONGO3_SEVERITY:severity} %{MONGO3_COMPONENT:component}%{SPACE}(?:\[%{DATA:context}\])? %{GREEDYDATA:message} 8 | -------------------------------------------------------------------------------- /jax-common/src/main/resources/grok.patterns/postgresql: -------------------------------------------------------------------------------- 1 | # Default postgresql pg_log format pattern 2 | POSTGRESQL %{DATESTAMP:timestamp} %{TZ} %{DATA:user_id} %{GREEDYDATA:connection_id} %{POSINT:pid} 3 | 4 | -------------------------------------------------------------------------------- /jax-common/src/main/resources/grok.patterns/rails: -------------------------------------------------------------------------------- 1 | RUUID \h{32} 2 | # rails controller with action 3 | RCONTROLLER (?[^#]+)#(?\w+) 4 | 5 | # this will often be the only line: 6 | RAILS3HEAD (?m)Started %{WORD:verb} "%{URIPATHPARAM:request}" for %{IPORHOST:clientip} at (?%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{HOUR}:%{MINUTE}:%{SECOND} %{ISO8601_TIMEZONE}) 7 | # for some a strange reason, params are stripped of {} - not sure that's a good idea. 8 | RPROCESSING \W*Processing by %{RCONTROLLER} as (?\S+)(?:\W*Parameters: {%{DATA:params}}\W*)? 9 | RAILS3FOOT Completed %{NUMBER:response}%{DATA} in %{NUMBER:totalms}ms %{RAILS3PROFILE}%{GREEDYDATA} 10 | RAILS3PROFILE (?:\(Views: %{NUMBER:viewms}ms \| ActiveRecord: %{NUMBER:activerecordms}ms|\(ActiveRecord: %{NUMBER:activerecordms}ms)? 11 | 12 | # putting it all together 13 | RAILS3 %{RAILS3HEAD}(?:%{RPROCESSING})?(?(?:%{DATA}\n)*)(?:%{RAILS3FOOT})? 14 | -------------------------------------------------------------------------------- /jax-common/src/main/resources/grok.patterns/redis: -------------------------------------------------------------------------------- 1 | REDISTIMESTAMP %{MONTHDAY} %{MONTH} %{TIME} 2 | REDISLOG \[%{POSINT:pid}\] %{REDISTIMESTAMP:timestamp} \* 3 | 4 | -------------------------------------------------------------------------------- /jax-common/src/main/resources/grok.patterns/ruby: -------------------------------------------------------------------------------- 1 | RUBY_LOGLEVEL (?:DEBUG|FATAL|ERROR|WARN|INFO) 2 | RUBY_LOGGER [DFEWI], \[%{TIMESTAMP_ISO8601:timestamp} #%{POSINT:pid}\] *%{RUBY_LOGLEVEL:loglevel} -- +%{DATA:progname}: %{GREEDYDATA:message} 3 | -------------------------------------------------------------------------------- /jax-common/src/main/resources/qqwry.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-common/src/main/resources/qqwry.dat -------------------------------------------------------------------------------- /jax-common/src/test/java/com/eoi/jax/common/test/reflect/CommonInterface.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.common.test.reflect; 16 | 17 | public interface CommonInterface { 18 | void foo(); 19 | } 20 | -------------------------------------------------------------------------------- /jax-common/src/test/java/com/eoi/jax/common/test/reflect/CommonInterface2.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.common.test.reflect; 16 | 17 | public interface CommonInterface2 { 18 | void foo2(); 19 | } 20 | -------------------------------------------------------------------------------- /jax-common/src/test/java/com/eoi/jax/common/test/reflect/CommonInterface3.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.common.test.reflect; 16 | 17 | public interface CommonInterface3 extends CommonInterface { 18 | void foo3(T in); 19 | } 20 | -------------------------------------------------------------------------------- /jax-common/src/test/java/com/eoi/jax/common/test/reflect/ParameterizedInterface.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.common.test.reflect; 16 | 17 | public interface ParameterizedInterface { 18 | void pfoo(); 19 | } 20 | -------------------------------------------------------------------------------- /jax-common/src/test/java/com/eoi/jax/common/test/reflect/TestSubClass1.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.common.test.reflect; 16 | 17 | public class TestSubClass1 implements CommonInterface, CommonInterface2 { 18 | 19 | @Override 20 | public void foo() { 21 | 22 | } 23 | 24 | @Override 25 | public void foo2() { 26 | 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /jax-common/src/test/java/com/eoi/jax/common/test/reflect/TestSubClass4.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.common.test.reflect; 16 | 17 | public class TestSubClass4 implements CommonInterface3 { 18 | 19 | @Override 20 | public void foo3(Integer in) { 21 | 22 | } 23 | 24 | @Override 25 | public void foo() { 26 | 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /jax-common/src/test/java/com/eoi/jax/common/test/reflect/nested/FourthClass2.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.common.test.reflect.nested; 16 | 17 | @ClassFlag 18 | public class FourthClass2 extends ThridClass { 19 | 20 | @Flag 21 | private String f1; 22 | @Flag 23 | private String f2; 24 | 25 | public String f3; 26 | } 27 | -------------------------------------------------------------------------------- /jax-common/src/test/java/com/eoi/jax/common/test/reflect/nested/FourthClass4.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.common.test.reflect.nested; 16 | 17 | public class FourthClass4 implements FourthInterface { 18 | } 19 | -------------------------------------------------------------------------------- /jax-common/src/test/java/com/eoi/jax/common/test/reflect/nested/FourthInterface.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.common.test.reflect.nested; 16 | 17 | public interface FourthInterface extends ThirdInterface { 18 | } 19 | -------------------------------------------------------------------------------- /jax-common/src/test/java/com/eoi/jax/common/test/reflect/nested/SecondInterface.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.common.test.reflect.nested; 16 | 17 | public interface SecondInterface extends TopInterface { 18 | } 19 | -------------------------------------------------------------------------------- /jax-common/src/test/java/com/eoi/jax/common/test/reflect/nested/T0.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.common.test.reflect.nested; 16 | 17 | public class T0 { 18 | 19 | } 20 | -------------------------------------------------------------------------------- /jax-common/src/test/java/com/eoi/jax/common/test/reflect/nested/T1.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.common.test.reflect.nested; 16 | 17 | public class T1 { 18 | 19 | } 20 | -------------------------------------------------------------------------------- /jax-common/src/test/java/com/eoi/jax/common/test/reflect/nested/T2.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.common.test.reflect.nested; 16 | 17 | public class T2 { 18 | 19 | } 20 | -------------------------------------------------------------------------------- /jax-common/src/test/java/com/eoi/jax/common/test/reflect/nested/ThirdInterface.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.common.test.reflect.nested; 16 | 17 | public interface ThirdInterface extends SecondInterface, T3> { 18 | } 19 | -------------------------------------------------------------------------------- /jax-common/src/test/java/com/eoi/jax/common/test/reflect/nested/ThridClass.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.common.test.reflect.nested; 16 | 17 | @ClassFlag 18 | public class ThridClass implements SecondInterface { 19 | } 20 | -------------------------------------------------------------------------------- /jax-common/src/test/java/com/eoi/jax/common/test/reflect/nested/TopInterface.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.common.test.reflect.nested; 16 | 17 | public interface TopInterface { 18 | } 19 | -------------------------------------------------------------------------------- /jax-core/src/main/java/com/eoi/jax/core/AbstractDAGNode.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.core; 16 | 17 | /** 18 | * DAGNode,用于AbstractDAGVisitor的Node必须至少实现这个类 19 | */ 20 | public abstract class AbstractDAGNode { 21 | /** 22 | * 返回唯一的节点号,用于唯一定位节点 23 | * @return 节点号 24 | */ 25 | public abstract String getId(); 26 | } 27 | -------------------------------------------------------------------------------- /jax-core/src/main/java/com/eoi/jax/core/GraphCircleDetectedException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.core; 16 | 17 | public class GraphCircleDetectedException extends Exception { 18 | 19 | } 20 | -------------------------------------------------------------------------------- /jax-core/src/main/java/com/eoi/jax/core/NoSourceNodeException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.core; 16 | 17 | import com.eoi.jax.api.JobConfigValidationException; 18 | 19 | public class NoSourceNodeException extends JobConfigValidationException { 20 | 21 | public NoSourceNodeException(String message) { 22 | super(message); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /jax-core/src/main/java/com/eoi/jax/core/UnsupportJobBuidlerException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.core; 16 | 17 | public class UnsupportJobBuidlerException extends JobBuildException { 18 | } 19 | -------------------------------------------------------------------------------- /jax-core/src/main/java/com/eoi/jax/core/spark/python/Logging.scala: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.core.spark.python 16 | 17 | import org.slf4j.{Logger, LoggerFactory} 18 | 19 | trait Logging { 20 | protected val LOG: Logger = LoggerFactory.getLogger(this.getClass) 21 | } 22 | -------------------------------------------------------------------------------- /jax-core/src/test/java/com/eoi/jax/core/test/PrintDebugSinkerConfig.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.core.test; 16 | 17 | public class PrintDebugSinkerConfig { 18 | } 19 | -------------------------------------------------------------------------------- /jax-core/src/test/java/com/eoi/jax/core/test/TestDAGChain.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.core.test; 16 | 17 | 18 | import java.util.List; 19 | 20 | public class TestDAGChain { 21 | public List parents; 22 | 23 | public String id; 24 | public String value; 25 | } 26 | -------------------------------------------------------------------------------- /jax-flink-entry-1_12/src/main/java/com/eoi/jax/flink_entry/FlinkParamException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.flink_entry; 16 | 17 | public class FlinkParamException extends Exception { 18 | 19 | public FlinkParamException(String msg) { 20 | super(msg); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /jax-flink-entry-1_9/src/main/java/com/eoi/jax/flink_entry/FlinkParamException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.flink_entry; 16 | 17 | public class FlinkParamException extends Exception { 18 | 19 | public FlinkParamException(String msg) { 20 | super(msg); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /jax-flink-job-1_12/src/main/resources/META-INF/services/com.eoi.jax.api.Builder: -------------------------------------------------------------------------------- 1 | com.eoi.jax.flink1_12.job.source.KafkaByteSourceJob 2 | com.eoi.jax.flink1_12.job.source.KafkaSourceJob 3 | com.eoi.jax.flink1_12.job.process.AvroDecoderJob 4 | com.eoi.jax.flink1_12.job.process.WatermarkJob 5 | com.eoi.jax.flink1_12.job.process.StreamToTableJob 6 | com.eoi.jax.flink1_12.job.process.SqlJob 7 | com.eoi.jax.flink1_12.job.process.TableToStreamJob 8 | com.eoi.jax.flink1_12.job.process.SqlExecuteJob 9 | com.eoi.jax.flink1_12.job.sink.KafkaSinkJob 10 | com.eoi.jax.flink1_12.job.sink.ElasticSearchSinkJob 11 | com.eoi.jax.flink1_12.job.sink.FileSinkJob 12 | com.eoi.jax.flink1_12.job.sink.JDBCSinkJob -------------------------------------------------------------------------------- /jax-flink-job-1_12/src/main/resources/supportVersion: -------------------------------------------------------------------------------- 1 | [["~> 1.12"]] -------------------------------------------------------------------------------- /jax-flink-job-1_9/src/main/resources/JOB-DOC/FileSinkJob.md: -------------------------------------------------------------------------------- 1 | # 数据输出到文件系统 2 | 3 | - 通过配置File sink的参数,把数据输出到接入指定文件系统; 4 | - 支持本地文件或hdfs; 5 | - 写入数据格式支持json或csv格式; 6 | 7 | ## 重要提示 8 | - checkpoint必须启用 9 | - 正在写入未归档的文件有.inprogress后缀,只有在checkpoint成功后是才会去掉此后缀,成功归档文件 10 | - 手动删除.inprogress文件会导致 File does not exist异常 11 | 12 | ## 配置参数如下 13 | 14 | - basePath: 文件输出的路径,如:hdfs://192.168.31.133:9000/tmp 15 | - fields:指定输出字段名列表 16 | - bucketFormatString:存储文件的周期,在每个周期里会生成一目录,例如:分钟(yyyyMMddHHmm), 小时(yyyyMMddHH), 天(yyyyMMdd), 此处时间为服务器当前时间,并非事件时间 17 | - dataFormat:数据存储格式(json 或 csv) 18 | - maxPartSize:[rolling policy]文件最大size 19 | - rolloverInterval:[rolling policy]文件滚动最大时间 20 | - inactivityInterval:[rolling policy]文件闲置最大时间 21 | 22 | 例如: 23 | ``` 24 | { 25 | "inactivityInterval" : "1000", 26 | "basePath" : "hdfs://eoiNameService/tmp", 27 | "rolloverInterval" : "1000", 28 | "maxPartSize" : "1", 29 | "fields" : [ "time", "id", "value", "ts" ] 30 | } 31 | ``` 32 | -------------------------------------------------------------------------------- /jax-flink-job-1_9/src/main/resources/JOB-DOC/JDBCSinkJob.md: -------------------------------------------------------------------------------- 1 | # 数据输出到JDBC数据库 2 | 3 | 把数据通过jdbc批量写入到表中,需要通过columns参数来定义表的字段; 4 | 5 | ## 样例 6 | 7 | 主要参数如下: 8 | 9 | ``` 10 | { 11 | "password": "test", 12 | "dataSourceUrl": "jdbc:mysql://localhost:55037/test", 13 | "userName": "test", 14 | "columns": [ 15 | { 16 | "columnType": "string", 17 | "columnName": "job_name" 18 | }, 19 | { 20 | "columnType": "long", 21 | "columnName": "create_time" 22 | } 23 | ], 24 | "table": "tb_job" 25 | } 26 | ``` 27 | 28 | 注意: 29 | - 需要把dataSourceUrl里用到的jdbc driver的jar包放在flink/lib,以确保运行时可以找到; 30 | - 目前支持的jdbc方言有:ClickHouse,Vertica,Derby,MySQL,Postgres 31 | -------------------------------------------------------------------------------- /jax-flink-job-1_9/src/main/resources/META-INF/services/com.eoi.jax.api.Builder: -------------------------------------------------------------------------------- 1 | com.eoi.jax.flink.job.source.KafkaByteSourceJob 2 | com.eoi.jax.flink.job.process.AvroDecoderJob 3 | com.eoi.jax.flink.job.process.SqlJob 4 | com.eoi.jax.flink.job.process.StreamToTableJob 5 | com.eoi.jax.flink.job.process.TableToStreamJob 6 | com.eoi.jax.flink.job.sink.ElasticSearchSinkJob 7 | com.eoi.jax.flink.job.sink.FileSinkJob 8 | com.eoi.jax.flink.job.sink.JDBCSinkJob 9 | com.eoi.jax.flink.job.sink.KafkaSinkJob -------------------------------------------------------------------------------- /jax-flink-job-1_9/src/main/resources/supportVersion: -------------------------------------------------------------------------------- 1 | [["~> 1.9"]] -------------------------------------------------------------------------------- /jax-flink-job-common/src/main/java/com/eoi/jax/flink/job/common/DecoderException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.flink.job.common; 16 | 17 | public class DecoderException extends Exception { 18 | public DecoderException(String err) { 19 | super(err); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /jax-flink-job-common/src/main/java/com/eoi/jax/flink/job/common/FlinkKafkaPartitionType.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.flink.job.common; 16 | 17 | public enum FlinkKafkaPartitionType { 18 | FIXED, 19 | ROUND_ROBIN, 20 | BY_KEY 21 | } 22 | -------------------------------------------------------------------------------- /jax-flink-job/src/main/java/com/eoi/jax/flink/job/process/JsonStringToMapJobConfig.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.flink.job.process; 16 | 17 | import java.io.Serializable; 18 | 19 | public class JsonStringToMapJobConfig implements Serializable { 20 | // Just Empty Config 21 | } 22 | -------------------------------------------------------------------------------- /jax-flink-job/src/main/resources/JOB-DOC/GeoIPJob.md: -------------------------------------------------------------------------------- 1 | # IP地址反查地理信息 2 | 3 | 通过IPv4地址查询地理信息,可输出国家、省、市、乡镇、运营商 4 | 5 | 6 | 例如: 7 | 8 | 参数如下: 9 | 10 | - ipField: 指定ip字段名 11 | - outputPrefix:指定输出地理信息字段名的前缀,以避免覆盖原始日志字段 12 | 13 | ``` 14 | { 15 | "ipField" : "ip", 16 | "outputPrefix" : "eoi_" 17 | } 18 | ``` 19 | 20 | 输入如下: 21 | 22 | ``` 23 | { 24 | "ip" : "169.235.24.133" 25 | } 26 | { 27 | "ip" : "220.248.44.62" 28 | } 29 | { 30 | "ip" : "180.167.157.90" 31 | } 32 | { 33 | "ip" : "278.248.44.62" 34 | } 35 | ``` 36 | 37 | 输出的数据如下: 38 | 39 | ``` 40 | {"eoi_isp":"加州大学","ip":"169.235.24.133","eoi_province":"其他","eoi_town":"其他","eoi_city":"其他","eoi_country":"美国"} 41 | {"eoi_isp":"联通","ip":"220.248.44.62","eoi_province":"上海","eoi_town":"其他","eoi_city":"其他","eoi_country":"中国"} 42 | {"eoi_isp":"电信","ip":"180.167.157.90","eoi_province":"上海","eoi_town":"其他","eoi_city":"其他","eoi_country":"中国"} 43 | {"ip":"278.248.44.62"} 44 | ``` 45 | -------------------------------------------------------------------------------- /jax-flink-job/src/main/resources/JOB-DOC/GsubJob.md: -------------------------------------------------------------------------------- 1 | # 文本替换 2 | 3 | 对字符串进行普通替换或正则替换 4 | 5 | - slot 0,转换成功结果 6 | - slot 1,转换失败数据 7 | 8 | ## 示例1 9 | 10 | 将`,`替换为`-`,参数如下: 11 | 12 | ```json 13 | { 14 | "sourceField": "message", 15 | "replaceMatch": ",", 16 | "replaceValue": "-" 17 | } 18 | ``` 19 | 20 | 输入数据: 21 | ```json 22 | { 23 | "message": "china,shanghai,pudong" 24 | } 25 | ``` 26 | 27 | 输出数据: 28 | ```json 29 | { 30 | "message": "china-shanghai-pudong" 31 | } 32 | ``` 33 | 34 | ## 示例2 35 | 36 | 使用正则替换对手机号进行掩码,`$1`和`$3`指正则匹配的第1组和第3组的值 37 | 38 | ```json 39 | { 40 | "sourceField": "message", 41 | "regexReplace": true, 42 | "replaceMatch": "(\\d{3})(\\d{4})(\\d{4})", 43 | "replaceValue": "$1****$3" 44 | } 45 | ``` 46 | 47 | 输入数据: 48 | ```json 49 | { 50 | "message": "18964722367" 51 | } 52 | ``` 53 | 54 | 输出数据: 55 | ```json 56 | { 57 | "message": "189****2367" 58 | } 59 | ``` -------------------------------------------------------------------------------- /jax-flink-job/src/main/resources/JOB-DOC/JsonStringToMapJob.md: -------------------------------------------------------------------------------- 1 | # Json反序列化 2 | 3 | 将将字符串反序列化为Map: 4 | - 输出slot 0, 类型为`Map`,decode成功数据 5 | - 输出slot 1, 类型为`String`,原始字符串 6 | 7 | 假设输入数据如下: 8 | ``` 9 | {"name":"张三","age":1} 10 | {"name":"李四","age":2} 11 | {"name":"王五","age": 12 | ``` 13 | 14 | slot 0输出 15 | ``` 16 | {"name":"张三","age":1} 17 | {"name":"李四","age":2} 18 | ``` 19 | 20 | slot 1输出 21 | ``` 22 | {"name":"王五","age": 23 | ``` -------------------------------------------------------------------------------- /jax-flink-job/src/main/resources/JOB-DOC/PartitionJob.md: -------------------------------------------------------------------------------- 1 | # PartitionJob 2 | 3 | 对于stream进行partitioning,用于做数据平衡解决数据倾斜问题。 4 | 5 | ## 参数说明 6 | 7 | Partition类型,partitionType: 8 | 9 | - rebalance(Round-robin partitioning) 10 | - shuffle(Random partitioning) 11 | - rescale(local Round-robin partitioning) 12 | 13 | 具体逻辑请参考: 14 | https://ci.apache.org/projects/flink/flink-docs-release-1.12/dev/stream/operators/#physical-partitioning 15 | 16 | -------------------------------------------------------------------------------- /jax-flink-job/src/main/resources/JOB-DOC/RemoveFieldsJob.md: -------------------------------------------------------------------------------- 1 | # 列操作删除 2 | 3 | 参数说明 4 | 5 | - fields: 列操作定义列表 6 | 7 | 例如: 8 | 9 | 参数如下: 10 | 11 | ``` 12 | { 13 | "fields" : [ "time", "value", "value2", "host" ] 14 | } 15 | ``` 16 | 17 | 输入如下: 18 | 19 | ``` 20 | { 21 | "host" : "a", 22 | "time" : "2020-11-22 12:00:00", 23 | "value" : 1 24 | } 25 | { 26 | "host" : "b", 27 | "time" : "2020-11-22 12:00:01", 28 | "value" : 2 29 | } 30 | ``` 31 | 32 | 输出的数据如下: 33 | 34 | ``` 35 | {} 36 | {} 37 | ``` 38 | -------------------------------------------------------------------------------- /jax-flink-job/src/main/resources/JOB-DOC/RenameFieldsJob.md: -------------------------------------------------------------------------------- 1 | # 列操作重命名 2 | 3 | 参数说明 4 | 5 | - fields: 列操作定义列表 6 | 7 | 例如: 8 | 9 | 参数如下: 10 | 11 | ``` 12 | { 13 | "fields" : [ { 14 | "oldField" : "host", 15 | "newField" : "HOST" 16 | }, { 17 | "oldField" : "value", 18 | "newField" : "time" 19 | }, { 20 | "oldField" : "time", 21 | "newField" : "value", 22 | "isReplace" : true 23 | } ] 24 | } 25 | ``` 26 | 27 | 输入如下: 28 | 29 | ``` 30 | { 31 | "host" : "a", 32 | "time" : "2020-11-22 12:00:00", 33 | "value" : 1 34 | } 35 | { 36 | "host" : "b", 37 | "time" : "2020-11-22 12:00:01", 38 | "value" : 2 39 | } 40 | ``` 41 | 42 | 输出的数据如下: 43 | 44 | ``` 45 | {"HOST":"a","value":"2020-11-22 12:00:00"} 46 | {"HOST":"b","value":"2020-11-22 12:00:01"} 47 | ``` 48 | -------------------------------------------------------------------------------- /jax-flink-job/src/main/resources/JOB-DOC/WebsocketSourceJob.md: -------------------------------------------------------------------------------- 1 | # Websocket数据接入 2 | 3 | 接收Websocket数据。需要指定Websocket Server地址,Job会接收来自指定server推送过来的信息,消息须为Json格式。 4 | -------------------------------------------------------------------------------- /jax-flink-job/src/main/resources/JOB-ICON/DissectJob.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jax-flink-job/src/main/resources/JOB-ICON/GsubJob.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jax-flink-job/src/main/resources/JOB-ICON/TypeConvertJob.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jax-flink-job/src/main/resources/JOB-ICON/UnionJob.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jax-flink-job/src/main/resources/JOB-ICON/WebsocketSourceJob.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jax-flink-job/src/main/resources/supportVersion: -------------------------------------------------------------------------------- 1 | [["*"]] -------------------------------------------------------------------------------- /jax-manager/src/main/java/com/eoi/jax/manager/api/JobGetParam.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.manager.api; 16 | 17 | public interface JobGetParam extends JobParam { 18 | } 19 | -------------------------------------------------------------------------------- /jax-manager/src/main/java/com/eoi/jax/manager/api/JobGetResult.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.manager.api; 16 | 17 | public interface JobGetResult extends JobResult { 18 | } 19 | -------------------------------------------------------------------------------- /jax-manager/src/main/java/com/eoi/jax/manager/api/JobListParam.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.manager.api; 16 | 17 | public interface JobListParam extends JobParam { 18 | } 19 | -------------------------------------------------------------------------------- /jax-manager/src/main/java/com/eoi/jax/manager/api/JobListResult.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.manager.api; 16 | 17 | public interface JobListResult extends JobResult { 18 | } 19 | -------------------------------------------------------------------------------- /jax-manager/src/main/java/com/eoi/jax/manager/api/JobParam.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.manager.api; 16 | 17 | public interface JobParam { 18 | void setUuid(UUID uuid); 19 | } 20 | -------------------------------------------------------------------------------- /jax-manager/src/main/java/com/eoi/jax/manager/api/JobResult.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.manager.api; 16 | 17 | public interface JobResult { 18 | UUID getUuid(); 19 | 20 | int getCode(); 21 | 22 | String getMessage(); 23 | 24 | default boolean isSuccess() { 25 | return 0 == getCode(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /jax-manager/src/main/java/com/eoi/jax/manager/api/JobStartParam.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.manager.api; 16 | 17 | public interface JobStartParam extends JobParam { 18 | } 19 | -------------------------------------------------------------------------------- /jax-manager/src/main/java/com/eoi/jax/manager/api/JobStartResult.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.manager.api; 16 | 17 | public interface JobStartResult extends JobResult { 18 | } 19 | -------------------------------------------------------------------------------- /jax-manager/src/main/java/com/eoi/jax/manager/api/JobStopParam.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.manager.api; 16 | 17 | public interface JobStopParam extends JobParam { 18 | } 19 | -------------------------------------------------------------------------------- /jax-manager/src/main/java/com/eoi/jax/manager/api/JobStopResult.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.manager.api; 16 | 17 | public interface JobStopResult extends JobResult { 18 | } 19 | -------------------------------------------------------------------------------- /jax-manager/src/main/java/com/eoi/jax/manager/api/UUID.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.manager.api; 16 | 17 | public interface UUID { 18 | String toString(); 19 | } 20 | -------------------------------------------------------------------------------- /jax-manager/src/main/java/com/eoi/jax/manager/api/VersionParam.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.manager.api; 16 | 17 | public interface VersionParam extends JobParam { 18 | } 19 | -------------------------------------------------------------------------------- /jax-manager/src/main/java/com/eoi/jax/manager/api/VersionResult.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.manager.api; 16 | 17 | public interface VersionResult extends JobResult { 18 | } 19 | -------------------------------------------------------------------------------- /jax-manager/src/main/java/com/eoi/jax/manager/flink/BaseFlinkJobParam.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.manager.flink; 16 | 17 | import java.util.List; 18 | 19 | public abstract class BaseFlinkJobParam extends BaseFlinkJob { 20 | abstract List genArguments(); 21 | } 22 | -------------------------------------------------------------------------------- /jax-manager/src/main/java/com/eoi/jax/manager/process/IProcessRunner.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.manager.process; 16 | 17 | import com.eoi.jax.manager.util.StreamLineReader; 18 | 19 | import java.util.List; 20 | 21 | public interface IProcessRunner { 22 | ProcessOutput exec(List arguments, StreamLineReader reader); 23 | } 24 | -------------------------------------------------------------------------------- /jax-manager/src/main/java/com/eoi/jax/manager/process/LineHandler.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.manager.process; 16 | 17 | import com.eoi.jax.manager.api.UUID; 18 | 19 | public interface LineHandler { 20 | void handleLine(UUID uuid, String line); 21 | } 22 | -------------------------------------------------------------------------------- /jax-manager/src/main/java/com/eoi/jax/manager/spark/BaseSparkJobParam.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.manager.spark; 16 | 17 | import java.util.List; 18 | 19 | public abstract class BaseSparkJobParam extends BaseSparkJob { 20 | abstract List genArguments(); 21 | } 22 | -------------------------------------------------------------------------------- /jax-manager/src/main/java/com/eoi/jax/manager/util/StreamLineReader.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.manager.util; 16 | 17 | public interface StreamLineReader { 18 | void readLine(String line); 19 | } 20 | -------------------------------------------------------------------------------- /jax-tool/src/main/java/com/eoi/jax/tool/IJaxScanner.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed under the Apache License, Version 2.0 (the "License"); 3 | * you may not use this file except in compliance with the License. 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | 15 | package com.eoi.jax.tool; 16 | 17 | import java.util.Map; 18 | 19 | public interface IJaxScanner { 20 | Map scanJob(String path) throws Exception; 21 | } 22 | -------------------------------------------------------------------------------- /jax-ui/.browserslistrc: -------------------------------------------------------------------------------- 1 | [production staging] 2 | last 2 versions 3 | Chrome >= 42 4 | Firefox >= 42 5 | 6 | [development] 7 | last 1 chrome version 8 | last 1 firefox version 9 | -------------------------------------------------------------------------------- /jax-ui/.eslintignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | node_modules 3 | dist 4 | public 5 | coverage 6 | /**/*.js 7 | /**/*.vue 8 | /src/assets 9 | -------------------------------------------------------------------------------- /jax-ui/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | # local env files 6 | .env.local 7 | .env.*.local 8 | 9 | # Log files 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | 14 | # Editor directories and files 15 | .idea 16 | .vscode 17 | *.suo 18 | *.ntvs* 19 | *.njsproj 20 | *.sln 21 | *.sw? 22 | 23 | .scannerwork 24 | -------------------------------------------------------------------------------- /jax-ui/.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | # http://docs.gitlab.com/ce/ci/yaml/ 2 | variables: 3 | GIT_SUBMODULE_STRATEGY: recursive 4 | 5 | build: 6 | script: 7 | - make install 8 | - make build 9 | - cp -r dist/* /opt/middle-end 10 | - make tar 11 | only: 12 | - master@fe/middle-end 13 | - tags@fe/middle-end 14 | artifacts: 15 | name: "${CI_PROJECT_NAME}-web-${CI_COMMIT_REF_SLUG}" 16 | paths: 17 | - middle_end-*.tar.gz 18 | -------------------------------------------------------------------------------- /jax-ui/Makefile: -------------------------------------------------------------------------------- 1 | DEST?=dist 2 | ENV?=dev 3 | dev: 4 | node_modules/.bin/vue-cli-service serve src/main.tsx --open --proxy-env=${ENV} 5 | 6 | clear: 7 | rm -rf ${DEST}/* 8 | 9 | build: clear 10 | node_modules/.bin/vue-cli-service build src/main.tsx --dest ${DEST} 11 | 12 | lint: 13 | node_modules/.bin/vue-cli-service lint src/main.tsx 14 | 15 | install: 16 | yarn --registry=https://registry.npm.taobao.org 17 | 18 | tar: 19 | tar --exclude="dist/.DS_Store" -zcvf middle_end-$(shell git describe --tags --long)-$(shell date "+%Y%m%d").tar.gz dist 20 | 21 | ftp: 22 | ncftpput 192.168.31.84 /packages/newlook middle_end-*.tar.gz 23 | 24 | sonar: 25 | sonar-scanner -Dsonar.projectKey=middle-end -Dsonar.sources=. -Dsonar.host.url=https://sonar.eoitek.net 26 | -------------------------------------------------------------------------------- /jax-ui/README.md: -------------------------------------------------------------------------------- 1 | # middle-end 2 | 3 | 夏洛克数字运维中台前端 4 | 5 | ## 启动 6 | 7 | ```shell 8 | $ make [ENV=] 9 | ``` 10 | 11 | ## 测试环境 12 | 13 | 14 | -------------------------------------------------------------------------------- /jax-ui/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | ['@vue/app', { 4 | useBuiltIns: 'entry' 5 | }], 6 | ], 7 | }; 8 | -------------------------------------------------------------------------------- /jax-ui/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: {} 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /jax-ui/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/public/favicon.ico -------------------------------------------------------------------------------- /jax-ui/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 夏洛克数字运维中台 9 | 10 | 11 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /jax-ui/src/apis/cluster-api.ts: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | 3 | import type { ClusterModel, ItoaResponse } from '@/models'; 4 | import { V1ApiPrefix } from '@/constants'; 5 | 6 | const url = `${V1ApiPrefix}/cluster`; 7 | 8 | export const ClusterApi = { 9 | getAll(isResource = false) { 10 | return axios.get>(`${url}${isResource ? '-resource' : ''}`); 11 | }, 12 | save(body, isCreated = true) { 13 | return axios[isCreated ? 'post' : 'put']>(`${url}/${body.clusterName}`, body); 14 | }, 15 | delete(clusterName: string) { 16 | return axios.delete>(`${url}/${clusterName}`); 17 | }, 18 | }; 19 | -------------------------------------------------------------------------------- /jax-ui/src/apis/diagnosis.ts: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | 3 | import type { DiagnosisModel, ItoaResponse } from '@/models'; 4 | import { V1ApiPrefix } from '@/constants'; 5 | 6 | const url = `${V1ApiPrefix}/diagnosis`; 7 | 8 | export const Diagnosis = { 9 | getItem(type: string, params) { 10 | return axios.get>(`${url}/${type}`, { params }); 11 | }, 12 | }; 13 | -------------------------------------------------------------------------------- /jax-ui/src/apis/index.ts: -------------------------------------------------------------------------------- 1 | export * from './cluster-api'; 2 | export * from './diagnosis'; 3 | export * from './jar'; 4 | export * from './job-share'; 5 | export * from './job'; 6 | export * from './opts-api'; 7 | export * from './pipeline'; 8 | -------------------------------------------------------------------------------- /jax-ui/src/apis/job-share.ts: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | 3 | import { ItoaResponse, JobModel, JobConfig } from '@/models'; 4 | import { V1ApiPrefix } from '@/constants'; 5 | 6 | interface JobShareApiBody { 7 | jobConfig: JobConfig; 8 | jobName: string; 9 | shareName: string; 10 | } 11 | 12 | const url = `${V1ApiPrefix}/jobshare`; 13 | 14 | export const JobShareApi = { 15 | getAll() { 16 | return axios.get>(url); 17 | }, 18 | save(body: JobShareApiBody, isCreated = true) { 19 | return axios[isCreated ? 'post' : 'put']>(`${url}/${body.shareName}`, body); 20 | }, 21 | delete(shareName: string) { 22 | return axios.delete>(`${url}/${shareName}`); 23 | }, 24 | exist(shareName: string) { 25 | return axios.get>(`${url}/${shareName}/exist`); 26 | }, 27 | }; 28 | -------------------------------------------------------------------------------- /jax-ui/src/apis/job.ts: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | 3 | import { ItoaResponse, JobModel, PipelineModel } from '@/models'; 4 | import { V1ApiPrefix } from '@/constants'; 5 | 6 | const url = `${V1ApiPrefix}/job`; 7 | 8 | export const JobApi = { 9 | getAll() { 10 | return axios.get>(url); 11 | }, 12 | getPipelines(jobName: string) { 13 | return axios.get>(`${url}/${jobName}/pipeline`); 14 | }, 15 | // eslint-disable-next-line no-shadow 16 | getMartDown(url) { 17 | return axios.get>(url); 18 | }, 19 | }; 20 | -------------------------------------------------------------------------------- /jax-ui/src/app/element-variables.scss: -------------------------------------------------------------------------------- 1 | @import "~@/common/app/element-variables"; 2 | 3 | .el-message-box__message > p, 4 | .el-tooltip__popper { 5 | white-space: pre-line; 6 | } 7 | 8 | // form 必填项*位置修改 9 | .el-form-item { 10 | &.is-required:not(.is-no-asterisk) { 11 | & > .el-form-item__label { 12 | &:before { 13 | display: none; 14 | } 15 | 16 | &:after { 17 | content: '*'; 18 | color: #F56C6C; 19 | } 20 | } 21 | } 22 | 23 | .el-form-item__label, .el-form-item__content, .el-radio__label, .el-checkbox__label { 24 | font-size: 13px; 25 | } 26 | } 27 | 28 | .sharp-drawer__body{ 29 | padding: 10px !important; 30 | } 31 | 32 | // TODO 现在这边改掉, 后面再组件内部改完后去掉 33 | .el-drawer__wrapper { 34 | pointer-events: none; 35 | 36 | .el-drawer { 37 | pointer-events: auto; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /jax-ui/src/app/filters.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | 3 | import '@/common/app/filters'; 4 | import * as Constants from '@/constants'; 5 | 6 | const Obj: Record = Object.assign({}, ...[ 7 | 'ClusterType', 8 | 'JobRoleType', 9 | 'FinkDetectIdType', 10 | ].map(x => { 11 | const arr = Object.keys(Constants[x]).map(item => ({ ...Constants[x][item] })); 12 | return { [x]: Object.fromEntries(arr.map(({ value, label }) => [value, label])) }; 13 | }) as any); 14 | 15 | const filters = { 16 | ClusterType(value: number) { 17 | return Obj.ClusterType[value] || '-'; 18 | }, 19 | JobRoleType(value: string) { 20 | return Obj.JobRoleType[value] || '-'; 21 | }, 22 | FinkDetectIdType(value: string) { 23 | return Obj.FinkDetectIdType[value] || '-'; 24 | }, 25 | }; 26 | 27 | Object.entries(filters).forEach(([key, value]) => Vue.filter(key, value as any)); 28 | -------------------------------------------------------------------------------- /jax-ui/src/app/index.ts: -------------------------------------------------------------------------------- 1 | import '@fonts/icomoon/style.scss'; 2 | import '@fonts/PFDinMono/stylesheet.css'; 3 | 4 | import './element-variables.scss'; 5 | import './global.scss'; 6 | 7 | import '@/common/app/detectFeatures'; 8 | import './filters'; 9 | import './runs'; 10 | -------------------------------------------------------------------------------- /jax-ui/src/app/runs.ts: -------------------------------------------------------------------------------- 1 | import axios, { AxiosError, AxiosResponse } from 'axios'; 2 | 3 | import '@/common/app/run'; 4 | 5 | import { Project } from '@/constants'; 6 | 7 | axios.interceptors.response.use((value: AxiosResponse) => { 8 | if (value.config.url.startsWith(Project.serviceName ? `/${Project.serviceName}/api` : '/api')) { 9 | if (value.data && value.data.retCode) { 10 | if (value.data.retCode !== '0000') { 11 | return Promise.reject({ 12 | config: value.config, 13 | code: value.status, 14 | request: value.request, 15 | response: value, 16 | isAxiosError: true, 17 | }); 18 | } 19 | } 20 | } 21 | return value; 22 | }, (err: AxiosError) => { 23 | if (!navigator.onLine) { 24 | err.message = '网络错误,请检查网络配置!'; 25 | } 26 | return Promise.reject(err); 27 | }); 28 | -------------------------------------------------------------------------------- /jax-ui/src/app/variables.scss: -------------------------------------------------------------------------------- 1 | $primary-color: #4A90E2; 2 | -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Bold.eot -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Bold.ttf -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Bold.woff -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Bold.woff2 -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-BoldItalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-BoldItalic.eot -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-BoldItalic.ttf -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-BoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-BoldItalic.woff -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-BoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-BoldItalic.woff2 -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Italic.eot -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Italic.ttf -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Italic.woff -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Italic.woff2 -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Light.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Light.eot -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Light.ttf -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Light.woff -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Light.woff2 -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-LightItalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-LightItalic.eot -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-LightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-LightItalic.ttf -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-LightItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-LightItalic.woff -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-LightItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-LightItalic.woff2 -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Medium.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Medium.eot -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Medium.ttf -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Medium.woff -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Medium.woff2 -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-MediumItalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-MediumItalic.eot -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-MediumItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-MediumItalic.ttf -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-MediumItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-MediumItalic.woff -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-MediumItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-MediumItalic.woff2 -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Regular.eot -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Regular.ttf -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Regular.woff -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Regular.woff2 -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Thin.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Thin.eot -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Thin.ttf -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Thin.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Thin.woff -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-Thin.woff2 -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-ThinItalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-ThinItalic.eot -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-ThinItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-ThinItalic.ttf -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-ThinItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-ThinItalic.woff -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-ThinItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-ThinItalic.woff2 -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-XThin.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-XThin.eot -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-XThin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-XThin.ttf -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-XThin.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-XThin.woff -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-XThin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-XThin.woff2 -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-XThinItalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-XThinItalic.eot -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-XThinItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-XThinItalic.ttf -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-XThinItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-XThinItalic.woff -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/PFDinMono/PFDinMono-XThinItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/PFDinMono/PFDinMono-XThinItalic.woff2 -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/icomoon/fonts/icomoon.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/icomoon/fonts/icomoon.eot -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/icomoon/fonts/icomoon.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/icomoon/fonts/icomoon.ttf -------------------------------------------------------------------------------- /jax-ui/src/assets/fonts/icomoon/fonts/icomoon.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/fonts/icomoon/fonts/icomoon.woff -------------------------------------------------------------------------------- /jax-ui/src/assets/images/icon-mini-running-color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EOITek/jax/2ea2d90ff6ed00a5f78e7ea449a6a2eabbee6d68/jax-ui/src/assets/images/icon-mini-running-color.png -------------------------------------------------------------------------------- /jax-ui/src/assets/images/mark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | mark 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /jax-ui/src/assets/images/realZoom.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /jax-ui/src/assets/images/sink.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jax-ui/src/assets/images/table-active.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jax-ui/src/assets/images/table.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jax-ui/src/common/app/filters.ts: -------------------------------------------------------------------------------- 1 | import { lightFormat } from 'date-fns'; 2 | import Vue from 'vue'; 3 | 4 | const filters = { 5 | // 日期格式化 6 | formatDate(value: Date | number | string, d = 'yyyy-MM-dd HH:mm:ss') { 7 | return value == null || value === '' ? '-' : lightFormat(typeof value === 'string' ? new Date(value) : value, d); 8 | }, 9 | formatTime(value: Date | number | string) { 10 | return value == null ? '-' : new Date(value).toISOString().slice(11, -5); 11 | }, 12 | percent(value = 0, round = 0) { 13 | return (value * 100).toFixed(round) + '%'; 14 | }, 15 | trueFalse(val: boolean) { 16 | return val ? '真' : '假'; 17 | }, 18 | yesNo(val: boolean) { 19 | return val ? '是' : '否'; 20 | }, 21 | }; 22 | 23 | Object.entries(filters).forEach(([key, value]) => Vue.filter(key, value)); 24 | -------------------------------------------------------------------------------- /jax-ui/src/common/app/hackElementUI.ts: -------------------------------------------------------------------------------- 1 | import { Dropdown, InputNumber, Link, MessageBox, Slider } from 'element-ui'; 2 | 3 | (Link as any).props.underline.default = false; 4 | (InputNumber as any).props.controlsPosition.default = 'right'; 5 | (InputNumber as any).props.max.default = Number.MAX_SAFE_INTEGER; 6 | (InputNumber as any).props.min.default = Number.MIN_SAFE_INTEGER; 7 | (Slider as any).props.inputControlsPosition.default = 'right'; 8 | (Dropdown as any).props.trigger.default = 'click'; 9 | MessageBox.setDefaults({ closeOnClickModal: false }); 10 | -------------------------------------------------------------------------------- /jax-ui/src/common/app/polyfill.js: -------------------------------------------------------------------------------- 1 | // 注意FullScreen的大小写 2 | if (!Element.prototype.requestFullscreen) { 3 | const prototype = Element.prototype; 4 | prototype.requestFullscreen = prototype.webkitRequestFullscreen 5 | || prototype.mozRequestFullScreen 6 | || prototype.msRequestFullscreen; 7 | } 8 | 9 | if (!HTMLDocument.prototype.exitFullscreen) { 10 | const prototype = HTMLDocument.prototype; 11 | prototype.exitFullscreen = prototype.webkitExitFullscreen 12 | || prototype.mozCancelFullScreen 13 | || prototype.msExitFullscreen; 14 | } 15 | 16 | if (!('fullscreenElement' in HTMLDocument.prototype)) { 17 | Object.defineProperty(HTMLDocument.prototype, 'fullscreenElement', { 18 | get() { 19 | return document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement; 20 | }, 21 | enumerable: false, 22 | configurable: true, 23 | }) 24 | } 25 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/child-view-holder.tsx: -------------------------------------------------------------------------------- 1 | import { CreateElement } from 'vue'; 2 | 3 | import { Component, VueComponentBase } from '../VueComponentBase'; 4 | 5 | @Component({ name: 'ChildViewHolder' }) 6 | export class ChildViewHolder extends VueComponentBase { 7 | render(h: CreateElement) { 8 | return ; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/r-tabset/index.ts: -------------------------------------------------------------------------------- 1 | export { default as RTabset } from './r-tabset.vue'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/r-tabset/r-tabset.ts: -------------------------------------------------------------------------------- 1 | import { Component, Prop, VueComponentBase } from '../../VueComponentBase'; 2 | 3 | @Component() 4 | export default class RTabset extends VueComponentBase { 5 | @Prop() readonly keepAlive: boolean; 6 | @Prop() readonly props: any; 7 | @Prop() readonly navStyle: any; 8 | @Prop({ type: [String, Number] }) readonly viewKey: string | number; 9 | @Prop() readonly customRouterView: boolean; 10 | } 11 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/r-tabset/r-tabset.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/sharp-modal-drawer/README.md: -------------------------------------------------------------------------------- 1 | # 引入方式 2 | 3 | * main.tsx 修改 4 | 5 | ```typescript jsx 6 | const data = { 7 | modals: [], 8 | drawers: [], 9 | }; 10 | // render 中添加 11 | 12 | {this.modals.map(attrs => )} 13 | {this.drawers.map(attrs => )} 14 | ``` 15 | 16 | # 使用方式 17 | 18 | ```ts 19 | $modal({ 20 | props: { 21 | title: 'xxx', 22 | width: '500px', 23 | }, 24 | component: ComponentXxx, 25 | }).then(); 26 | 27 | $drawer({ 28 | props: { 29 | title: 'xxx', 30 | size: '500px', 31 | }, 32 | component: ComponentXxx, 33 | }).then(); 34 | ``` 35 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/sharp-modal-drawer/index.ts: -------------------------------------------------------------------------------- 1 | export { default as SharpDrawer } from './sharp-drawer'; 2 | export { default as SharpModal } from './sharp-modal'; 3 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/sharp-modal-drawer/sharp-drawer.ts: -------------------------------------------------------------------------------- 1 | import ModalDrawerMixin from './modal-drawer-mixin'; 2 | 3 | export default class SharpDrawer extends ModalDrawerMixin {} 4 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/sharp-modal-drawer/sharp-modal.ts: -------------------------------------------------------------------------------- 1 | import ModalDrawerMixin from './modal-drawer-mixin'; 2 | 3 | export default class SharpModal extends ModalDrawerMixin {} 4 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/sharp-selector-next/components/cascader/index.ts: -------------------------------------------------------------------------------- 1 | export { default as cascader } from './cascader'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/sharp-selector-next/components/date-range/date-range.ts: -------------------------------------------------------------------------------- 1 | import type { DatePicker } from 'element-ui'; 2 | 3 | import { Component, Prop, Ref, VueComponentBase } from '@/common/VueComponentBase'; 4 | 5 | import type { SharpSelectorNextDataValModel } from '../../../../models'; 6 | 7 | @Component() 8 | export default class DateRange extends VueComponentBase { 9 | @Prop() readonly item: SharpSelectorNextDataValModel; 10 | @Prop() readonly size: string; 11 | 12 | @Ref() readonly Date: DatePicker; 13 | 14 | editing = false; 15 | 16 | mounted() { 17 | if (!this.item.value) this.edit(); 18 | } 19 | 20 | change() { 21 | this.editing = false; 22 | this.$emit('call'); 23 | } 24 | 25 | async edit() { 26 | this.editing = true; 27 | await this.$nextTick(); 28 | this.Date.focus(); 29 | } 30 | 31 | blur() { 32 | this.editing = false; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/sharp-selector-next/components/date-range/index.ts: -------------------------------------------------------------------------------- 1 | export { default as dateRange } from './date-range'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/sharp-selector-next/components/date/index.ts: -------------------------------------------------------------------------------- 1 | export { default as date } from './date'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/sharp-selector-next/components/index.ts: -------------------------------------------------------------------------------- 1 | export * from './input'; 2 | export * from './select'; 3 | export * from './date'; 4 | export * from './date-range'; 5 | export * from './cascader'; 6 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/sharp-selector-next/components/input-style.scss: -------------------------------------------------------------------------------- 1 | .input { 2 | width: 80px; 3 | min-width: 80px; 4 | max-width: 100%; 5 | display: inline-block; 6 | outline: none; 7 | border-radius: 3px; 8 | border: none; 9 | padding: 0 4px; 10 | color: var(--color-neutrals-8); 11 | height: 20px; 12 | line-height: 20px; 13 | font-size: 12px; 14 | font-family: -apple-system, BlinkMacSystemFont, "Pingfang SC", "Segoe UI", "Helvetica Neue", Verdana, Arial, STHeiti, "Microsoft Yahei", sans-serif; 15 | background: transparent; 16 | 17 | &.edit { 18 | box-shadow: inset 0 0 0px 1px $primary-color, 0 0 2px $primary-color; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/sharp-selector-next/components/input/index.ts: -------------------------------------------------------------------------------- 1 | export { default as input } from './input'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/sharp-selector-next/components/input/input.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/sharp-selector-next/components/select/index.ts: -------------------------------------------------------------------------------- 1 | export { default as select } from './select'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/sharp-selector-next/components/select/select.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/sharp-selector-next/index.ts: -------------------------------------------------------------------------------- 1 | export * from './main'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/sharp-selector-next/main/index.ts: -------------------------------------------------------------------------------- 1 | export { default as SharpSelectorNext } from './sharp-selector'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/sharp-selector/components/duration.vue: -------------------------------------------------------------------------------- 1 | 16 | 24 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/sharp-selector/components/index.ts: -------------------------------------------------------------------------------- 1 | export { default as duration } from './duration.vue'; 2 | export { default as filter } from './filter.vue'; 3 | export { default as input } from './input.vue'; 4 | export { default as multi } from './multi.vue'; 5 | export { default as range } from './range.vue'; 6 | export { default as single } from './single.vue'; 7 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/sharp-selector/components/input.vue: -------------------------------------------------------------------------------- 1 | 17 | 25 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/sharp-selector/components/single.vue: -------------------------------------------------------------------------------- 1 | 16 | 24 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/sharp-selector/index.ts: -------------------------------------------------------------------------------- 1 | export * from './main'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/sharp-selector/main/index.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | 3 | import SharpSelector from './sharp-selector'; 4 | 5 | Vue.component('sharp-selector', SharpSelector); 6 | 7 | export { SharpSelector }; 8 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/table-selection/index.ts: -------------------------------------------------------------------------------- 1 | export { default as TableSelection } from './table-selection'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/table-selection/table-selection.vue: -------------------------------------------------------------------------------- 1 | 14 | 17 | 18 | -------------------------------------------------------------------------------- /jax-ui/src/common/components/vue-echarts/index.ts: -------------------------------------------------------------------------------- 1 | export * from './vue-echarts'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/common/constants/PrimaryColor.ts: -------------------------------------------------------------------------------- 1 | export const PrimaryColor = getComputedStyle(document.documentElement).getPropertyValue('--primary-color').trim(); 2 | -------------------------------------------------------------------------------- /jax-ui/src/common/constants/Project.ts: -------------------------------------------------------------------------------- 1 | declare let __SERVICE_NAME__: string; 2 | declare let __PROJECT_NAME__: string; 3 | declare let __PROJECT_DISPLAY_NAME__: string; 4 | declare let __PROJECT_ENVIRONMENT__: 'dev' | 'prod'; 5 | declare let __PROJECT_VERSION__: string; 6 | declare let __PROJECT_COMMITS_SINCE_RELEASE__: number; 7 | declare let __PROJECT_COMPILE_TIME__: number; 8 | declare let __PROJECT_COMMIT_SHA__: string; 9 | 10 | export const Project = Object.freeze({ 11 | serviceName: __SERVICE_NAME__, 12 | name: __PROJECT_NAME__, 13 | displayName: __PROJECT_DISPLAY_NAME__, 14 | environment: __PROJECT_ENVIRONMENT__, 15 | version: __PROJECT_VERSION__, 16 | commitsSinceRelease: __PROJECT_COMMITS_SINCE_RELEASE__, 17 | compileTime: __PROJECT_COMPILE_TIME__, 18 | commitSha: __PROJECT_COMMIT_SHA__, 19 | }); 20 | -------------------------------------------------------------------------------- /jax-ui/src/common/constants/index.ts: -------------------------------------------------------------------------------- 1 | export * from './PrimaryColor'; 2 | export * from './Project'; 3 | -------------------------------------------------------------------------------- /jax-ui/src/common/directives/index.ts: -------------------------------------------------------------------------------- 1 | import './ref'; 2 | import './tooltip'; 3 | -------------------------------------------------------------------------------- /jax-ui/src/common/directives/ref.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | 3 | Vue.directive('ref', { 4 | bind(el: HTMLElement, { value }: { value?: (x: Vue) => void }, { componentInstance }: { componentInstance?: Vue }) { 5 | value(componentInstance); 6 | }, 7 | }); 8 | -------------------------------------------------------------------------------- /jax-ui/src/common/helpers/PaginationConfig.ts: -------------------------------------------------------------------------------- 1 | export class PaginationConfig { 2 | currentPage = null; 3 | totalItems = 0; 4 | 5 | constructor(public itemsPerPage = null) {} 6 | 7 | toApiParams(): { page: number; from: number; size: number } { 8 | const page = (this.currentPage || 1) - 1; 9 | const size = this.itemsPerPage || 10; 10 | return { 11 | page, 12 | from: page * size, 13 | size, 14 | }; 15 | } 16 | 17 | filterData(arr: T[]) { 18 | const { from, size } = this.toApiParams(); 19 | return arr.slice(from, from + size); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /jax-ui/src/common/helpers/callbackToAsync.ts: -------------------------------------------------------------------------------- 1 | export function callbackToAsync(fn: (...args) => Promise | any) { 2 | return (...argsWithCallback) => { 3 | const callback = argsWithCallback.reduce((prev, curr) => typeof curr === 'function' ? curr : prev) as () => void; 4 | Promise.resolve(fn(...argsWithCallback)).then(callback); 5 | }; 6 | } 7 | -------------------------------------------------------------------------------- /jax-ui/src/common/helpers/debounce.ts: -------------------------------------------------------------------------------- 1 | import { Decorator } from '../VueComponentBase'; 2 | 3 | export function Debounce(wait: number): Decorator { 4 | return function decorate(clazz: any, fn: string) { 5 | const func = clazz[fn]; 6 | const handleKey = `__${fn}__debounce_handle`; 7 | return { 8 | enumerable: false, 9 | value(...args) { 10 | if (this[handleKey]) clearTimeout(this[handleKey]); 11 | this[handleKey] = setTimeout(() => func.apply(this, args), wait); 12 | return () => { 13 | clearTimeout(this[handleKey]); 14 | this[handleKey] = undefined; 15 | }; 16 | }, 17 | }; 18 | }; 19 | } 20 | -------------------------------------------------------------------------------- /jax-ui/src/common/helpers/delay.ts: -------------------------------------------------------------------------------- 1 | export function delay(duration = 0) { 2 | return new Promise(resolve => setTimeout(resolve, duration)); 3 | } 4 | -------------------------------------------------------------------------------- /jax-ui/src/common/helpers/downloadFile.ts: -------------------------------------------------------------------------------- 1 | import { Project } from '../constants'; 2 | 3 | export function downloadFile(url: string, params: {[key: string]: any} = {}, method = 'get', target = '') { 4 | if (!url) return; 5 | const form = document.createElement('form'); 6 | form.style.display = 'none'; 7 | form.method = method; 8 | form.action = Project.serviceName ? `/${Project.serviceName}${url}` : url; // FIXME 后续需要统一处理 9 | form.target = target; 10 | Object.entries(params).filter(([, value]) => value !== undefined).forEach(param => { 11 | const ipt = document.createElement('input'); 12 | ipt.name = param[0]; 13 | ipt.value = param[1]; 14 | form.appendChild(ipt); 15 | }); 16 | document.body.appendChild(form); 17 | form.submit(); 18 | document.body.removeChild(form); 19 | } 20 | -------------------------------------------------------------------------------- /jax-ui/src/common/helpers/getElTextWidth.ts: -------------------------------------------------------------------------------- 1 | let ctx: CanvasRenderingContext2D = null; 2 | 3 | export function getElTextWidth(value: string, font: string) { 4 | if (!value) return 0; 5 | 6 | ctx = ctx || document.createElement('canvas').getContext('2d'); 7 | ctx.font = font; 8 | return ctx.measureText(value).width; 9 | } 10 | -------------------------------------------------------------------------------- /jax-ui/src/common/helpers/hasOwn.ts: -------------------------------------------------------------------------------- 1 | export const hasOwn: (obj: Record, key: PropertyKey) => boolean 2 | = Object.call.bind(Object.prototype.hasOwnProperty); 3 | -------------------------------------------------------------------------------- /jax-ui/src/common/helpers/htmlEscape.ts: -------------------------------------------------------------------------------- 1 | export function htmlEscape(str: string) { 2 | return (str || '') 3 | .replace(/&/g, '&') 4 | .replace(/"/g, '"') 5 | .replace(/'/g, ''') 6 | .replace(//g, '>'); 8 | } 9 | -------------------------------------------------------------------------------- /jax-ui/src/common/helpers/index.ts: -------------------------------------------------------------------------------- 1 | export * from './callbackToAsync'; 2 | export * from './downloadFile'; 3 | export * from './exportImage'; 4 | export * from './htmlEscape'; 5 | export * from './jsonStableStringify'; 6 | export * from './PaginationConfig'; 7 | export * from './parseJsonSafe'; 8 | export * from './delay'; 9 | export * from './readFile'; 10 | export * from './debounce'; 11 | export * from './pushOrCreate'; 12 | export * from './minMax'; 13 | export * from './html2svg'; 14 | export * from './getElTextWidth'; 15 | -------------------------------------------------------------------------------- /jax-ui/src/common/helpers/jsonStableStringify.ts: -------------------------------------------------------------------------------- 1 | export function jsonStableStringify(obj, space: any = 2) { 2 | const allKeys = []; 3 | JSON.stringify(obj, (key, value) => { 4 | allKeys.push(key); 5 | return value; 6 | }); 7 | allKeys.sort(); 8 | return JSON.stringify(obj, allKeys, space); 9 | } 10 | -------------------------------------------------------------------------------- /jax-ui/src/common/helpers/minMax.ts: -------------------------------------------------------------------------------- 1 | export function minMax(arr: number[]) { 2 | const res = [Infinity, -Infinity]; 3 | // eslint-disable-next-line @typescript-eslint/prefer-for-of 4 | for (let i = 0; i < arr.length; ++i) { 5 | const value = arr[i]; 6 | res[0] = value < res[0] ? value : res[0]; 7 | res[1] = value > res[1] ? value : res[1]; 8 | } 9 | return res; 10 | } 11 | -------------------------------------------------------------------------------- /jax-ui/src/common/helpers/parseJsonSafe.ts: -------------------------------------------------------------------------------- 1 | export function parseJsonSafe(json, value = json) { 2 | try { 3 | return JSON.parse(json); 4 | } catch { 5 | return value; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /jax-ui/src/common/helpers/pushOrCreate.ts: -------------------------------------------------------------------------------- 1 | import { hasOwn } from './hasOwn'; 2 | 3 | export function pushOrCreate(obj: Record, key: any, value: T): T[] { 4 | if (hasOwn(obj, key)) { 5 | obj[key].push(value); 6 | } else { 7 | obj[key] = [value]; 8 | } 9 | return obj[key]; 10 | } 11 | -------------------------------------------------------------------------------- /jax-ui/src/common/helpers/readFile.ts: -------------------------------------------------------------------------------- 1 | export function readFile(file: File, isBinary = false) { 2 | return new Promise(((resolve, reject) => { 3 | if (file) { 4 | const reader = new FileReader(); 5 | reader.onload = () => { 6 | resolve(reader.result as string); 7 | reader.onload = null; 8 | }; 9 | if (isBinary) { 10 | reader.readAsBinaryString(file); 11 | } else { 12 | reader.readAsText(file); 13 | } 14 | } else { 15 | reject(new Error('读取文件失败')); 16 | } 17 | })); 18 | } 19 | -------------------------------------------------------------------------------- /jax-ui/src/common/models/global.ts: -------------------------------------------------------------------------------- 1 | export interface ItoaResponse { 2 | retCode: string; 3 | retMsg: string; 4 | entity: T; 5 | totalCount?: number; 6 | total?: number; 7 | [key: string]: any; 8 | } 9 | -------------------------------------------------------------------------------- /jax-ui/src/common/models/index.ts: -------------------------------------------------------------------------------- 1 | export * from './modal'; 2 | export * from './global'; 3 | export * from './root'; 4 | export * from './sharp-selector'; 5 | export * from './sharp-selector-next'; 6 | export * from './drawer'; 7 | -------------------------------------------------------------------------------- /jax-ui/src/common/models/root.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | 3 | export interface RootBase extends Vue { 4 | modals?: import ('../services/modal').ModalPropModel[]; 5 | tooltips?: import ('../components/sharp-tooltip').TooltipPropModel[]; 6 | drawers?: import('../services/modal').ModalPropModel[]; 7 | loading: { 8 | status: number; 9 | text: string; 10 | }; 11 | } 12 | -------------------------------------------------------------------------------- /jax-ui/src/common/models/sharp-selector-next.ts: -------------------------------------------------------------------------------- 1 | export type SharpSelectorNextDataModel = Record; 2 | 3 | export interface SharpSelectorNextDataValModel { 4 | not: boolean; 5 | value: T; 6 | } 7 | 8 | export interface SharpSelectorNextOptionModel { 9 | type: 'input' | 'select' | 'date' | 'dateRange' | 'cascader' | Vue; 10 | key: string; 11 | name: string; 12 | options?: SharpSelectorNextSubOptionModel[]; 13 | } 14 | 15 | export interface SharpSelectorNextSubOptionModel { 16 | label: string; 17 | value: boolean | string | number; 18 | children?: SharpSelectorNextSubOptionModel[]; 19 | } 20 | -------------------------------------------------------------------------------- /jax-ui/src/common/models/sharp-selector.ts: -------------------------------------------------------------------------------- 1 | export interface SharpSelectorDataModel { 2 | detail: { 3 | title: string; 4 | key: string; 5 | filterType: string; 6 | filterDisabled: boolean; 7 | [key: string]: any; 8 | }; 9 | key: string; 10 | value: any; 11 | tempValue: any; 12 | visible: boolean; 13 | options?: { 14 | value: number | string | boolean; 15 | label: string; 16 | selected?: boolean; 17 | }[]; 18 | searchText: string; 19 | displayText: string; 20 | displayTextArr: { label: string; value: string | number | boolean }[]; 21 | } 22 | 23 | export interface SharpSelectorNewOptionsModel { 24 | title: string; 25 | key: string; 26 | filterType: string; 27 | filterDisabled?: boolean; 28 | [key: string]: any; 29 | } 30 | 31 | export interface SharpSelectorOptionDetailModel { 32 | [key: string]: { label: string; value: string | number | boolean }[]; 33 | } 34 | -------------------------------------------------------------------------------- /jax-ui/src/common/services/dialog.ts: -------------------------------------------------------------------------------- 1 | import { MessageBox } from 'element-ui'; 2 | import type { ElMessageBoxOptions, MessageBoxInputData } from 'element-ui/types/message-box'; 3 | import type { VNode } from 'vue'; 4 | 5 | export const $dialog = { 6 | confirm: (message: string | VNode, title = '提示', options?: ElMessageBoxOptions) => MessageBox.confirm(message as any, title, options), 7 | alert: (message: string | VNode, title = '提示', options?: ElMessageBoxOptions) => MessageBox.alert(message as any, title, options), 8 | prompt: (message: string | VNode, title = '提示', options?: ElMessageBoxOptions) => MessageBox.prompt(message as any, title, options) as Promise, 9 | msgbox: (options: ElMessageBoxOptions) => MessageBox(options), 10 | close: () => MessageBox.close(), 11 | }; 12 | -------------------------------------------------------------------------------- /jax-ui/src/common/services/index.ts: -------------------------------------------------------------------------------- 1 | export * from './dialog'; 2 | export * from './loading'; 3 | export * from './modal'; 4 | export * from './message'; 5 | export * from './root'; 6 | export * from './progress'; 7 | -------------------------------------------------------------------------------- /jax-ui/src/common/services/loading.ts: -------------------------------------------------------------------------------- 1 | import { $root } from '../services'; 2 | 3 | export const $loading = { 4 | increase(text = '') { 5 | const { loading } = $root; 6 | loading.status++; 7 | loading.text = text; 8 | }, 9 | decrease() { 10 | setTimeout(() => $root.loading.status--); 11 | }, 12 | }; 13 | -------------------------------------------------------------------------------- /jax-ui/src/common/services/progress.ts: -------------------------------------------------------------------------------- 1 | import { VueProgress } from '../components/vue-progressbar'; 2 | import { $root } from './root'; 3 | 4 | export const $progress = {} as VueProgress; 5 | 6 | [ 7 | 'start', 8 | 'setPercent', 9 | 'increase', 10 | 'decrease', 11 | 'hide', 12 | 'pause', 13 | 'finish', 14 | 'fail', 15 | 'isRunning', 16 | ].forEach(key => { 17 | $progress[key] = (...args) => { 18 | if (!$root || !$root.$refs) return; 19 | $root.$refs.progressbar[key](...args); 20 | }; 21 | }); 22 | -------------------------------------------------------------------------------- /jax-ui/src/common/services/root.ts: -------------------------------------------------------------------------------- 1 | import type { Root } from '@/models'; 2 | 3 | export let $root: Root; 4 | 5 | export function _updateVueInstance(vue: Root) { 6 | $root = vue; 7 | } 8 | -------------------------------------------------------------------------------- /jax-ui/src/common/typings/shims-global.d.ts: -------------------------------------------------------------------------------- 1 | interface Array { 2 | // https://github.com/tc39/proposal-array-last 3 | /** @deprecated use `.at(-1)` */ 4 | lastItem: T; 5 | /** @deprecated use `.length-1` */ 6 | readonly lastIndex: number; 7 | 8 | // https://github.com/tc39/proposal-relative-indexing-method 9 | at(index: number): T; 10 | } 11 | -------------------------------------------------------------------------------- /jax-ui/src/common/typings/shims-images.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.svg'; 2 | declare module '*.png'; 3 | declare module '*.jpg'; 4 | declare module '*.jpeg'; 5 | declare module '*.gif'; 6 | declare module '*.bmp'; 7 | declare module '*.tiff'; 8 | -------------------------------------------------------------------------------- /jax-ui/src/common/typings/shims-tsx.d.ts: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 2 | import Vue, { VNode } from 'vue'; 3 | 4 | declare global { 5 | namespace JSX { 6 | // eslint-disable-next-line @typescript-eslint/no-empty-interface 7 | interface Element extends VNode {} 8 | // eslint-disable-next-line @typescript-eslint/no-empty-interface 9 | interface ElementClass extends Vue {} 10 | interface IntrinsicElements { 11 | [elem: string]: any; 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /jax-ui/src/common/typings/shims-vue.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.vue' { 2 | import { VueConstructor } from 'vue'; 3 | const result: VueConstructor; 4 | export default result; 5 | } 6 | -------------------------------------------------------------------------------- /jax-ui/src/common/typings/shims-worker.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'worker-loader!*' { 2 | // You need to change `Worker`, if you specified a different value for the `workerType` option 3 | class WebpackWorker extends Worker { 4 | constructor(); 5 | } 6 | 7 | // Uncomment this if you set the `esModule` option to `false` 8 | // export = WebpackWorker; 9 | export default WebpackWorker; 10 | } 11 | -------------------------------------------------------------------------------- /jax-ui/src/components/index.ts: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | 3 | import { InputJson } from './input-json'; 4 | 5 | export * from '@/common/components'; 6 | 7 | // 引入ace语法 8 | import 'ace-builds/src-noconflict/mode-javascript'; 9 | import 'ace-builds/src-noconflict/mode-sql'; 10 | 11 | Object.entries({ 12 | InputJson, 13 | // 第三方库 14 | }).forEach(([name, component]) => Vue.component(name, component)); 15 | -------------------------------------------------------------------------------- /jax-ui/src/components/input-json/index.ts: -------------------------------------------------------------------------------- 1 | export { default as InputJson } from './input-json'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/components/input-json/input-json.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | -------------------------------------------------------------------------------- /jax-ui/src/constants/FinkStatus.ts: -------------------------------------------------------------------------------- 1 | const FinkStatus = Object.freeze({ 2 | normal: { bgColor: '#67C23A', value: 'normal' }, 3 | fatal: { bgColor: '#F56C6C', value: 'fatal' }, 4 | error: { bgColor: '#FF6600', value: 'error' }, 5 | warn: { bgColor: '#E6A23C', value: 'warn' }, 6 | info: { bgColor: '#909399', value: 'info' }, 7 | }); 8 | 9 | export { 10 | FinkStatus, 11 | }; 12 | -------------------------------------------------------------------------------- /jax-ui/src/constants/FrameType.ts: -------------------------------------------------------------------------------- 1 | const FrameType = Object.freeze({ 2 | flink: { label: 'flink', value: 'flink' }, 3 | spark: { label: 'spark', value: 'spark' }, 4 | }); 5 | 6 | const FrameTypeList = Object.values(FrameType); 7 | 8 | const FrameTypeValue: { 9 | [key in keyof typeof FrameType]: string; 10 | } = Object.fromEntries(Object.entries(FrameType).map(x => [x[0], x[1].value])) as any; 11 | 12 | export { 13 | FrameType, 14 | FrameTypeList, 15 | FrameTypeValue, 16 | }; 17 | -------------------------------------------------------------------------------- /jax-ui/src/constants/InitJson.ts: -------------------------------------------------------------------------------- 1 | export const StreamingJson = () => ({ 2 | pipelineName: `pipeline_${+new Date()}`, 3 | pipelineType: 'streaming', 4 | pipelineConfig: { 5 | jobs: [], 6 | edges: [], 7 | opts: {}, 8 | }, 9 | pipeDescription: null, 10 | clusterName: null, 11 | pipelineUi: {}, 12 | }); 13 | 14 | export const BatchJson = () => ({ 15 | pipelineName: `pipeline_${+new Date()}`, 16 | pipelineType: 'batch', 17 | pipelineConfig: { 18 | jobs: [], 19 | edges: [], 20 | opts: {}, 21 | }, 22 | pipeDescription: null, 23 | clusterName: null, 24 | pipelineUi: {}, 25 | }); 26 | -------------------------------------------------------------------------------- /jax-ui/src/constants/InternalStatus.ts: -------------------------------------------------------------------------------- 1 | export const InternalStatus = { 2 | WAITING_START: 'Waiting_start', 3 | STARTING: 'Starting', 4 | START_FAILED: 'Start_failed', 5 | 6 | WAITING_STOP: 'Waitting_stop', 7 | STOPPING: 'Stopping', 8 | STOP_FAILED: 'Stop_failed', 9 | STOPPED: 'Stopped', 10 | 11 | RESTARTING: 'Restarting', 12 | DELETING: 'Deleting', 13 | RUNNING: 'Running', 14 | FINISHED: 'Finished', 15 | FAILED: 'Failed', 16 | UNKNOWN: 'Unknown', 17 | NOT_FOUND: 'Not_Found', 18 | }; 19 | -------------------------------------------------------------------------------- /jax-ui/src/constants/JobRoleType.ts: -------------------------------------------------------------------------------- 1 | import source from '@/assets/images/source.svg'; 2 | import process from '@/assets/images/process.svg'; 3 | import sink from '@/assets/images/sink.svg'; 4 | 5 | const JobRoleType = Object.freeze({ 6 | source: { value: 'source', label: '输入', bgColor: '#B581E4' }, 7 | process: { value: 'process', label: '计算', bgColor: '#13A9FA' }, 8 | sink: { value: 'sink', label: '输出', bgColor: '#FE5AA8' }, 9 | share: { value: 'share', label: '分享', bgColor: '#FE5AA8' }, 10 | }); 11 | 12 | const JobRoleTypeValue: { 13 | [key in keyof typeof JobRoleType]: string; 14 | } = Object.fromEntries(Object.entries(JobRoleType).map(x => [x[0], x[1].value])) as any; 15 | 16 | const JobDefaultIcon = { 17 | source, 18 | process, 19 | sink, 20 | }; 21 | 22 | export { 23 | JobRoleType, 24 | JobRoleTypeValue, 25 | JobDefaultIcon, 26 | }; 27 | -------------------------------------------------------------------------------- /jax-ui/src/constants/PipelineStatus.ts: -------------------------------------------------------------------------------- 1 | export const PipelineStatus = { 2 | WAITING_START: '等待启动', 3 | STARTING: '启动中', 4 | START_FAILED: '启动失败', 5 | 6 | WAITING_STOP: '等待停止', 7 | STOPPING: '停止中', 8 | STOP_FAILED: '停止失败', 9 | STOPPED: '已停止', 10 | 11 | RESTARTING: '重启中', 12 | DELETING: '删除中', 13 | RUNNING: '运行中', 14 | FINISHED: '已完成', 15 | FAILED: '运行失败', 16 | UNKNOWN: '未知状态', 17 | 18 | DRAFT: '草稿', 19 | }; 20 | -------------------------------------------------------------------------------- /jax-ui/src/constants/PipelineType.ts: -------------------------------------------------------------------------------- 1 | export const PipelineType = Object.freeze({ 2 | streaming: '流处理', 3 | batch: '批处理', 4 | }); 5 | -------------------------------------------------------------------------------- /jax-ui/src/constants/UserRole.ts: -------------------------------------------------------------------------------- 1 | export const UserRole = Object.freeze({ 2 | superAdmin: { label: '管理员', value: 'SA' }, 3 | user: { label: '普通用户', value: 'U' }, 4 | }); 5 | 6 | export const UserRoleList = Object.values(UserRole); 7 | 8 | export const UserRoleValue: { 9 | [key in keyof typeof UserRole]: string; 10 | } = Object.fromEntries(Object.entries(UserRole).map(([key, { value }]) => [key, value])) as any; 11 | -------------------------------------------------------------------------------- /jax-ui/src/constants/WorkStatus.ts: -------------------------------------------------------------------------------- 1 | export const WorkStatus = { 2 | Suspended : '挂起', 3 | Scaling : '分配中', 4 | Running : '运行中', 5 | Starting : '启动中', 6 | Ready : '草稿', 7 | StartSubmitting : '提交中', 8 | restartStopping : '重启中', 9 | Destroying : '删除中', 10 | Stopped : '停止', 11 | Failed : '失败', 12 | StartFailed : '启动失败', 13 | Connecting : '重连中', 14 | LoseConnect : '连接丢失', 15 | }; 16 | -------------------------------------------------------------------------------- /jax-ui/src/constants/index.ts: -------------------------------------------------------------------------------- 1 | export * from '@/common/constants'; 2 | 3 | export * from './ClusterType'; 4 | export * from './FinkDetectIdType'; 5 | export * from './FinkDiagnoseType'; 6 | export * from './FinkStatus'; 7 | export * from './FrameType'; 8 | export * from './InitJson'; 9 | export * from './InternalStatus'; 10 | export * from './JobRoleType'; 11 | export * from './MsgCode'; 12 | export * from './PipelineStatus'; 13 | export * from './PipelineType'; 14 | export * from './UserRole'; 15 | export * from './v1ApiPrefix'; 16 | export * from './WorkStatus'; 17 | -------------------------------------------------------------------------------- /jax-ui/src/constants/v1ApiPrefix.ts: -------------------------------------------------------------------------------- 1 | export const V1ApiPrefix = '/api/v1'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/directives/index.ts: -------------------------------------------------------------------------------- 1 | import '@/common/directives'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/helpers/index.ts: -------------------------------------------------------------------------------- 1 | export * from '@/common/helpers'; 2 | 3 | export * from './parseObjectJsonString'; 4 | export * from './truncateText'; 5 | export * from './websocket'; 6 | -------------------------------------------------------------------------------- /jax-ui/src/helpers/parseObjectJsonString.ts: -------------------------------------------------------------------------------- 1 | export function parseObjectJsonString(str: string): Record { 2 | if (!str) return null; 3 | try { 4 | const json = JSON.parse(str); 5 | if (Object.prototype.toString.call(json) === '[object Object]') { 6 | return json; 7 | } else { 8 | return null; 9 | } 10 | } catch { 11 | return null; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /jax-ui/src/helpers/truncateText.ts: -------------------------------------------------------------------------------- 1 | export function truncateText(text: string, maxWidth: number, fontSize = 12) { 2 | const ctx = ((fn: { context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D }) => { 3 | if (!fn.context) { 4 | try { 5 | const canvas = new OffscreenCanvas(0, 0); 6 | fn.context = canvas.getContext('2d'); 7 | } catch { 8 | const canvas = document.createElement('canvas'); 9 | fn.context = canvas.getContext('2d'); 10 | } 11 | fn.context.font = `san-serif ${fontSize}px`; 12 | } 13 | return fn.context; 14 | })(truncateText as any); 15 | 16 | if (ctx.measureText(text).width > maxWidth) { 17 | do { 18 | text = text.slice(0, -1); 19 | } while (ctx.measureText(text).width > maxWidth); 20 | return text + '…'; 21 | } else { 22 | return text; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /jax-ui/src/models/diagnosis.ts: -------------------------------------------------------------------------------- 1 | export interface DiagnosisModel { 2 | detects: DiagnosisDetect[]; 3 | } 4 | 5 | export interface DiagnosisDetect { 6 | detectId: string; 7 | status: string; 8 | errorMessage?: any; 9 | } 10 | -------------------------------------------------------------------------------- /jax-ui/src/models/global.ts: -------------------------------------------------------------------------------- 1 | export interface ItoaResponse { 2 | retCode: string; 3 | retMsg: string; 4 | entity: T; 5 | totalCount: number; 6 | aux?: string; 7 | [key: string]: any; 8 | } 9 | -------------------------------------------------------------------------------- /jax-ui/src/models/index.ts: -------------------------------------------------------------------------------- 1 | export * from './base'; 2 | export * from './cluster'; 3 | export * from './diagnosis'; 4 | export * from './global'; 5 | export * from './root'; 6 | export * from './job'; 7 | export * from './jar'; 8 | export * from './job-dagre'; 9 | export * from './job-debug'; 10 | export * from './opts'; 11 | export * from './pipeline'; 12 | export * from './socket'; 13 | -------------------------------------------------------------------------------- /jax-ui/src/models/jar.ts: -------------------------------------------------------------------------------- 1 | import { BaseModel } from './base'; 2 | import { JobModel } from './job'; 3 | 4 | export interface JarModel extends BaseModel { 5 | jarName: string; 6 | jarPath?: string; 7 | jarVersion: string; 8 | jarFile: string; 9 | jarDescription: string; 10 | clusterName: string; 11 | jobList?: JobModel[]; 12 | } 13 | -------------------------------------------------------------------------------- /jax-ui/src/models/job-dagre.ts: -------------------------------------------------------------------------------- 1 | import type { Graph } from '@antv/g6'; 2 | 3 | import type { PipelineEdge, PipelineJob, PipelineModel } from './pipeline'; 4 | 5 | interface BaseField { 6 | isDebugModel: boolean; 7 | isStreaming?: boolean; 8 | } 9 | 10 | export interface JobDagreInitG6Event extends BaseField { 11 | graph: Graph; 12 | pipelineData: PipelineModel; 13 | } 14 | 15 | export interface JobDagreGetGraphData extends BaseField { 16 | nodes: PipelineJob[]; 17 | edges: PipelineEdge[]; 18 | pipelineUi: Record; 19 | } 20 | 21 | export interface JobDagreGetNodeItemConfig extends BaseField { 22 | nodeItemData: PipelineJob; 23 | jobUi: Record; 24 | } 25 | 26 | export interface JobDagreGetEdgeItemConfig extends BaseField { 27 | edgeItemData: PipelineEdge; 28 | nodes: PipelineJob[]; 29 | } 30 | -------------------------------------------------------------------------------- /jax-ui/src/models/job-debug.ts: -------------------------------------------------------------------------------- 1 | import { WebSocketData } from './socket'; 2 | 3 | // eslint-disable-next-line no-shadow 4 | export enum RunningLogType { 5 | success, 6 | error, 7 | } 8 | 9 | export interface JobDebugRunningLog { 10 | type: RunningLogType; 11 | message: string; 12 | id: number; 13 | display?: string; 14 | typeNumber?: number; 15 | } 16 | 17 | export interface ObserveDebugList extends WebSocketData { 18 | display: string; 19 | time: number; 20 | } 21 | -------------------------------------------------------------------------------- /jax-ui/src/models/job.ts: -------------------------------------------------------------------------------- 1 | import { JarModel } from './jar'; 2 | import { InType, PipelineParameterModel } from './base'; 3 | import { JobConfig } from './pipeline'; 4 | 5 | export interface JobModel { 6 | jobName: string; 7 | jobType: string; 8 | jobMeta: JobMeta; 9 | jarName: string; 10 | jobRole: string; 11 | internal: boolean | null; 12 | jar: JarModel; 13 | iconUrl: string | null; 14 | docUrl: string | null; 15 | hasDoc: boolean; 16 | jobConfig?: JobConfig; 17 | } 18 | 19 | interface JobMeta { 20 | inTypes?: InType[]; 21 | outTypes?: InType[]; 22 | jobInfo: JobInfo; 23 | parameters: { 24 | parameters: PipelineParameterModel[]; 25 | }; 26 | } 27 | 28 | interface JobInfo { 29 | name: string; 30 | type: string; 31 | display: string; 32 | description: string; 33 | apiVersion: number; 34 | } 35 | -------------------------------------------------------------------------------- /jax-ui/src/models/opts.ts: -------------------------------------------------------------------------------- 1 | export interface OptsModel { 2 | sparkOptsName?: string; 3 | flinkOptsName?: string; 4 | optsName: string; 5 | optsDescription: string; 6 | entryJar: string; 7 | entryClass: string; 8 | jobLib: string; 9 | home: string; 10 | version: string; 11 | yarnQueue?: any; 12 | driverMemory: string; 13 | executorMemory: string; 14 | driverCores: number; 15 | executorCores: number; 16 | numExecutors: number; 17 | optsList: OptsListItem[]; 18 | otherStartArgs: any[]; 19 | createTime: number; 20 | createBy?: any; 21 | updateTime: number; 22 | updateBy?: any; 23 | optsType: string; 24 | } 25 | 26 | export interface AllOptsList { 27 | flinkOptsList: OptsListItem[]; 28 | sparkOptsList: OptsListItem[]; 29 | } 30 | 31 | export interface OptsListItem { 32 | name: string; 33 | type: string; 34 | value?: string[] | any[] | number | string; 35 | description: string; 36 | required: boolean; 37 | } 38 | -------------------------------------------------------------------------------- /jax-ui/src/models/root.ts: -------------------------------------------------------------------------------- 1 | import { RootBase } from '@/common/models'; 2 | 3 | export interface Root extends RootBase { 4 | userInfo: null; 5 | } 6 | -------------------------------------------------------------------------------- /jax-ui/src/models/socket.ts: -------------------------------------------------------------------------------- 1 | export interface WebSocketData { 2 | code: string; 3 | job_id?: string; 4 | slot?: string; 5 | message: any; 6 | } 7 | 8 | export interface WebSocketConfig { 9 | successCallback?: any; 10 | closeCallback?: any; 11 | errorCallback?: any; 12 | onMessageCallback: any; 13 | } 14 | -------------------------------------------------------------------------------- /jax-ui/src/services/index.ts: -------------------------------------------------------------------------------- 1 | export * from '@/common/services'; 2 | 3 | export * from './router'; 4 | -------------------------------------------------------------------------------- /jax-ui/src/views/home/index.ts: -------------------------------------------------------------------------------- 1 | export { HomeMain } from './main'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/home/main/home.vue: -------------------------------------------------------------------------------- 1 | 10 | 21 | 26 | -------------------------------------------------------------------------------- /jax-ui/src/views/home/main/index.ts: -------------------------------------------------------------------------------- 1 | export { default as HomeMain } from './home.vue'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/home/menu-list/index.ts: -------------------------------------------------------------------------------- 1 | export { default as MenuList } from './menu-list.vue'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/home/menu-list/menu-list.vue: -------------------------------------------------------------------------------- 1 | 8 | 30 | -------------------------------------------------------------------------------- /jax-ui/src/views/home/v-header/index.ts: -------------------------------------------------------------------------------- 1 | export { default as DefaultVHeader } from './v-header.vue'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/home/v-header/v-header.scss: -------------------------------------------------------------------------------- 1 | .v-default-header { 2 | background: #07002A; 3 | height: 42px; 4 | width: 100%; 5 | display: flex; 6 | color: white; 7 | user-select: none; 8 | border-bottom: 1px solid transparent; 9 | } 10 | 11 | .logo-box { 12 | width: 180px; 13 | margin-left: 15px; 14 | background: url("~@images/logo-w.svg") no-repeat center; 15 | background-size: contain; 16 | } 17 | -------------------------------------------------------------------------------- /jax-ui/src/views/home/v-header/v-header.vue: -------------------------------------------------------------------------------- 1 | 7 | 16 | 18 | -------------------------------------------------------------------------------- /jax-ui/src/views/system-manage/cluster-manage/components/cluster-card/cluster-card.scss: -------------------------------------------------------------------------------- 1 | .cluster-card { 2 | background: #FFFFFF; 3 | border: 1px solid #9AB4D3; 4 | box-shadow: 0 2px 8px 0 rgba(148,163,181,0.65); 5 | border-radius: 3px; 6 | width: 248px; 7 | height: 172px; 8 | } 9 | 10 | .header { 11 | height: 30px; 12 | background-color: #E7EDF3; 13 | 14 | .frame-type { 15 | background: #694AE2; 16 | border-radius: 0 3px 0 10px; 17 | width: 112px; 18 | height: 24px; 19 | line-height: 24px; 20 | } 21 | } 22 | 23 | .action { 24 | height: 35px; 25 | 26 | .default-icon { 27 | width: 40px; 28 | height: 35px; 29 | background: url('~@images/mark.svg'); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /jax-ui/src/views/system-manage/cluster-manage/components/cluster-card/index.ts: -------------------------------------------------------------------------------- 1 | export { default as ClusterCard } from './cluster-card'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/system-manage/cluster-manage/components/created-edit-modal/index.ts: -------------------------------------------------------------------------------- 1 | export { default as CreatedEditModal } from './created-edit-modal'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/system-manage/cluster-manage/components/index.ts: -------------------------------------------------------------------------------- 1 | export * from './cluster-card'; 2 | export * from './created-edit-modal'; 3 | -------------------------------------------------------------------------------- /jax-ui/src/views/system-manage/cluster-manage/index.ts: -------------------------------------------------------------------------------- 1 | export * from './main'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/system-manage/cluster-manage/main/index.ts: -------------------------------------------------------------------------------- 1 | export { default as ClusterManageMain } from './main'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/system-manage/frame-config/created-edit/components/config/config.ts: -------------------------------------------------------------------------------- 1 | import type { Form } from 'element-ui'; 2 | 3 | import { Component, Prop, Ref, VueComponentBase } from '@/common/VueComponentBase'; 4 | import type { OptsListItem } from '@/models'; 5 | 6 | @Component() 7 | export default class CeatedEditConfig extends VueComponentBase { 8 | @Prop() readonly configData: OptsListItem[]; 9 | @Prop({ default: false }) readonly disabled: boolean; 10 | 11 | @Ref() readonly Form: Form; 12 | 13 | async validate() { 14 | await this.Form.validate(); 15 | } 16 | 17 | get configFormData() { 18 | return Object.fromEntries(this.configData.map(x => [x.name, x.value])); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /jax-ui/src/views/system-manage/frame-config/created-edit/components/config/index.ts: -------------------------------------------------------------------------------- 1 | export { default as CeatedEditConfig } from './config'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/system-manage/frame-config/created-edit/components/index.ts: -------------------------------------------------------------------------------- 1 | export * from './config'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/system-manage/frame-config/created-edit/index.ts: -------------------------------------------------------------------------------- 1 | export { default as FrameConfigCreatedEdit } from './created-edit'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/system-manage/frame-config/index.ts: -------------------------------------------------------------------------------- 1 | export * from './created-edit'; 2 | export * from './main'; 3 | -------------------------------------------------------------------------------- /jax-ui/src/views/system-manage/frame-config/main/index.ts: -------------------------------------------------------------------------------- 1 | export { default as FrameConfigMain } from './main'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/system-manage/index.ts: -------------------------------------------------------------------------------- 1 | export * from './cluster-manage'; 2 | export * from './frame-config'; 3 | export * from './main'; 4 | -------------------------------------------------------------------------------- /jax-ui/src/views/system-manage/main/index.ts: -------------------------------------------------------------------------------- 1 | export { default as SystemManageMain } from './main.vue'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/system-manage/main/main.vue: -------------------------------------------------------------------------------- 1 | 10 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/advanced-config-modal/index.ts: -------------------------------------------------------------------------------- 1 | export { default as AdvancedConfigModal } from './advanced-config-modal'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/index.ts: -------------------------------------------------------------------------------- 1 | export * from './advanced-config-modal'; 2 | export * from './job-config-drawer'; 3 | export * from './job-dagre'; 4 | export * from './job-debug-drawer'; 5 | export * from './job-list'; 6 | export * from './json-modal'; 7 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-config-drawer/components/index.ts: -------------------------------------------------------------------------------- 1 | export * from './job-parameter'; 2 | export * from './save-job-share-modal'; 3 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-config-drawer/components/job-parameter/components/index.ts: -------------------------------------------------------------------------------- 1 | export * from './input-string'; 2 | export * from './map-list'; 3 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-config-drawer/components/job-parameter/components/input-string/index.ts: -------------------------------------------------------------------------------- 1 | export { default as InputString } from './input-string'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-config-drawer/components/job-parameter/components/map-list/index.ts: -------------------------------------------------------------------------------- 1 | export { default as MapList } from './map-list'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-config-drawer/components/job-parameter/components/map-list/map-list.ts: -------------------------------------------------------------------------------- 1 | import { Component, Prop, VueComponentBase } from '@/common/VueComponentBase'; 2 | import type { PipelineViewDataListModel } from '@/models'; 3 | 4 | @Component() 5 | export default class MapList extends VueComponentBase { 6 | @Prop() readonly viewDataMap: PipelineViewDataListModel[]; 7 | } 8 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-config-drawer/components/job-parameter/components/map-list/map-list.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-config-drawer/components/job-parameter/index.ts: -------------------------------------------------------------------------------- 1 | export { default as JobParameter } from './job-parameter'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-config-drawer/components/job-parameter/job-parameter.scss: -------------------------------------------------------------------------------- 1 | .el-form-item { 2 | margin-bottom: 0; 3 | padding-bottom: 16px; 4 | } 5 | 6 | ::v-deep .el-form-item__label { 7 | width: 100%; 8 | padding: 0; 9 | } 10 | 11 | ::v-deep .el-form-item__content { 12 | width: 100%; 13 | } 14 | 15 | ::v-deep .el-form-item__error { 16 | padding-left: 10px; 17 | } 18 | 19 | .label{ 20 | backface-visibility: hidden; 21 | transform: translate3d(0, 0, 0); 22 | line-height: 32px; 23 | } 24 | 25 | .rotate-90 { 26 | transform: rotate(90deg); 27 | } 28 | 29 | .object-box { 30 | position: absolute; 31 | right: 8px; 32 | top: 8px; 33 | } 34 | 35 | .list-box { 36 | border-bottom: 1px #E6E6E6 solid; 37 | padding-bottom: 0; 38 | } 39 | 40 | .complex-type { 41 | width: calc(100% - 10px); 42 | min-width: fit-content; 43 | } 44 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-config-drawer/components/save-job-share-modal/index.ts: -------------------------------------------------------------------------------- 1 | export { default as SaveJobShareModal } from './save-job-share-modal'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-config-drawer/components/save-job-share-modal/save-job-share-modal.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-config-drawer/index.ts: -------------------------------------------------------------------------------- 1 | export { default as JobConfigDrawer } from './job-config-drawer'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-dagre/config/utils.ts: -------------------------------------------------------------------------------- 1 | 2 | export const AnchorTypes = { 3 | input: 0, 4 | output: 1, 5 | }; 6 | 7 | /** 8 | * 随机生成新id 9 | * 10 | * @param name 节点名称 11 | */ 12 | export const setNewId = function(name = '') { 13 | return name + Date.now() + Math.floor(Math.random() * 100000); 14 | }; 15 | 16 | /** 17 | * 获取节点名称 18 | * 19 | * @param str 节点名称 20 | */ 21 | export const getNodeName = function(str: string) { 22 | const idx = str.lastIndexOf('.') + 1; 23 | if (idx >= 0) return str.slice(idx); 24 | return str; 25 | }; 26 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-dagre/index.ts: -------------------------------------------------------------------------------- 1 | export { default as JobDagre } from './job-dagre'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-debug-drawer/components/data-show/components/data-show-type/data-show-type.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 16 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-debug-drawer/components/data-show/components/data-show-type/index.ts: -------------------------------------------------------------------------------- 1 | export { default as DataShowType } from './data-show-type'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-debug-drawer/components/data-show/components/index.ts: -------------------------------------------------------------------------------- 1 | export * from './data-show-type'; 2 | export * from './table'; 3 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-debug-drawer/components/data-show/components/table/index.ts: -------------------------------------------------------------------------------- 1 | export { default as ObserveDebugTable } from './table'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-debug-drawer/components/data-show/components/table/table.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-debug-drawer/components/data-show/data-show.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 23 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-debug-drawer/components/data-show/index.ts: -------------------------------------------------------------------------------- 1 | export { default as DataShow } from './data-show'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-debug-drawer/components/index.ts: -------------------------------------------------------------------------------- 1 | export * from './observe-debug'; 2 | export * from './running-log'; 3 | export * from './simulate-inject'; 4 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-debug-drawer/components/observe-debug/index.ts: -------------------------------------------------------------------------------- 1 | export { default as ObserveDebug} from './observe-debug'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-debug-drawer/components/running-log/index.ts: -------------------------------------------------------------------------------- 1 | export { default as RunningLog } from './running-log'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-debug-drawer/components/running-log/running-log.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 19 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-debug-drawer/components/simulate-inject/index.ts: -------------------------------------------------------------------------------- 1 | export { default as SimulateInject } from './simulate-inject'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-debug-drawer/constants.ts: -------------------------------------------------------------------------------- 1 | export const IconType = { 2 | json: 0, 3 | table: 1, 4 | chart: 2, 5 | }; 6 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-debug-drawer/index.ts: -------------------------------------------------------------------------------- 1 | export { default as JobDebugDrawer } from './job-debug-drawer'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-debug-drawer/job-debug-drawer.scss: -------------------------------------------------------------------------------- 1 | .model { 2 | height: 30px; 3 | text-align: center; 4 | line-height: 30px; 5 | border: 1px #eee solid; 6 | border-radius: 2px; 7 | 8 | &.active { 9 | background-color: $primary-color; 10 | color: #fff; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-debug-drawer/utils.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 让滚动条到元素的最底部 3 | * 4 | * @param element 要控制的元素 5 | */ 6 | export const scrollToBottom = function(element: HTMLElement) { 7 | element.scrollTop = element.scrollHeight; 8 | }; 9 | 10 | /** 11 | * 获取不同数据量下的动画档位 12 | * 13 | * @param dataNum 数据量 14 | */ 15 | export const getAnimationGears = function(dataNum) { 16 | const maxNum = 50; 17 | if (dataNum <= Math.ceil(maxNum * 0.33)) return 1; 18 | if (dataNum <= Math.ceil(maxNum * 0.66)) return 2; 19 | if (dataNum <= maxNum) return 3; 20 | }; 21 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/job-list/index.ts: -------------------------------------------------------------------------------- 1 | export { default as JobList } from './job-list'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/json-modal/index.ts: -------------------------------------------------------------------------------- 1 | export { default as JsonModal } from './json-modal'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/config/componemts/json-modal/json-modal.vue: -------------------------------------------------------------------------------- 1 | 9 | 9 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/list/components/import-error-modal/index.ts: -------------------------------------------------------------------------------- 1 | export { default as ImportErrorModal } from './import-error-modal'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/list/components/index.ts: -------------------------------------------------------------------------------- 1 | export * from './import-error-modal'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/list/index.ts: -------------------------------------------------------------------------------- 1 | export * from './main'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/list/main/index.ts: -------------------------------------------------------------------------------- 1 | export { default as WorkManageList } from './list'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/list/operation-log/index.ts: -------------------------------------------------------------------------------- 1 | export { default as OperationLog } from './operation-log'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/list/pipeline-status/index.ts: -------------------------------------------------------------------------------- 1 | export { default as PipelineStatus } from './pipeline-status'; 2 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/list/pipeline-status/pipeline-status.scss: -------------------------------------------------------------------------------- 1 | .pipeline-status { 2 | display: inline-block; 3 | font-size: 12px; 4 | width: 62px; 5 | text-align: center; 6 | border: 1px solid; 7 | border-radius: 2px; 8 | line-height: 1.5; 9 | 10 | &[data-value=WAITING_START], &[data-value=STARTING], &[data-value=RUNNING], &[data-value=RESTARTING], &[data-value=FINISHED] { 11 | color: #7EC42C; 12 | background: #F9F9F9; 13 | } 14 | 15 | &[data-value=WAITING_STOP], &[data-value=STOPPING], &[data-value=STOPPED], &[data-value=DELETING] { 16 | color: #F5A623; 17 | background: rgba(245,166,35,0.10); 18 | } 19 | 20 | &[data-value=START_FAILED], &[data-value=STOP_FAILED], &[data-value=FAILED] { 21 | color: #C82929; 22 | background: rgba(245,166,35,0.10); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/list/pipeline-status/pipeline-status.ts: -------------------------------------------------------------------------------- 1 | import { Component, Inreactive, Prop, VueComponentBase } from '@/common/VueComponentBase'; 2 | import { PipelineStatus } from '@/constants'; 3 | 4 | @Component() 5 | export default class PipelineStatusComponent extends VueComponentBase { 6 | @Prop() value: string; 7 | 8 | @Inreactive PipelineStatus = PipelineStatus; 9 | } 10 | -------------------------------------------------------------------------------- /jax-ui/src/views/work-manage/list/pipeline-status/pipeline-status.vue: -------------------------------------------------------------------------------- 1 | 5 |