You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@inlong.apache.org by do...@apache.org on 2023/04/10 06:04:51 UTC
[inlong] branch master updated: [INLONG-7792][Manager] Support export Excel template file of StreamSource (#7793)
This is an automated email from the ASF dual-hosted git repository.
dockerzhang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/inlong.git
The following commit(s) were added to refs/heads/master by this push:
new 0694b805c [INLONG-7792][Manager] Support export Excel template file of StreamSource (#7793)
0694b805c is described below
commit 0694b805cd27e2718b430213bebd89e3f4882aa0
Author: feat <fe...@outlook.com>
AuthorDate: Mon Apr 10 14:04:45 2023 +0800
[INLONG-7792][Manager] Support export Excel template file of StreamSource (#7793)
---
inlong-manager/manager-common/pom.xml | 9 +
.../common/tool/excel/ExcelCellDataTransfer.java | 84 ++++
.../manager/common/tool/excel/ExcelTool.java | 352 ++++++++++++++
.../common/tool/excel/annotation/ExcelEntity.java | 36 ++
.../common/tool/excel/annotation/ExcelField.java | 43 ++
.../inlong/manager/pojo/stream/StreamField.java | 10 +-
.../web/controller/InlongStreamController.java | 32 ++
licenses/inlong-manager/licenses/LICENSE-poi.txt | 537 +++++++++++++++++++++
licenses/inlong-manager/notices/NOTICE-poi.txt | 27 ++
pom.xml | 11 +
10 files changed, 1140 insertions(+), 1 deletion(-)
diff --git a/inlong-manager/manager-common/pom.xml b/inlong-manager/manager-common/pom.xml
index d609001a9..66cf73923 100644
--- a/inlong-manager/manager-common/pom.xml
+++ b/inlong-manager/manager-common/pom.xml
@@ -110,6 +110,15 @@
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
+ <!-- poi -->
+ <dependency>
+ <groupId>org.apache.poi</groupId>
+ <artifactId>poi</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.poi</groupId>
+ <artifactId>poi-ooxml</artifactId>
+ </dependency>
</dependencies>
</project>
diff --git a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/tool/excel/ExcelCellDataTransfer.java b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/tool/excel/ExcelCellDataTransfer.java
new file mode 100644
index 000000000..2ba3c3e2c
--- /dev/null
+++ b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/tool/excel/ExcelCellDataTransfer.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.inlong.manager.common.tool.excel;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public enum ExcelCellDataTransfer {
+
+ DATE {
+
+ final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+ String parse2Text(Object cellValue) {
+ if (cellValue == null) {
+ return null;
+ } else if (cellValue instanceof Date) {
+ Date date = (Date) cellValue;
+ return this.simpleDateFormat.format(date);
+ } else {
+ return String.valueOf(cellValue);
+ }
+ }
+
+ Object parseFromText(String cellValue) {
+ if (StringUtils.isNotBlank(cellValue)) {
+ Date date = null;
+ try {
+ date = this.simpleDateFormat.parse(cellValue);
+ } catch (ParseException e) {
+ LOGGER.error("Can not properly parse value in Date type: " + cellValue, e);
+ }
+ return date;
+ } else {
+ return cellValue;
+ }
+ }
+ },
+ NONE {
+
+ String parse2Text(Object o) {
+ return String.valueOf(o);
+ }
+
+ Object parseFromText(String s) {
+ return s;
+ }
+ };
+ protected static final Logger LOGGER = LoggerFactory.getLogger(ExcelCellDataTransfer.class);
+
+ private ExcelCellDataTransfer() {
+ }
+
+ /**
+ * Parse the given object to text.
+ */
+
+ abstract String parse2Text(Object o);
+
+ /**
+ * Parse the given text to object.
+ */
+ abstract Object parseFromText(String s);
+}
diff --git a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/tool/excel/ExcelTool.java b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/tool/excel/ExcelTool.java
new file mode 100644
index 000000000..b3fc3434c
--- /dev/null
+++ b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/tool/excel/ExcelTool.java
@@ -0,0 +1,352 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.inlong.manager.common.tool.excel;
+
+import lombok.Data;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.commons.lang3.tuple.Triple;
+import org.apache.inlong.manager.common.tool.excel.annotation.ExcelEntity;
+import org.apache.inlong.manager.common.tool.excel.annotation.ExcelField;
+import org.apache.inlong.manager.common.util.Preconditions;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.xssf.usermodel.XSSFCell;
+import org.apache.poi.xssf.usermodel.XSSFRichTextString;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.Serializable;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import static org.apache.inlong.manager.common.util.Preconditions.expectTrue;
+
+/**
+ * Utility class for working with Excel files.
+ */
+public class ExcelTool {
+
+ private ExcelTool() {
+
+ }
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ExcelTool.class);
+ private static final int DEFAULT_COLUMN_WIDTH = 10000;
+
+ /**
+ * Extracts the header row from a given class and returns it as a list of strings.
+ */
+ public static <E> List<String> extractHeader(Class<E> e1Class) {
+ List<String> list = new LinkedList<>();
+ Field[] fields = e1Class.getDeclaredFields();
+ if (fields.length > 0) {
+ for (Field field : fields) {
+ field.setAccessible(true);
+ ExcelField excel = field.getAnnotation(ExcelField.class);
+ if (excel != null) {
+ String excelName = excel.name();
+ list.add(excelName);
+ }
+ }
+ return !list.isEmpty() ? list : Collections.emptyList();
+ } else {
+ return Collections.emptyList();
+ }
+ }
+
+ /**
+ * Writes the given content to an Excel document.
+ *
+ * @param contents the list of contents to write
+ * @param out the output stream to write to
+ * @throws IOException if there is an error writing to the output stream
+ */
+ public static <T> void write(List<T> contents, OutputStream out) throws IOException {
+ Preconditions.expectNotEmpty(contents, "Content can not be empty!");
+ Class<?> clazz = contents.get(0).getClass();
+ List<Map<String, String>> maps = write2List(contents);
+ doWrite(maps, clazz, out);
+ }
+
+ public static <T> void doWrite(List<Map<String, String>> maps, Class<T> clazz, OutputStream out)
+ throws IOException {
+ List<String> heads = extractHeader(clazz);
+ if (heads.isEmpty()) {
+ throw new IllegalArgumentException(
+ "At least one field must be marked as Excel Field by annotation @ExcelField in class " + clazz);
+ }
+ try (XSSFWorkbook hwb = new XSSFWorkbook()) {
+ XSSFSheet sheet = hwb.createSheet("Sheet 1");
+
+ for (int index = 0; index < heads.size(); index++) {
+ sheet.setColumnWidth(index, DEFAULT_COLUMN_WIDTH);
+ }
+ fillSheetHeader(sheet.createRow(0), heads);
+ // Fill content if data exist.
+ if (CollectionUtils.isNotEmpty(maps)) {
+ fillSheetContent(sheet, heads, maps);
+ }
+
+ hwb.write(out);
+ }
+ out.close();
+ LOGGER.info("Database export succeeded");
+ }
+
+ /**
+ * Fills the output stream with the provided class meta.
+ */
+ public static <T> void write(Class<T> clazz, OutputStream out) throws IOException {
+ Preconditions.expectNotNull(clazz, "Class can not be empty!");
+ doWrite(null, clazz, out);
+ }
+
+ /**
+ * Fills the content rows of a given sheet with the provided content maps and headers.
+ */
+ private static void fillSheetContent(XSSFSheet sheet, List<String> heads, List<Map<String, String>> contents) {
+ Optional.ofNullable(contents)
+ .ifPresent(c -> IntStream.range(0, c.size())
+ .forEach(lineId -> {
+ Map<String, String> line = contents.get(lineId);
+ Row row = sheet.createRow(lineId + 1);
+ IntStream.range(0, heads.size()).forEach(colId -> {
+ String title = heads.get(colId);
+ String originValue = line.get(title);
+ String value = StringUtils.isNotBlank(originValue) ? originValue : "";
+ Cell cell = row.createCell(colId);
+ cell.setCellValue(value);
+ });
+ }));
+ }
+
+ private static void fillSheetHeader(XSSFRow row, List<String> heads) {
+ IntStream.range(0, heads.size()).forEach(index -> {
+ XSSFCell cell = row.createCell(index);
+ cell.setCellValue(new XSSFRichTextString(heads.get(index)));
+ });
+ }
+
+ /**
+ * Convert a list of objects to a list of maps, where each map represents an object's fields and values.
+ *
+ * @param objects The list of objects to be converted.
+ * @param <E> The type of the objects to be converted.
+ * @return A list of maps, where each map represents an object's fields and values.
+ */
+ public static <E> List<Map<String, String>> write2List(List<E> objects) {
+ E firstInstance = objects.get(0);
+ Class<?> firstClass = firstInstance.getClass();
+ Field[] fields = firstClass.getDeclaredFields();
+ expectTrue(fields.length > 0, "No method was found in the class '" + firstClass.getSimpleName() + "'");
+
+ List<Triple<Field, String, ExcelCellDataTransfer>> fieldMeta = Arrays.stream(fields).map(field -> {
+ field.setAccessible(true);
+ return Pair.of(field, field.getAnnotation(ExcelField.class));
+ }).filter(p -> p.getRight() != null)
+ .map(p -> Triple.of(p.getLeft(), p.getRight().name(), p.getRight().x2oTransfer()))
+ .collect(Collectors.toList());
+
+ return objects.stream()
+ .map(obj -> fieldMeta.stream().map(fm -> {
+ Object fieldValue;
+ try {
+ fieldValue = fm.getLeft().get(obj);
+ } catch (IllegalAccessException e) {
+ return null;
+ }
+ String value = fm.getRight().parse2Text(fieldValue);
+ String name = fm.getMiddle();
+ return Pair.of(name, value);
+ })
+ .filter(Objects::nonNull)
+ .collect(Collectors.toMap(Pair::getKey, Pair::getValue)))
+ .collect(Collectors.toList());
+ }
+
+ @Data
+ static class ClassFieldMeta implements Serializable {
+
+ /**
+ * The name of the field
+ */
+ private String name;
+
+ /**
+ * The name of the field in the Excel sheet
+ */
+ private String excelName;
+
+ /**
+ * The type of the field
+ */
+ private Class<?> fieldType;
+
+ /**
+ * The data transfer for the cell
+ */
+ private ExcelCellDataTransfer cellDataTransfer;
+
+ /**
+ * The field object
+ */
+ private transient Field filed;
+
+ /**
+ * The meta of class file.
+ */
+ public ClassFieldMeta() {
+ // build meta
+ }
+ }
+
+ /**
+ * The ClassMeta class represents the metadata of a class that is used to import data from an Excel sheet.
+ */
+ @Data
+ static class ClassMeta<T> {
+
+ /**
+ * The name of the class.
+ */
+ private String name;
+
+ /**
+ * The template class.
+ */
+ private Class<T> tClass;
+
+ /**
+ * The metadata of the fields in the class.
+ */
+ private List<ClassFieldMeta> classFieldMetas;
+
+ /**
+ * The mapping of field names to their metadata.
+ */
+ private Map<String, ClassFieldMeta> fieldNameMetaMap;
+
+ /**
+ * The mapping of Excel names to their metadata.
+ */
+ private Map<String, ClassFieldMeta> excelNameMetaMap;
+
+ /**
+ * Whether the fields have been sorted.
+ */
+ private boolean isSorted = false;
+
+ /**
+ * The mapping of positions to their metadata.
+ */
+ private Map<Integer, ClassFieldMeta> positionFieldMetaMap;
+
+ /**
+ * The method to set whether the Excel data is valid.
+ */
+ private Method excelDataValidMethod;
+
+ /**
+ * The method to set the validation information of the Excel data.
+ */
+ private Method excelDataValidateInfoMethod;
+
+ private ClassMeta() {
+ }
+
+ /**
+ * Create a ClassMeta object from a given template class.
+ */
+ public static <T> ClassMeta<T> of(Class<T> templateClass)
+ throws InstantiationException, IllegalAccessException, NoSuchMethodException {
+ ClassMeta<T> meta = new ClassMeta<>();
+ meta.setTClass(templateClass);
+ ExcelEntity excelEntity = templateClass.getAnnotation(ExcelEntity.class);
+ if (excelEntity != null) {
+ meta.name = excelEntity.name();
+ }
+
+ Field[] fields = templateClass.getDeclaredFields();
+ for (Field field : fields) {
+ ExcelField excelField = field.getAnnotation(ExcelField.class);
+ if (excelField != null) {
+ ExcelCellDataTransfer excelCellDataTransfer = excelField.x2oTransfer();
+ meta.addField(field.getName(), excelField.name(), field, field.getType(),
+ excelCellDataTransfer);
+ }
+ }
+
+ Method excelDataValid = templateClass.getMethod("setExcelDataValid", Boolean.TYPE);
+ Method excelDataValidateInfo = templateClass.getMethod("setExcelDataValidate", String.class);
+ meta.setExcelDataValidMethod(excelDataValid);
+ meta.setExcelDataValidateInfoMethod(excelDataValidateInfo);
+ return meta;
+ }
+
+ private void addField(String name, String excelName, Field field, Class<?> fieldType,
+ ExcelCellDataTransfer cellDataTransfer) {
+ if (this.classFieldMetas == null) {
+ this.classFieldMetas = new ArrayList<>();
+ }
+
+ if (this.excelNameMetaMap == null) {
+ this.excelNameMetaMap = new HashMap<>();
+ }
+
+ if (this.fieldNameMetaMap == null) {
+ this.fieldNameMetaMap = new HashMap<>();
+ }
+
+ ClassFieldMeta fieldMeta = new ClassFieldMeta();
+ fieldMeta.setName(name);
+ fieldMeta.setExcelName(excelName);
+ fieldMeta.setFieldType(fieldType);
+ fieldMeta.setCellDataTransfer(cellDataTransfer);
+ fieldMeta.setFiled(field);
+ this.fieldNameMetaMap.put(name, fieldMeta);
+ this.excelNameMetaMap.put(excelName, fieldMeta);
+ this.classFieldMetas.add(fieldMeta);
+ }
+
+ /**
+ * Get the metadata of a field at a given position.
+ */
+ public ClassFieldMeta field(int position) {
+ return this.positionFieldMetaMap.get(position);
+ }
+
+ }
+}
diff --git a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/tool/excel/annotation/ExcelEntity.java b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/tool/excel/annotation/ExcelEntity.java
new file mode 100644
index 000000000..2ef5a9d4a
--- /dev/null
+++ b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/tool/excel/annotation/ExcelEntity.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.inlong.manager.common.tool.excel.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Annotation for Excel entity
+ */
+@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ExcelEntity {
+
+ /**
+ * Name of the Excel entity
+ */
+ String name();
+}
diff --git a/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/tool/excel/annotation/ExcelField.java b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/tool/excel/annotation/ExcelField.java
new file mode 100644
index 000000000..3214504cb
--- /dev/null
+++ b/inlong-manager/manager-common/src/main/java/org/apache/inlong/manager/common/tool/excel/annotation/ExcelField.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.inlong.manager.common.tool.excel.annotation;
+
+import org.apache.inlong.manager.common.tool.excel.ExcelCellDataTransfer;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Annotation for Excel field
+ */
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ExcelField {
+
+ /**
+ * Name of the field in Excel
+ */
+ String name();
+
+ /**
+ * Data transfer method from Excel to Object
+ */
+ ExcelCellDataTransfer x2oTransfer() default ExcelCellDataTransfer.NONE;
+}
diff --git a/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/StreamField.java b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/StreamField.java
index fd86362da..45a8c06c6 100644
--- a/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/StreamField.java
+++ b/inlong-manager/manager-pojo/src/main/java/org/apache/inlong/manager/pojo/stream/StreamField.java
@@ -23,6 +23,10 @@ import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
+import org.apache.inlong.manager.common.tool.excel.annotation.ExcelEntity;
+import org.apache.inlong.manager.common.tool.excel.annotation.ExcelField;
+
+import java.io.Serializable;
/**
* Stream filed, including field name, field type, etc.
@@ -32,7 +36,8 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("Stream field configuration")
-public class StreamField {
+@ExcelEntity(name = "StreamField excel template")
+public class StreamField implements Serializable {
@ApiModelProperty("Field index")
private Integer id;
@@ -43,12 +48,15 @@ public class StreamField {
@ApiModelProperty(value = "inlong stream id", required = true)
private String inlongStreamId;
+ @ExcelField(name = "Field name")
@ApiModelProperty(value = "Field name", required = true)
private String fieldName;
+ @ExcelField(name = "Field type")
@ApiModelProperty(value = "Field type", required = true)
private String fieldType;
+ @ExcelField(name = "Field comment")
@ApiModelProperty("Field comment")
private String fieldComment;
diff --git a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongStreamController.java b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongStreamController.java
index ba39c6510..3e41371ff 100644
--- a/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongStreamController.java
+++ b/inlong-manager/manager-web/src/main/java/org/apache/inlong/manager/web/controller/InlongStreamController.java
@@ -22,7 +22,12 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpHeaders;
+import org.apache.inlong.manager.common.enums.ErrorCodeEnum;
import org.apache.inlong.manager.common.enums.OperationType;
+import org.apache.inlong.manager.common.exceptions.BusinessException;
+import org.apache.inlong.manager.common.tool.excel.ExcelTool;
import org.apache.inlong.manager.common.validation.UpdateValidation;
import org.apache.inlong.manager.pojo.common.PageResult;
import org.apache.inlong.manager.pojo.common.Response;
@@ -38,6 +43,7 @@ import org.apache.inlong.manager.service.stream.InlongStreamProcessService;
import org.apache.inlong.manager.service.stream.InlongStreamService;
import org.apache.inlong.manager.service.user.LoginUserUtils;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
@@ -46,11 +52,17 @@ import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
import java.util.List;
/**
* Inlong stream control layer
*/
+@Slf4j
@RestController
@RequestMapping("/api")
@Api(tags = "Inlong-Stream-API")
@@ -183,4 +195,24 @@ public class InlongStreamController {
return Response.success(streamService.parseFields(parseFieldRequest));
}
+ @RequestMapping(value = "/stream/fieldsImportTemplate", method = RequestMethod.GET, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
+ @ApiOperation(value = "Download fields import template", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
+ public void downloadFieldsImportTemplate(HttpServletResponse response) {
+ String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd-HHmmss"));
+ String fileName = String.format("InLong-stream-fields-template-%s.xlsx", date);
+ response.setHeader("Content-Disposition",
+ "attachment;filename=" + fileName);
+ response.setHeader(HttpHeaders.CONTENT_TYPE,
+ "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+
+ try {
+ ServletOutputStream outputStream = response.getOutputStream();
+ ExcelTool.write(StreamField.class, outputStream);
+ } catch (IOException e) {
+ log.error("Can not properly download Excel file", e);
+ throw new BusinessException(ErrorCodeEnum.INVALID_PARAMETER,
+ String.format("can not properly download template file: %s", e.getMessage()));
+ }
+ }
+
}
diff --git a/licenses/inlong-manager/licenses/LICENSE-poi.txt b/licenses/inlong-manager/licenses/LICENSE-poi.txt
new file mode 100644
index 000000000..f86de8779
--- /dev/null
+++ b/licenses/inlong-manager/licenses/LICENSE-poi.txt
@@ -0,0 +1,537 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+
+APACHE POI SUBCOMPONENTS:
+
+Apache POI includes subcomponents with separate copyright notices and
+license terms. Your use of these subcomponents is subject to the terms
+and conditions of the following licenses:
+
+
+Office Open XML schemas (ooxml-schemas-1.*.jar)
+
+ The Office Open XML schema definitions used by Apache POI are
+ a part of the Office Open XML ECMA Specification (ECMA-376, [1]).
+ As defined in section 9.4 of the ECMA bylaws [2], this specification
+ is available to all interested parties without restriction:
+
+ 9.4 All documents when approved shall be made available to
+ all interested parties without restriction.
+
+ Furthermore, both Microsoft and Adobe have granted patent licenses
+ to this work [3,4,5].
+
+ [1] http://www.ecma-international.org/publications/standards/Ecma-376.htm
+ [2] http://www.ecma-international.org/memento/Ecmabylaws.htm
+ [3] http://www.microsoft.com/openspecifications/en/us/programs/osp/default.aspx
+ [4] http://www.ecma-international.org/publications/files/ECMA-ST/Ecma%20PATENT/
+ Patent%20statements%20ok/ECMA-376%20Edition%202%20Microsoft%20Patent%20Declaration.pdf
+ [5] http://www.ecma-international.org/publications/files/ECMA-ST/Ecma%20PATENT/
+ Patent%20statements%20ok/ECMA-376%20Adobe%20Patent%20Declaration.pdf
+
+
+Bouncy Castle library (bcprov-*.jar, bcpg-*.jar, bcpkix-*.jar)
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to
+ deal in the Software without restriction, including without limitation the
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ IN THE SOFTWARE.
+
+JUnit test library (junit-4.*.jar) & JaCoCo (*jacoco*)
+
+ Eclipse Public License - v 1.0
+
+ THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC
+ LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
+ CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
+
+ 1. DEFINITIONS
+
+ "Contribution" means:
+
+ a) in the case of the initial Contributor, the initial code and documentation
+ distributed under this Agreement, and
+ b) in the case of each subsequent Contributor:
+ i) changes to the Program, and
+ ii) additions to the Program;
+ where such changes and/or additions to the Program originate from and are
+ distributed by that particular Contributor. A Contribution 'originates' from
+ a Contributor if it was added to the Program by such Contributor itself or
+ anyone acting on such Contributor's behalf. Contributions do not include
+ additions to the Program which: (i) are separate modules of software
+ distributed in conjunction with the Program under their own license agreement,
+ and (ii) are not derivative works of the Program.
+
+ "Contributor" means any person or entity that distributes the Program.
+
+ "Licensed Patents" mean patent claims licensable by a Contributor which are
+ necessarily infringed by the use or sale of its Contribution alone or when
+ combined with the Program.
+
+ "Program" means the Contributions distributed in accordance with this Agreement.
+
+ "Recipient" means anyone who receives the Program under this Agreement,
+ including all Contributors.
+
+ 2. GRANT OF RIGHTS
+
+ a) Subject to the terms of this Agreement, each Contributor hereby grants
+ Recipient a non-exclusive, worldwide, royalty-free copyright license to
+ reproduce, prepare derivative works of, publicly display, publicly
+ perform, distribute and sublicense the Contribution of such Contributor,
+ if any, and such derivative works, in source code and object code form.
+ b) Subject to the terms of this Agreement, each Contributor hereby grants
+ Recipient a non-exclusive, worldwide, royalty-free patent license under
+ Licensed Patents to make, use, sell, offer to sell, import and otherwise
+ transfer the Contribution of such Contributor, if any, in source code
+ and object code form. This patent license shall apply to the combination
+ of the Contribution and the Program if, at the time the Contribution is
+ added by the Contributor, such addition of the Contribution causes such
+ combination to be covered by the Licensed Patents. The patent license
+ shall not apply to any other combinations which include the Contribution.
+ No hardware per se is licensed hereunder.
+ c) Recipient understands that although each Contributor grants the licenses
+ to its Contributions set forth herein, no assurances are provided by any
+ Contributor that the Program does not infringe the patent or other
+ intellectual property rights of any other entity. Each Contributor
+ disclaims any liability to Recipient for claims brought by any other
+ entity based on infringement of intellectual property rights or
+ otherwise. As a condition to exercising the rights and licenses granted
+ hereunder, each Recipient hereby assumes sole responsibility to secure
+ any other intellectual property rights needed, if any. For example, if
+ a third party patent license is required to allow Recipient to distribute
+ the Program, it is Recipient's responsibility to acquire that license
+ before distributing the Program.
+ d) Each Contributor represents that to its knowledge it has sufficient
+ copyright rights in its Contribution, if any, to grant the copyright
+ license set forth in this Agreement.
+
+ 3. REQUIREMENTS
+
+ A Contributor may choose to distribute the Program in object code form under
+ its own license agreement, provided that:
+
+ a) it complies with the terms and conditions of this Agreement; and
+ b) its license agreement:
+ i) effectively disclaims on behalf of all Contributors all warranties and
+ conditions, express and implied, including warranties or conditions of
+ title and non-infringement, and implied warranties or conditions of
+ merchantability and fitness for a particular purpose;
+ ii) effectively excludes on behalf of all Contributors all liability for
+ damages, including direct, indirect, special, incidental and
+ consequential damages, such as lost profits;
+ iii) states that any provisions which differ from this Agreement are
+ offered by that Contributor alone and not by any other party; and
+ iv) states that source code for the Program is available from such
+ Contributor, and informs licensees how to obtain it in a reasonable
+ manner on or through a medium customarily used for software exchange.
+
+ When the Program is made available in source code form:
+
+ a) it must be made available under this Agreement; and
+ b) a copy of this Agreement must be included with each copy of the Program.
+ Contributors may not remove or alter any copyright notices contained
+ within the Program.
+
+ Each Contributor must identify itself as the originator of its Contribution,
+ if any, in a manner that reasonably allows subsequent Recipients to identify
+ the originator of the Contribution.
+
+ 4. COMMERCIAL DISTRIBUTION
+
+ Commercial distributors of software may accept certain responsibilities with
+ respect to end users, business partners and the like. While this license is
+ intended to facilitate the commercial use of the Program, the Contributor
+ who includes the Program in a commercial product offering should do so in a
+ manner which does not create potential liability for other Contributors.
+ Therefore, if a Contributor includes the Program in a commercial product
+ offering, such Contributor ("Commercial Contributor") hereby agrees to
+ defend and indemnify every other Contributor ("Indemnified Contributor")
+ against any losses, damages and costs (collectively "Losses") arising from
+ claims, lawsuits and other legal actions brought by a third party against
+ the Indemnified Contributor to the extent caused by the acts or omissions
+ of such Commercial Contributor in connection with its distribution of the
+ Program in a commercial product offering. The obligations in this section
+ do not apply to any claims or Losses relating to any actual or alleged
+ intellectual property infringement. In order to qualify, an Indemnified
+ Contributor must: a) promptly notify the Commercial Contributor in writing
+ of such claim, and b) allow the Commercial Contributor to control, and
+ cooperate with the Commercial Contributor in, the defense and any related
+ settlement negotiations. The Indemnified Contributor may participate in any
+ such claim at its own expense.
+
+ For example, a Contributor might include the Program in a commercial product
+ offering, Product X. That Contributor is then a Commercial Contributor. If
+ that Commercial Contributor then makes performance claims, or offers
+ warranties related to Product X, those performance claims and warranties are
+ such Commercial Contributor's responsibility alone. Under this section, the
+ Commercial Contributor would have to defend claims against the other
+ Contributors related to those performance claims and warranties, and if a
+ court requires any other Contributor to pay any damages as a result, the
+ Commercial Contributor must pay those damages.
+
+ 5. NO WARRANTY
+
+ EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON
+ AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER
+ EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR
+ CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A
+ PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the
+ appropriateness of using and distributing the Program and assumes all risks
+ associated with its exercise of rights under this Agreement , including but
+ not limited to the risks and costs of program errors, compliance with
+ applicable laws, damage to or loss of data, programs or equipment, and
+ unavailability or interruption of operations.
+
+ 6. DISCLAIMER OF LIABILITY
+
+ EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY
+ CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION
+ LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
+ EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY
+ OF SUCH DAMAGES.
+
+ 7. GENERAL
+
+ If any provision of this Agreement is invalid or unenforceable under
+ applicable law, it shall not affect the validity or enforceability of the
+ remainder of the terms of this Agreement, and without further action by the
+ parties hereto, such provision shall be reformed to the minimum extent
+ necessary to make such provision valid and enforceable.
+
+ If Recipient institutes patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Program itself
+ (excluding combinations of the Program with other software or hardware)
+ infringes such Recipient's patent(s), then such Recipient's rights granted
+ under Section 2(b) shall terminate as of the date such litigation is filed.
+
+ All Recipient's rights under this Agreement shall terminate if it fails to
+ comply with any of the material terms or conditions of this Agreement and
+ does not cure such failure in a reasonable period of time after becoming
+ aware of such noncompliance. If all Recipient's rights under this Agreement
+ terminate, Recipient agrees to cease use and distribution of the Program as
+ soon as reasonably practicable. However, Recipient's obligations under this
+ Agreement and any licenses granted by Recipient relating to the Program
+ shall continue and survive.
+
+ Everyone is permitted to copy and distribute copies of this Agreement, but
+ in order to avoid inconsistency the Agreement is copyrighted and may only
+ be modified in the following manner. The Agreement Steward reserves the
+ right to publish new versions (including revisions) of this Agreement from
+ time to time. No one other than the Agreement Steward has the right to
+ modify this Agreement. The Eclipse Foundation is the initial Agreement
+ Steward. The Eclipse Foundation may assign the responsibility to serve as
+ the Agreement Steward to a suitable separate entity. Each new version of
+ the Agreement will be given a distinguishing version number. The Program
+ (including Contributions) may always be distributed subject to the version
+ of the Agreement under which it was received. In addition, after a new
+ version of the Agreement is published, Contributor may elect to distribute
+ the Program (including its Contributions) under the new version. Except as
+ expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+ rights or licenses to the intellectual property of any Contributor under
+ this Agreement, whether expressly, by implication, estoppel or otherwise.
+ All rights in the Program not expressly granted under this Agreement are
+ reserved.
+
+ This Agreement is governed by the laws of the State of New York and the
+ intellectual property laws of the United States of America. No party to this
+ Agreement will bring a legal action under this Agreement more than one year
+ after the cause of action arose. Each party waives its rights to a jury
+ trial in any resulting litigation.
+
+Hamcrest library (hamcrest-*.jar) & CuvesAPI / Curve API
+
+ BSD License
+
+ Copyright (c) 2000-2006, www.hamcrest.org
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer. Redistributions in binary
+ form must reproduce the above copyright notice, this list of conditions and
+ the following disclaimer in the documentation and/or other materials
+ provided with the distribution.
+
+ Neither the name of Hamcrest nor the names of its contributors may be used
+ to endorse or promote products derived from this software without specific
+ prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+SLF4J library (slf4j-api-*.jar)
+
+ Copyright (c) 2004-2013 QOS.ch
+ All rights reserved.
+
+ Permission is hereby granted, free of charge, to any person obtaining
+ a copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+inbot-utils (https://github.com/Inbot/inbot-utils)
+
+ The MIT License (MIT)
+
+ Copyright (c) 2015 Inbot
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
\ No newline at end of file
diff --git a/licenses/inlong-manager/notices/NOTICE-poi.txt b/licenses/inlong-manager/notices/NOTICE-poi.txt
new file mode 100644
index 000000000..f35157177
--- /dev/null
+++ b/licenses/inlong-manager/notices/NOTICE-poi.txt
@@ -0,0 +1,27 @@
+Apache POI
+Copyright 2003-2017 The Apache Software Foundation
+
+This product includes software developed by
+The Apache Software Foundation (https://www.apache.org/).
+
+This product contains parts that were originally based on software from BEA.
+Copyright (c) 2000-2003, BEA Systems, <http://www.bea.com/> (dead link),
+which was acquired by Oracle Corporation in 2008.
+<http://www.oracle.com/us/corporate/Acquisitions/bea/index.html>
+<https://en.wikipedia.org/wiki/BEA_Systems>
+
+This product contains W3C XML Schema documents. Copyright 2001-2003 (c)
+World Wide Web Consortium (Massachusetts Institute of Technology, European
+Research Consortium for Informatics and Mathematics, Keio University)
+
+This product contains the Piccolo XML Parser for Java
+(http://piccolo.sourceforge.net/). Copyright 2002 Yuval Oren.
+
+This product contains the chunks_parse_cmds.tbl file from the vsdump program.
+Copyright (C) 2006-2007 Valek Filippov (frob@df.ru)
+
+This product contains parts of the eID Applet project
+<http://eid-applet.googlecode.com> and <https://github.com/e-Contract/eid-applet>.
+Copyright (c) 2009-2014
+FedICT (federal ICT department of Belgium), e-Contract.be BVBA (https://www.e-contract.be),
+Bart Hanssens from FedICT
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 98199c159..7ed289766 100644
--- a/pom.xml
+++ b/pom.xml
@@ -207,6 +207,7 @@
<kudu.version>1.16.0</kudu.version>
<tomcat.version>8.5.53</tomcat.version>
<jedis.version>2.9.0</jedis.version>
+ <poi.version>3.16</poi.version>
</properties>
<dependencyManagement>
@@ -1546,6 +1547,16 @@
<artifactId>kubernetes-client</artifactId>
<version>${kubernetes.client.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.poi</groupId>
+ <artifactId>poi</artifactId>
+ <version>${poi.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.poi</groupId>
+ <artifactId>poi-ooxml</artifactId>
+ <version>${poi.version}</version>
+ </dependency>
</dependencies>
</dependencyManagement>