package frame.file.office; import java.io.Console; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.net.URL; import java.net.URLEncoder; import java.util.List; import java.util.Map; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.codec.net.URLCodec; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.sun.corba.se.impl.protocol.JIDLLocalCRDImpl; import frame.call.writer.JsonWriter; import frame.config.Configer; import frame.data.DataContext; import frame.file.FileIO; import frame.file.FileIOContainer; import frame.file.FileIOErrorType; import frame.file.FileIOException; import frame.file.FileIOItem; import frame.file.UploadResult; import frame.file.db.DataBaseTranslator; import frame.file.office.excel.DownloadResult; import frame.file.office.excel.ExcelReader; import frame.file.office.excel.ExcelReaders; import frame.file.office.excel.ExcelWriter; import frame.file.processor.Monitor; import frame.upload.FileItem; import frame.upload.FileUploadException; import frame.upload.disk.DiskFileItemFactory; import frame.upload.servlet.ServletFileUpload; import frame.util.Util; public class Engine { private static Engine instance; private static Object locker = new Object(); private Logger logger; private ExcelReader excelLoader; private static int MAX_CACHE_SIZE = 30 * 1024 * 1024; private static int MAX_FILE_SIZE = 100 * 1024 * 1024; private Engine() { logger = LoggerFactory.getLogger(this.getClass()); excelLoader = new ExcelReader(logger); } public static Engine getInstance() { synchronized (locker) { if (instance == null) { instance = new Engine(); } return instance; } } public static void download(HttpServletResponse response, String iocode, DataContext dataContext, Map parameterProvider) throws IOException { getInstance(); StringBuilder log = new StringBuilder(); try { FileIOContainer.load(); // ExcelWriter excelWriter = new ExcelWriter(Monitor.getDownloadProgressor(), parameterProvider); ExcelWriter excelWriter = new ExcelWriter(Monitor.getDownloadProgressor()); DownloadResult result = excelWriter.writeOneFile(iocode, dataContext); String filename = result.getFilename(); response.addHeader("Content-Type", "application/octet-stream"); filename = URLEncoder.encode(filename, "utf-8"); response.addHeader("Content-Disposition", "attachment;filename=" + filename); ServletOutputStream outputStream = response.getOutputStream(); String path = result.getPath(); File file = new File(path); //TODO output // outputStream.write(b) // response.TransmitFile(result.getPath()); } catch (Exception e) { JsonWriter json = new JsonWriter(); json.beginObject(); json.addValue("log", log.toString()); json.addValue("error", e.getMessage()); json.beginArray("detail"); List details = Monitor.getDownloadProgressor().getMessageList(); for (int i = 0; i < details.size(); i++) { json.addValue(details.get(i)); } json.endArray(); json.endObject(); PrintWriter writer = response.getWriter(); writer.write(json.toString()); } } public static UploadResult upload(String ioCode, File file, HttpServletRequest request) throws Exception { UploadResult result = new UploadResult(request); result.writeBegin(); try { //1. prepare getInstance(); FileIOContainer.load(); //2. if (Util.isEmptyStr(ioCode)) { throw new FileIOException(FileIOErrorType.FileIOCodeIsNull, "file io code is null"); } FileIO fileIO = FileIOContainer.get(ioCode); if (fileIO == null) { throw new FileIOException(FileIOErrorType.FileIONotExists, "fileio not exists: " + ioCode); } //3. instance.doUpload(fileIO); } catch (Exception e){ result.fail("error", e.getMessage()); } finally { result.writeEnd(); } return result; } private void doUpload(FileIO fileIO) { ExcelReaders excelLoaders = new ExcelReaders(request); //1. fire begin event fileIO.execHandlers(result, "begin"); //2. file to tempt table List importList = fileIO.getItemList(FileIOTypeCode.Import); for (FileIOItem fileIOItem : importList) { fileIOItem.execHandlers(result, "begin"); excelLoaders.loadOneItem(fileIOItem); fileIOItem.execHandlers(result, "end"); } //3. fire after tempt tables fileIO.execHandlers(result, "after-temp"); //4. tempt table to standard table List dbList = fileIO.getItemList(FileIOTypeCode.Db); for (FileIOItem fileIOItem : dbList) { fileIOItem.execHandlers(result, "begin"); DataBaseTranslator.translate(result, fileIOItem); fileIOItem.execHandlers(result, "end"); } //5. fire end event fileIO.execHandlers(result, "end"); } private static List loadUploadFile(HttpServletRequest request) throws FileUploadException { DiskFileItemFactory diskFileFactory = new DiskFileItemFactory(); diskFileFactory.setSizeThreshold(MAX_CACHE_SIZE); diskFileFactory.setRepository(new File(Configer.getParam("repository"))); ServletFileUpload fileUpload = new ServletFileUpload(diskFileFactory); fileUpload.setSizeMax(MAX_FILE_SIZE); return fileUpload.parseRequest(request); } public static UploadResult testDataProcess(String iocode, HttpServletRequest request) throws Exception { UploadResult result = new UploadResult(request); result.writeBegin(); try { getInstance(); instance.excelLoader.testDataProcess(result, iocode); } catch (Exception e){ result.fail("error", e.getMessage()); } finally { result.writeEnd(); } return result; } private void showHelloMessage() { logger.info("Excel导入服务器 V1.0已启动"); } }