package foundation.io;
|
|
import java.io.File;
|
import java.util.Date;
|
import java.util.List;
|
|
import foundation.action.ActionProvider;
|
import foundation.action.WorkflowDispatcher;
|
import foundation.dao.DataPackage;
|
import foundation.dao.Domain;
|
import foundation.dao.Filter;
|
import foundation.dao.PackageStringMap;
|
import foundation.data.entity.Entity;
|
import foundation.data.entity.EntitySet;
|
import foundation.data.object.DataObject;
|
import foundation.io.define.DataIO;
|
import foundation.io.define.DataIOContainer;
|
import foundation.io.define.IODirection;
|
import foundation.io.define.IOTask;
|
import foundation.io.engine.IOEngine;
|
import foundation.io.engine.IOResult;
|
import foundation.io.engine.IOWatchPoint;
|
import foundation.io.object.DownloadAction;
|
import foundation.io.object.DownloadWriter;
|
import foundation.io.object.FileRecord;
|
import foundation.monitor.Monitor;
|
import foundation.right.IRightObjectExecutor;
|
import foundation.right.Range;
|
import foundation.right.RightAssistant;
|
import foundation.right.RightPool;
|
import foundation.server.config.Configer;
|
import foundation.token.IOnlineUser;
|
import foundation.token.IUser;
|
import foundation.translator.Translator;
|
import foundation.util.Util;
|
|
|
public class IOHandler extends ActionProvider implements IRightObjectExecutor {
|
|
private static Monitor<IOWatchPoint> monitor;
|
private IOTask ioTask;
|
private IOContext context;
|
|
static {
|
monitor = new Monitor<IOWatchPoint>();
|
}
|
|
public IOHandler() {
|
|
}
|
|
@Override
|
public void publishMethod() {
|
//1. 上载一个文件
|
addMethod("uploadOneFile");
|
|
//2. 上载多个文件
|
addMethod("uploadFiles");
|
|
//3. 下载一个文件
|
addMethod("downloadOneFile");
|
|
//4. 获取文件记录(文件名、大小、物理地址)
|
addMethod("getFileRecord");
|
|
//5. 导出数据
|
addMethod("exportData");
|
|
//6. 导入数据
|
addMethod("importData");
|
|
//6. 运行导入导出(通过 work flow)
|
addMethod("execIO");
|
|
//6. 下载导入数据的错误信息
|
addMethod("downloadImportErrors");
|
|
//7. 导入数据
|
addMethod("loadData");
|
|
//9. 获取当前状态
|
addMethod("getIOStatus");
|
|
//10. 获取数据文件
|
addMethod("getDataFile");
|
|
//11. 注入数据到模板,并生成文件
|
addMethod("injectDataToOneFile");
|
|
//12. 注入数据到多个模板,并生成多个文件
|
addMethod("injectDataToFiles");
|
|
//13. 完善文件路径
|
addMethod("fillFilePath");
|
}
|
|
public void uploadOneFile() throws Exception {
|
FileRecord record = FileCenter.uploadOneFile(dataReader);
|
dataWriter.addValue("file", record);
|
}
|
|
public void uploadFiles() throws Exception {
|
List<FileRecord> recordList = FileCenter.uploadFiles(dataReader);
|
dataWriter.addValue("fileList", recordList);
|
}
|
|
public void downloadOneFile() throws Exception {
|
String fileURL = dataReader.getString("url");
|
DownloadAction action = DownloadAction.parse(dataReader.getString("action"));
|
|
//1. 根据 URL 直接到目录下面获取文件并下载
|
if (!Util.isEmpty(fileURL)) {
|
File file = new File(FileRepository.urlToPath(fileURL));
|
|
if (!file.exists()) {
|
dataWriter.reportOneError("download", "文件不存在");
|
return;
|
}
|
|
DownloadWriter downloadWriter = new DownloadWriter(dataWriter);
|
downloadWriter.write(file, file.getName(), action);
|
return;
|
}
|
|
//2. 根据文件索引下载文件
|
String dataName = dataReader.getString("dataName");
|
String fileId = dataReader.getString("file_index_id");
|
|
if (Util.isEmpty(dataName) || Util.isEmpty(fileId)) {
|
logger.error("file get error, empty dataname or file_index_id");
|
return;
|
}
|
|
FileRecord record = FileCenter.getFile(dataName, fileId);
|
if (action == DownloadAction.Unknown) {
|
action = DownloadAction.parse(record.getContentType());
|
}
|
|
DownloadWriter downloadWriter = new DownloadWriter(dataWriter);
|
downloadWriter.write(record.getFile(), record.getFileName(), action);
|
}
|
|
public void getFileRecord() throws Exception {
|
String dataName = dataReader.getString("dataName");
|
String fileId = dataReader.getString("id");
|
FileRecord fileRecord = FileCenter.getFile(dataName, fileId);
|
|
dataWriter.addValue("data", fileRecord);
|
}
|
|
public void exportData() throws Exception {
|
IODirection direction = IODirection.TableToSheet;
|
String taskName = dataReader.getString("ioName");
|
|
if (Util.isEmpty(taskName)) {
|
logger.error("can not exec io task for empty io name");
|
return;
|
}
|
|
//1. 获取或创建 IOTask
|
IOTask ioTask = getIOTask(taskName, direction);
|
|
//2. 运行 IOTask
|
doExecIO(ioTask);
|
}
|
|
public void importData() throws Exception {
|
IODirection direction = IODirection.SheetToTable;
|
String taskName = dataReader.getString("ioName");
|
|
|
if (Util.isEmpty(taskName)) {
|
logger.error("can not exec io task for empty io name");
|
return;
|
}
|
|
//1. 获取或创建 IOTask
|
ioTask = getIOTask(taskName, direction);
|
|
//2. 通过 workflow 运行 IOTask
|
context = new IOContext();
|
|
DataIO dataIO = ioTask.getDataIO(0);
|
if (dataIO != null) {
|
context.setToDateObject(dataIO.getToDataObject());
|
context.setToTempDateObject(dataIO.getToTempDataObject());
|
}
|
|
ImportStep workStep = new ImportStep(ioTask, this);
|
|
WorkflowDispatcher dispatcher = WorkflowDispatcher.getInstance();
|
dispatcher.execWorkflow(dataReader, dataWriter, workStep, context);
|
}
|
|
public void downloadImportErrors() throws Exception {
|
String taskName = dataReader.getString("ioName");
|
String ioBatchId = dataReader.getString("ioBatchId");
|
if(Util.isEmpty(ioBatchId)) {
|
ioBatchId = context.getIoBatchId();
|
}
|
|
if (Util.isEmpty(taskName) || Util.isEmpty(ioBatchId)) {
|
logger.error("can not exec io task for empty io name");
|
return;
|
}
|
|
IOTask ioTask = IOCreator.createDownloadErrorsTask(dataReader, taskName, ioBatchId);
|
doExecIO(ioTask);
|
}
|
|
public void loadData() throws Exception {
|
IODirection direction = IODirection.SheetToMemory;
|
String taskName = dataReader.getString("ioName");
|
|
if (Util.isEmpty(taskName)) {
|
logger.error("can not exec io task for empty io name");
|
return;
|
}
|
|
//1. 获取或创建 IOTask
|
IOTask ioTask = getIOTask(taskName, direction);
|
|
//2. 运行 IOTask
|
doExecIO(ioTask);
|
}
|
|
public void execIO() throws Exception {
|
if (ioTask == null) {
|
return;
|
}
|
|
doExecIO(ioTask);
|
}
|
|
private IOTask getIOTask(String taskName, IODirection direction) throws Exception {
|
DataIOContainer ioContainer = DataIOContainer.getInstance();
|
IOTask ioTask = ioContainer.getIOTask(taskName);
|
|
if (ioTask == null) {
|
ioTask = IOCreator.createTask(dataReader, taskName, direction);
|
}
|
|
return ioTask;
|
}
|
|
private void doExecIO(IOTask ioTask) throws Exception {
|
Range range = ioTask.getRange();
|
IOnlineUser user = IOnlineUser.getInstance();
|
|
//1. apply right
|
String resourceKey = RightPool.getResourceKey(range, "DataIO", ioTask.getName());
|
RightAssistant assistant = new RightAssistant(this, user);
|
RightPool.apply(range, "DataIO", assistant);
|
|
//2. get watch point
|
IOWatchPoint watchPoint = monitor.getWathchPoint(resourceKey);
|
|
//3. if not success
|
if (!assistant.isSuccess()) {
|
String message = createSkipMessage(watchPoint);
|
dataWriter.reportOneError("获取导入/导出权限", message);
|
return;
|
}
|
|
//4. create watch point for first time
|
if (watchPoint == null) {
|
watchPoint = (IOWatchPoint) assistant.getData();
|
monitor.addWatchPoint(resourceKey, watchPoint);
|
}
|
|
//5. run engine
|
IOEngine engine = watchPoint.getEngine();
|
engine.init(dataReader, dataWriter, ioTask, context);
|
engine.syncExec("exec");
|
|
//6. set result
|
IOResult result = engine.getResult();
|
dataWriter.addValue("status", result);
|
dataWriter.addValue("data", result.getEntitySet());
|
dataWriter.addValue("title", result.getTitles());
|
}
|
|
public void getFile() throws Exception {
|
String fileName = dataReader.getString("name");
|
|
if (Util.isEmpty(fileName)) {
|
logger.error("file name is empty");
|
return;
|
}
|
|
// String path = Configer.getPath_Temp() + "/" + fileName;
|
// File file = new File(path);
|
|
File file = new File("");
|
|
if (!file.exists()) {
|
dataWriter.reportOneError("下载文件", "文件不存在: " + fileName);
|
return;
|
}
|
|
DownloadWriter downloadWriter = new DownloadWriter(dataWriter);
|
downloadWriter.write(file, file.getName(), DownloadAction.AsExcel);
|
}
|
|
public void getStatus() throws Exception {
|
String taskName = dataReader.getString("ioName");
|
DataIOContainer ioContainer = DataIOContainer.getInstance();
|
IOTask ioTask = ioContainer.getIOTask(taskName);
|
|
if (ioTask == null) {
|
dataWriter.reportOneError("获取导入/导出定义", "定义不存在" + taskName);
|
return;
|
}
|
|
Range range = ioTask.getRange();
|
String resourceKey = RightPool.getResourceKey(range, "DataIO", taskName);
|
|
IOWatchPoint watchPoint = monitor.getWathchPoint(resourceKey);
|
|
if (watchPoint == null) {
|
dataWriter.reportOneError("获取watchPoint", "系统空闲,没有运行");
|
return;
|
}
|
|
IOResult result = watchPoint.getIOResult();
|
dataWriter.addValue("status", result);
|
}
|
|
public void injectDataToFiles() throws Exception {
|
//1. 获取模板名称
|
List<String> templates = dataReader.getStringList("template");
|
|
if (templates == null || templates.isEmpty()) {
|
dataWriter.writeError("inject data to file error, template is null");
|
return;
|
}
|
|
//2. 根据ID获取数据
|
Domain domain = dataReader.getDomain();
|
DataPackage dataPackage = (domain != null) ? domain.getDataPackage() : null;
|
|
if (dataPackage == null) {
|
dataWriter.writeError("inject data to file error, data package not exists");
|
return;
|
}
|
|
//3. 数据注入
|
IOnlineUser user = IOnlineUser.getInstance();
|
PackageStringMap dataMap = dataPackage.toStringMap();
|
dataMap.setNullResult("***");
|
List<File> files = FileInjector.createFiles(user, templates, FileTypes.PDF, dataMap);
|
|
//4. 返回结果
|
dataWriter.addValue("file", files);
|
// DownloadWriter downloadWriter = new DownloadWriter(dataWriter);
|
// downloadWriter.write(file, file.getName(), DownloadAction.AsPDF);
|
}
|
|
public void injectDataToOneFile() throws Exception {
|
//1. 获取模板名称
|
String template = dataReader.getString("template");
|
|
if (Util.isEmpty(template)) {
|
dataWriter.writeError("inject data to file error, template is null");
|
return;
|
}
|
|
//2. 根据ID获取数据
|
Domain domain = dataReader.getDomain();
|
DataPackage dataPackage = (domain != null) ? domain.getDataPackage() : null;
|
|
if (dataPackage == null) {
|
dataWriter.writeError("inject data to file error, data package not exists");
|
return;
|
}
|
|
//3. 数据注入
|
IOnlineUser user = IOnlineUser.getInstance();
|
PackageStringMap dataMap = dataPackage.toStringMap();
|
dataMap.setNullResult("***");
|
File file = FileInjector.createOneFile(user, template, FileTypes.PDF, dataMap);
|
|
if (!file.exists()) {
|
dataWriter.reportOneError("下载文件", "文件不存在: " + file);
|
return;
|
}
|
|
//4. 返回结果
|
dataWriter.addValue("file", file.toString());
|
// DownloadWriter downloadWriter = new DownloadWriter(dataWriter);
|
// downloadWriter.write(file, file.getName(), DownloadAction.AsPDF);
|
}
|
|
@Override
|
public Object createRightObject(IUser user, String resourceKey) {
|
IOEngine engine = new IOEngine();
|
|
IOWatchPoint watchPoint = new IOWatchPoint(user, engine);
|
monitor.addWatchPoint(resourceKey, watchPoint);
|
|
return watchPoint;
|
}
|
|
@Override
|
public boolean isIdle(Object data) {
|
if (data == null) {
|
return true;
|
}
|
|
IOWatchPoint watchPoint = (IOWatchPoint) data;
|
IOEngine engine = watchPoint.getEngine();
|
|
return engine.isIdle();
|
}
|
|
private String createSkipMessage(IOWatchPoint watchPoint) {
|
if (watchPoint == null) {
|
return "该操作刚刚被其他人执行,系统正在运行...";
|
}
|
|
IUser user = watchPoint.getRunningUser();
|
Date date = watchPoint.getBegionTime();
|
|
String result = user.getName() + "在【" + Translator.toString(date) + "】已经运行...";
|
return result;
|
}
|
|
public void fillFilePath() throws Exception {
|
DataPackage dataPackage = dataReader.getDataPackage();
|
DataPackage host = dataPackage.getHost();
|
DataObject dataObject = DataObject.getInstance("so_implant_file");
|
EntitySet fileList = dataObject.getTableEntitySet(new Filter("sender_id", host.getMasterId()));
|
String filePath;
|
|
for (Entity entity : fileList) {
|
filePath = entity.getString("file_path");
|
filePath = Configer.getParam("PathRepository") + filePath;
|
entity.set("file_path", filePath);
|
dataObject.updateEntity(entity);
|
}
|
|
}
|
}
|