blob: 90160499dbc910d074bf15e6b2990709d19d5525 [file] [log] [blame]
/*
* Copyright 2019 WeBank
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.webank.wedatasphere.linkis.filesystem.restful.api;
import com.webank.wedatasphere.linkis.common.io.FsPath;
import com.webank.wedatasphere.linkis.common.io.FsWriter;
import com.webank.wedatasphere.linkis.common.io.MetaData;
import com.webank.wedatasphere.linkis.common.io.Record;
import com.webank.wedatasphere.linkis.common.io.resultset.ResultSet;
import com.webank.wedatasphere.linkis.filesystem.entity.DirFileTree;
import com.webank.wedatasphere.linkis.filesystem.entity.LogLevel;
import com.webank.wedatasphere.linkis.filesystem.exception.WorkSpaceException;
import com.webank.wedatasphere.linkis.filesystem.exception.WorkspaceExceptionManager;
import com.webank.wedatasphere.linkis.filesystem.service.FsService;
import com.webank.wedatasphere.linkis.filesystem.util.WorkspaceUtil;
import com.webank.wedatasphere.linkis.filesystem.validator.PathValidator$;
import com.webank.wedatasphere.linkis.server.Message;
import com.webank.wedatasphere.linkis.server.security.SecurityFilter;
import com.webank.wedatasphere.linkis.storage.LineMetaData;
import com.webank.wedatasphere.linkis.storage.LineRecord;
import com.webank.wedatasphere.linkis.storage.csv.CSVFsWriter;
import com.webank.wedatasphere.linkis.storage.domain.FsPathListWithError;
import com.webank.wedatasphere.linkis.storage.excel.ExcelFsWriter;
import com.webank.wedatasphere.linkis.storage.excel.ExcelStorageReader;
import com.webank.wedatasphere.linkis.storage.fs.FileSystem;
import com.webank.wedatasphere.linkis.storage.resultset.ResultSetFactory;
import com.webank.wedatasphere.linkis.storage.resultset.ResultSetFactory$;
import com.webank.wedatasphere.linkis.storage.resultset.ResultSetReader;
import com.webank.wedatasphere.linkis.storage.resultset.table.TableMetaData;
import com.webank.wedatasphere.linkis.storage.resultset.table.TableRecord;
import com.webank.wedatasphere.linkis.storage.script.*;
import com.webank.wedatasphere.linkis.storage.source.FileSource;
import com.webank.wedatasphere.linkis.storage.source.FileSource$;
import com.webank.wedatasphere.linkis.storage.utils.StorageUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.math3.util.Pair;
import org.apache.http.Consts;
import org.codehaus.jackson.JsonNode;
import org.glassfish.jersey.media.multipart.FormDataBodyPart;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataMultiPart;
import org.glassfish.jersey.media.multipart.FormDataParam;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestBody;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;
import static com.webank.wedatasphere.linkis.filesystem.conf.WorkSpaceConfiguration.*;
import static com.webank.wedatasphere.linkis.filesystem.constant.WorkSpaceConstants.*;
/**
* johnnwang
* 2018/10/25
*/
@Produces(MediaType.APPLICATION_JSON)
@Consumes({MediaType.APPLICATION_JSON, MediaType.MULTIPART_FORM_DATA})
@Component
@Path("filesystem")
public class FsRestfulApi {
@Autowired
private FsService fsService;
private final Logger LOGGER = LoggerFactory.getLogger(getClass());
@GET
@Path("/getUserRootPath")
public Response getUserRootPath(@Context HttpServletRequest req, @QueryParam("pathType") String pathType) throws IOException, WorkSpaceException {
String userName = SecurityFilter.getLoginUsername(req);
String hdfsUserRootPathPrefix = WorkspaceUtil.suffixTuning(HDFS_USER_ROOT_PATH_PREFIX.getValue());
String hdfsUserRootPathSuffix = HDFS_USER_ROOT_PATH_SUFFIX.getValue();
String localUserRootPath = WorkspaceUtil.suffixTuning(LOCAL_USER_ROOT_PATH.getValue());
String path;
String returnType;
if (StorageUtils.HDFS().equalsIgnoreCase(pathType)) {
path = hdfsUserRootPathPrefix + userName + hdfsUserRootPathSuffix;
returnType = StorageUtils.HDFS().toUpperCase();
} else {
path = localUserRootPath + userName;
returnType = LOCAL_RETURN_TYPE;
}
FsPath fsPath = new FsPath(path);
FileSystem fileSystem = fsService.getFileSystem(userName, fsPath);
if (!fileSystem.exists(fsPath)) {
throw WorkspaceExceptionManager.createException(80003);
}
return Message.messageToResponse(Message.ok().data(String.format("user%sRootPath", returnType), path));
}
@POST
@Path("/createNewDir")
public Response createNewDir(@Context HttpServletRequest req, JsonNode json) throws IOException, WorkSpaceException {
String userName = SecurityFilter.getLoginUsername(req);
String path = json.get("path").getTextValue();
if (StringUtils.isEmpty(path)) {
throw WorkspaceExceptionManager.createException(80004, path);
}
WorkspaceUtil.fileAndDirNameSpecialCharCheck(path);
FsPath fsPath = new FsPath(path);
FileSystem fileSystem = fsService.getFileSystem(userName, fsPath);
if (fileSystem.exists(fsPath)) {
throw WorkspaceExceptionManager.createException(80005);
}
fileSystem.mkdirs(fsPath);
return Message.messageToResponse(Message.ok());
}
@POST
@Path("/createNewFile")
public Response createNewFile(@Context HttpServletRequest req, JsonNode json) throws IOException, WorkSpaceException {
String userName = SecurityFilter.getLoginUsername(req);
String path = json.get("path").getTextValue();
if (StringUtils.isEmpty(path)) {
throw WorkspaceExceptionManager.createException(80004, path);
}
WorkspaceUtil.fileAndDirNameSpecialCharCheck(path);
FsPath fsPath = new FsPath(path);
FileSystem fileSystem = fsService.getFileSystem(userName, fsPath);
if (fileSystem.exists(fsPath)) {
throw WorkspaceExceptionManager.createException(80006);
}
fileSystem.createNewFile(fsPath);
return Message.messageToResponse(Message.ok());
}
@POST
@Path("/rename")
public Response rename(@Context HttpServletRequest req, JsonNode json) throws IOException, WorkSpaceException {
String oldDest = json.get("oldDest").getTextValue();
String newDest = json.get("newDest").getTextValue();
String userName = SecurityFilter.getLoginUsername(req);
if (FILESYSTEM_PATH_CHECK_TRIGGER.getValue()) {
LOGGER.info(String.format("path check trigger is open,now check the path,oldDest:%s,newDest:%s", oldDest, newDest));
PathValidator$.MODULE$.validate(oldDest, userName);
PathValidator$.MODULE$.validate(newDest, userName);
}
if (StringUtils.isEmpty(oldDest)) {
throw WorkspaceExceptionManager.createException(80004, oldDest);
}
if (StringUtils.isEmpty(newDest)) {
//No change in file name(文件名字无变化)
return Message.messageToResponse(Message.ok());
}
WorkspaceUtil.fileAndDirNameSpecialCharCheck(newDest);
FsPath fsPathOld = new FsPath(oldDest);
FsPath fsPathNew = new FsPath(newDest);
FileSystem fileSystem = fsService.getFileSystem(userName, fsPathOld);
if (fileSystem.exists(fsPathNew)) {
throw WorkspaceExceptionManager.createException(80007);
}
fileSystem.renameTo(fsPathOld, fsPathNew);
return Message.messageToResponse(Message.ok());
}
@POST
@Path("/upload")
public Response upload(@Context HttpServletRequest req,
@FormDataParam("path") String path,
FormDataMultiPart form) throws IOException, WorkSpaceException {
String userName = SecurityFilter.getLoginUsername(req);
if (StringUtils.isEmpty(path)) {
throw WorkspaceExceptionManager.createException(80004, path);
}
FsPath fsPath = new FsPath(path);
FileSystem fileSystem = fsService.getFileSystem(userName, fsPath);
List<FormDataBodyPart> files = form.getFields("file");
for (FormDataBodyPart p : files) {
FormDataContentDisposition fileDetail = p.getFormDataContentDisposition();
String fileName = new String(fileDetail.getFileName().getBytes(Consts.ISO_8859_1), Consts.UTF_8);
FsPath fsPathNew = new FsPath(fsPath.getPath() + "/" + fileName);
WorkspaceUtil.fileAndDirNameSpecialCharCheck(fsPathNew.getPath());
fileSystem.createNewFile(fsPathNew);
try (InputStream is = p.getValueAs(InputStream.class);
OutputStream outputStream = fileSystem.write(fsPathNew, true)) {
IOUtils.copy(is, outputStream);
}
}
return Message.messageToResponse(Message.ok());
}
@POST
@Path("/deleteDirOrFile")
public Response deleteDirOrFile(@Context HttpServletRequest req, JsonNode json) throws IOException, WorkSpaceException {
String userName = SecurityFilter.getLoginUsername(req);
String path = json.get("path").getTextValue();
if (StringUtils.isEmpty(path)) {
throw WorkspaceExceptionManager.createException(80004, path);
}
FsPath fsPath = new FsPath(path);
FileSystem fileSystem = fsService.getFileSystem(userName, fsPath);
if (!fileSystem.exists(fsPath)) {
throw WorkspaceExceptionManager.createException(80008);
}
if (!fileSystem.canWrite(fsPath.getParent()) || !fileSystem.canExecute(fsPath.getParent())) {
throw WorkspaceExceptionManager.createException(80009);
}
deleteAllFiles(fileSystem, fsPath);
return Message.messageToResponse(Message.ok());
}
@GET
@Path("/getDirFileTrees")
public Response getDirFileTrees(@Context HttpServletRequest req,
@QueryParam("path") String path) throws IOException, WorkSpaceException {
String userName = SecurityFilter.getLoginUsername(req);
if (StringUtils.isEmpty(path)) {
throw WorkspaceExceptionManager.createException(80004, path);
}
FsPath fsPath = new FsPath(path);
FileSystem fileSystem = fsService.getFileSystem(userName, fsPath);
if (!fileSystem.exists(fsPath)) {
return Message.messageToResponse(Message.ok().data("dirFileTrees", null));
}
DirFileTree dirFileTree = new DirFileTree();
dirFileTree.setPath(fsPath.getSchemaPath());
//if(!isInUserWorkspace(path,userName)) throw new WorkSpaceException("The user does not have permission to view the contents of the directory");
if (!fileSystem.canExecute(fsPath) || !fileSystem.canRead(fsPath)) {
throw WorkspaceExceptionManager.createException(80010);
}
dirFileTree.setName(new File(path).getName());
dirFileTree.setChildren(new ArrayList<>());
FsPathListWithError fsPathListWithError = fileSystem.listPathWithError(fsPath);
if (fsPathListWithError != null) {
for (FsPath children : fsPathListWithError.getFsPaths()) {
DirFileTree dirFileTreeChildren = new DirFileTree();
dirFileTreeChildren.setName(new File(children.getPath()).getName());
dirFileTreeChildren.setPath(fsPath.getFsType() + "://" + children.getPath());
dirFileTreeChildren.setProperties(new HashMap<>());
dirFileTreeChildren.setParentPath(fsPath.getSchemaPath());
if (!children.isdir()) {
dirFileTreeChildren.setIsLeaf(true);
dirFileTreeChildren.getProperties().put("size", String.valueOf(children.getLength()));
dirFileTreeChildren.getProperties().put("modifytime", String.valueOf(children.getModification_time()));
}
dirFileTree.getChildren().add(dirFileTreeChildren);
}
}
return Message.messageToResponse(Message.ok().data("dirFileTrees", dirFileTree));
}
@POST
@Path("/download")
public void download(@Context HttpServletRequest req,
@Context HttpServletResponse response,
@RequestBody Map<String, String> json) throws IOException, WorkSpaceException {
InputStream inputStream = null;
ServletOutputStream outputStream = null;
PrintWriter writer = null;
try {
String charset = json.get("charset");
String userName = SecurityFilter.getLoginUsername(req);
String path = json.get("path");
if (StringUtils.isEmpty(path)) {
throw WorkspaceExceptionManager.createException(80004, path);
}
if (StringUtils.isEmpty(charset)) {
charset = Consts.UTF_8.toString();
}
FsPath fsPath = new FsPath(path);
// TODO: 2018/11/29 Judging the directory, the directory cannot be downloaded(判断目录,目录不能下载)
FileSystem fileSystem = fsService.getFileSystem(userName, fsPath);
if (!fileSystem.exists(fsPath)) {
throw WorkspaceExceptionManager.createException(8011);
}
inputStream = fileSystem.read(fsPath);
byte[] buffer = new byte[1024];
int bytesRead = 0;
response.setCharacterEncoding(charset);
java.nio.file.Path source = Paths.get(fsPath.getPath());
String contentType = Files.probeContentType(source);
if (!StringUtils.isEmpty(contentType)) {
response.addHeader("Content-Type", contentType);
} else {
response.addHeader("Content-Type", "multipart/form-data");
}
String downloadFileName = new File(fsPath.getPath()).getName();
WorkspaceUtil.downloadResponseHeadCheck(downloadFileName);
response.addHeader("Content-Disposition", "attachment;filename=" + new File(path).getName());
outputStream = response.getOutputStream();
while ((bytesRead = inputStream.read(buffer, 0, 1024)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
} catch (Exception e) {
LOGGER.error("download error(下载出错):", e);
response.reset();
response.setCharacterEncoding(Consts.UTF_8.toString());
response.setContentType("text/plain; charset=utf-8");
writer = response.getWriter();
writer.append("download error(下载出错)");
writer.flush();
} finally {
if (outputStream != null) {
outputStream.flush();
}
IOUtils.closeQuietly(outputStream);
IOUtils.closeQuietly(inputStream);
IOUtils.closeQuietly(writer);
}
}
/**
* @param req
* @param response
* @param json
* @throws IOException
*/
@POST
@Path("/resultdownload")
public void resultDownload(@Context HttpServletRequest req,
@Context HttpServletResponse response,
@RequestBody Map<String, String> json) throws IOException, WorkSpaceException {
FileSystem fileSystem = null;
InputStream inputStream = null;
ServletOutputStream outputStream = null;
com.webank.wedatasphere.linkis.common.io.resultset.ResultSetReader<? extends MetaData, ? extends Record> resultSetReader = null;
try {
String charset = json.get("charset");
String userName = SecurityFilter.getLoginUsername(req);
String path = json.get("path");
if (StringUtils.isEmpty(path)) {
throw WorkspaceExceptionManager.createException(80004, path);
}
if (StringUtils.isEmpty(charset)) {
charset = "utf-8";
}
LOGGER.info("resultdownload:" + userName + ",path:" + path);
FsPath fsPath = new FsPath(path);
fileSystem = fsService.getFileSystem(userName, fsPath);
if (!fileSystem.exists(fsPath)) {
throw WorkspaceExceptionManager.createException(8011);
}
ResultSetFactory instance = ResultSetFactory$.MODULE$.getInstance();
ResultSet<? extends MetaData, ? extends Record> resultSet = instance.getResultSetByPath(fsPath);
resultSetReader = ResultSetReader.getResultSetReader(resultSet, fileSystem.read(fsPath));
MetaData metaData = resultSetReader.getMetaData();
outputStream = response.getOutputStream();
response.setCharacterEncoding(charset);
response.addHeader("Content-Type", "multipart/form-data");
if (metaData instanceof TableMetaData) {
ArrayList<String> resulstsetColumn = new ArrayList<>();
while (resultSetReader.hasNext()) {
Record record = resultSetReader.getRecord();
TableRecord tableRecord = (TableRecord) record;
Object[] row = tableRecord.row();
for (Object o : row) {
resulstsetColumn.add(o == null ? "NULL" : o.toString());
}
//字段之间tab分割
String rs = org.apache.commons.lang.StringUtils.join(resulstsetColumn, "\t");
outputStream.write(rs.getBytes("utf-8"));
outputStream.write(System.getProperty("line.separator").getBytes());
resulstsetColumn.clear();
}
}
if (metaData instanceof LineMetaData) {
while (resultSetReader.hasNext()) {
Record record = resultSetReader.getRecord();
LineRecord lineRecord = (LineRecord) record;
outputStream.write(lineRecord.getLine().getBytes("utf-8"));
outputStream.write(System.getProperty("line.separator").getBytes());
}
}
} catch (Exception e) {
LOGGER.error("resultset download error(结果集下载出错):", e);
response.reset();
response.setCharacterEncoding("UTF-8");
response.setContentType("text/plain; charset=utf-8");
PrintWriter writer = response.getWriter();
writer.append("resultset download error(结果集下载出错)");
writer.flush();
writer.close();
} finally {
resultSetReader.close();
if (outputStream != null) {
outputStream.flush();
}
StorageUtils.close(outputStream, inputStream, null);
}
}
@GET
@Path("/isExist")
public Response isExist(@Context HttpServletRequest req,
@QueryParam("path") String path) throws IOException, WorkSpaceException {
String userName = SecurityFilter.getLoginUsername(req);
FsPath fsPath = new FsPath(path);
if (StringUtils.isEmpty(path)) {
throw WorkspaceExceptionManager.createException(80004, path);
}
FileSystem fileSystem = fsService.getFileSystem(userName, fsPath);
return Message.messageToResponse(Message.ok().data("isExist", fileSystem.exists(fsPath)));
}
@GET
@Path("/openFile")
public Response openFile(@Context HttpServletRequest req,
@QueryParam("path") String path,
@DefaultValue("1") @QueryParam("page") Integer page,
@DefaultValue("5000") @QueryParam("pageSize") Integer pageSize,
@DefaultValue("utf-8") @QueryParam("charset") String charset) throws IOException, WorkSpaceException {
String userName = SecurityFilter.getLoginUsername(req);
Message message = Message.ok();
if (StringUtils.isEmpty(path)) {
throw WorkspaceExceptionManager.createException(80004, path);
}
FsPath fsPath = new FsPath(path);
FileSystem fileSystem = fsService.getFileSystem(userName, fsPath);
//Throws an exception if the file does not have read access(如果文件没读权限,抛出异常)
if (!fileSystem.canRead(fsPath)) {
throw WorkspaceExceptionManager.createException(80012);
}
FileSource fileSource = null;
try {
fileSource = FileSource$.MODULE$.create(fsPath, fileSystem);
if (FileSource$.MODULE$.isResultSet(fsPath.getPath())) {
fileSource = fileSource.page(page, pageSize);
}
Pair<Object, ArrayList<String[]>> result = fileSource.collect();
IOUtils.closeQuietly(fileSource);
message.data("metadata", result.getFirst()).data("fileContent", result.getSecond());
message.data("type", fileSource.getParams().get("type"));
message.data("totalLine", Integer.valueOf(fileSource.getParams().get("totalLine")));
return Message.messageToResponse(message.data("page", page).data("totalPage", 0));
} finally {
IOUtils.closeQuietly(fileSource);
}
}
/**
* @param req
* @param json
* @return
* @throws IOException
*/
@POST
@Path("/saveScript")
public Response saveScript(@Context HttpServletRequest req, @RequestBody Map<String, Object> json) throws IOException, WorkSpaceException {
String userName = SecurityFilter.getLoginUsername(req);
String path = (String) json.get("path");
if (StringUtils.isEmpty(path)) {
throw WorkspaceExceptionManager.createException(80004, path);
}
String charset = (String) json.get("charset");
if (StringUtils.isEmpty(charset)) {
charset = Consts.UTF_8.toString();
}
String scriptContent = (String) json.get("scriptContent");
Object params = json.get("params");
Map<String, Object> map = (Map<String, Object>) params;
Variable[] v = VariableParser.getVariables(map);
FsPath fsPath = new FsPath(path);
FileSystem fileSystem = fsService.getFileSystem(userName, fsPath);
if (!fileSystem.exists(fsPath)) {
throw WorkspaceExceptionManager.createException(80013);
}
if (!fileSystem.canWrite(fsPath)) {
throw WorkspaceExceptionManager.createException(80014);
}
try (
ScriptFsWriter scriptFsWriter = ScriptFsWriter.getScriptFsWriter(fsPath, charset, fileSystem.write(fsPath, true));
) {
scriptFsWriter.addMetaData(new ScriptMetaData(v));
String[] split = scriptContent.split("\\n");
for (int i = 0; i < split.length; i++) {
if ("".equals(split[i]) || i != split.length - 1) {
split[i] += "\n";
}
scriptFsWriter.addRecord(new ScriptRecord(split[i]));
}
return Message.messageToResponse(Message.ok());
}
}
@GET
@Path("resultsetToExcel")
public void resultsetToExcel(
@Context HttpServletRequest req,
@Context HttpServletResponse response,
@QueryParam("path") String path,
@DefaultValue("utf-8") @QueryParam("charset") String charset,
@DefaultValue("csv") @QueryParam("outputFileType") String outputFileType,
@DefaultValue(",") @QueryParam("csvSeperator") String csvSeperator,
@DefaultValue("downloadResultset") @QueryParam("outputFileName") String outputFileName,
@DefaultValue("result") @QueryParam("sheetName") String sheetName,
@DefaultValue("NULL") @QueryParam("nullValue") String nullValue) throws WorkSpaceException, IOException {
ServletOutputStream outputStream = null;
FsWriter fsWriter = null;
PrintWriter writer = null;
FileSource fileSource = null;
try {
String userName = SecurityFilter.getLoginUsername(req);
FsPath fsPath = new FsPath(path);
FileSystem fileSystem = fsService.getFileSystem(userName, fsPath);
boolean isLimitDownloadSize = RESULT_SET_DOWNLOAD_IS_LIMIT.getValue();
Integer csvDownloadSize = RESULT_SET_DOWNLOAD_MAX_SIZE_CSV.getValue();
Integer excelDownloadSize = RESULT_SET_DOWNLOAD_MAX_SIZE_EXCEL.getValue();
if (StringUtils.isEmpty(path)) {
throw WorkspaceExceptionManager.createException(80004, path);
}
String downloadFileName = new String(outputFileName.getBytes("UTF-8"), "ISO8859-1") + "." + outputFileType;
WorkspaceUtil.downloadResponseHeadCheck(downloadFileName);
response.addHeader("Content-Disposition", "attachment;filename="
+ downloadFileName);
response.setCharacterEncoding(charset);
outputStream = response.getOutputStream();
// 前台传""会自动转为null
if (nullValue != null && BLANK.equalsIgnoreCase(nullValue)) nullValue = "";
fileSource = FileSource$.MODULE$.create(fsPath, fileSystem).addParams("nullValue", nullValue);
switch (outputFileType) {
case "csv":
if (FileSource$.MODULE$.isTableResultSet(fileSource)) {
fsWriter = CSVFsWriter.getCSVFSWriter(charset, csvSeperator, outputStream);
} else {
fsWriter = ScriptFsWriter.getScriptFsWriter(new FsPath(outputFileType), charset, outputStream);
}
response.addHeader("Content-Type", "text/plain");
if (isLimitDownloadSize) {
fileSource = fileSource.page(1, csvDownloadSize);
}
break;
case "xlsx":
if (!FileSource$.MODULE$.isTableResultSet(fileSource)) {
throw WorkspaceExceptionManager.createException(80024);
}
fsWriter = ExcelFsWriter.getExcelFsWriter(charset, sheetName, DEFAULT_DATE_TYPE, outputStream);
response.addHeader("Content-Type", XLSX_RESPONSE_CONTENT_TYPE);
if (isLimitDownloadSize) {
fileSource = fileSource.page(1, excelDownloadSize);
}
break;
default:
WorkspaceExceptionManager.createException(80015);
}
fileSource.write(fsWriter);
fsWriter.flush();
} catch (Exception e) {
LOGGER.error("resultset to excel/csv error(结果集导出出错):", e);
response.reset();
response.setCharacterEncoding(Consts.UTF_8.toString());
response.setContentType("text/plain; charset=utf-8");
writer = response.getWriter();
writer.append("resultset to excel/csv error(结果集导出出错)");
writer.flush();
} finally {
if (outputStream != null) {
outputStream.flush();
}
IOUtils.closeQuietly(fsWriter);
IOUtils.closeQuietly(fileSource);
IOUtils.closeQuietly(writer);
}
}
@GET
@Path("formate")
public Response formate(@Context HttpServletRequest req,
@QueryParam("path") String path,
@DefaultValue("utf-8") @QueryParam("encoding") String encoding,
@DefaultValue(",") @QueryParam("fieldDelimiter") String fieldDelimiter,
@DefaultValue("false") @QueryParam("hasHeader") Boolean hasHeader,
@DefaultValue("\"") @QueryParam("quote") String quote,
@DefaultValue("false") @QueryParam("escapeQuotes") Boolean escapeQuotes) throws Exception {
String userName = SecurityFilter.getLoginUsername(req);
if (StringUtils.isEmpty(path)) {
throw WorkspaceExceptionManager.createException(80004, path);
}
String suffix = path.substring(path.lastIndexOf("."));
FsPath fsPath = new FsPath(path);
Map<String, Object> res = new HashMap<String, Object>();
FileSystem fileSystem = fsService.getFileSystem(userName, fsPath);
try (InputStream in = fileSystem.read(fsPath)) {
if (".xlsx".equalsIgnoreCase(suffix) || ".xls".equalsIgnoreCase(suffix)) {
List<List<String>> info;
info = ExcelStorageReader.getExcelTitle(in, null, hasHeader, suffix);
res.put("columnName", info.get(1));
res.put("columnType", info.get(2));
res.put("sheetName", info.get(0));
} else {
String[][] column = null;
BufferedReader reader = new BufferedReader(new InputStreamReader(in, encoding));
String header = reader.readLine();
if (StringUtils.isEmpty(header)) {
throw WorkspaceExceptionManager.createException(80016);
}
String[] line = header.split(fieldDelimiter, -1);
int colNum = line.length;
column = new String[2][colNum];
if (hasHeader) {
for (int i = 0; i < colNum; i++) {
column[0][i] = line[i];
if (escapeQuotes) {
try {
column[0][i] = column[0][i].substring(1, column[0][i].length() - 1);
} catch (StringIndexOutOfBoundsException e) {
throw WorkspaceExceptionManager.createException(80017);
}
}
column[1][i] = "string";
}
} else {
for (int i = 0; i < colNum; i++) {
column[0][i] = "col_" + (i + 1);
column[1][i] = "string";
}
}
res.put("columnName", column[0]);
res.put("columnType", column[1]);
}
return Message.messageToResponse(Message.ok().data("formate", res));
}
}
@GET
@Path("/openLog")
public Response openLog(@Context HttpServletRequest req, @QueryParam("path") String path) throws IOException, WorkSpaceException {
String userName = SecurityFilter.getLoginUsername(req);
if (StringUtils.isEmpty(path)) {
throw WorkspaceExceptionManager.createException(80004, path);
}
FsPath fsPath = new FsPath(path);
FileSystem fileSystem = fsService.getFileSystem(userName, fsPath);
if (!fileSystem.canRead(fsPath)) {
throw WorkspaceExceptionManager.createException(80018);
}
try (FileSource fileSource = FileSource$.MODULE$.create(fsPath, fileSystem).addParams("ifMerge", "false")) {
Pair<Object, ArrayList<String[]>> collect = fileSource.collect();
StringBuilder[] log = Arrays.stream(new StringBuilder[4]).map(f -> new StringBuilder()).toArray(StringBuilder[]::new);
ArrayList<String[]> snd = collect.getSecond();
LogLevel start = new LogLevel(LogLevel.Type.ALL);
snd.stream().map(f -> f[0]).forEach(s -> WorkspaceUtil.logMatch(s, start).forEach(i -> log[i].append(s).append("\n")));
return Message.messageToResponse(Message.ok().data("log", Arrays.stream(log).map(StringBuilder::toString).toArray(String[]::new)));
}
}
private static void deleteAllFiles(FileSystem fileSystem, FsPath fsPath) throws IOException {
fileSystem.delete(fsPath);
List<FsPath> list = null;
if (fileSystem.exists(fsPath)) {
list = fileSystem.list(fsPath);
}
if (list == null) {
return;
}
for (FsPath path : list) {
deleteAllFiles(fileSystem, path);
}
fileSystem.delete(fsPath);
}
}