ImportService.java

package sk.iway.iwcm.xls;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.lang.reflect.Constructor;
import java.text.SimpleDateFormat;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.multipart.commons.CommonsMultipartFile;

import sk.iway.iwcm.Adminlog;
import sk.iway.iwcm.Constants;
import sk.iway.iwcm.ExcelImport;
import sk.iway.iwcm.ExcelXImport;
import sk.iway.iwcm.Identity;
import sk.iway.iwcm.Logger;
import sk.iway.iwcm.Tools;
import sk.iway.iwcm.common.DocTools;
import sk.iway.iwcm.database.ActiveRecord;
import sk.iway.iwcm.i18n.Prop;
import sk.iway.iwcm.io.IwcmFile;
import sk.iway.iwcm.io.IwcmFsDB;
import sk.iway.iwcm.system.spring.SpringUrlMapping;

public class ImportService {

	public static String importFromExcel(CommonsMultipartFile file, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
		HttpSession session = request.getSession();
		boolean setAdminLayout = true;
		String importActionAllowedClass = (String)session.getAttribute("ImportXLSAction.allowedClass");
		if (Tools.isEmpty(importActionAllowedClass)) {
			Identity user = (Identity) session.getAttribute(Constants.USER_KEY);

			if (user == null || !user.isAdmin()) {
				SpringUrlMapping.redirectToLogon(response);
				return null;
			}

			if (user.isAdmin()) {
				//mohlo sa stat, ze bol na stranke, robil import a potom presiel do adminu, kde by mal mat vsetko povolene
				session.removeAttribute("ImportXLSAction.allowedClass");
				importActionAllowedClass = null;
			} else
                setAdminLayout = false;
		} else {
            //importujem na beznej web stranku
            setAdminLayout = false;
        }

		Prop prop = Prop.getInstance(request);
		sk.iway.iwcm.Encoding.setResponseEnc(request, response, "text/html");
		PrintWriter out = response.getWriter();

		if (setAdminLayout) {
            request.setAttribute("closeTable", "true");
            request.setAttribute("dialogTitleKey", "components.qa.excel_import");
            request.setAttribute("dialogDesc", " ");
            request.getRequestDispatcher("/admin/layout_top_dialog.jsp").include(request, response);
        } else {
            out.println("<html><head><LINK rel='stylesheet' href='/admin/css/style.css'></head><body style='background-color: white;'>");
            out.println("<h3>"+prop.getText("file.importing_please_wait")+"</h3>");
        }

		//out.println("<html><head><LINK rel='stylesheet' href='/admin/css/style.css'></head><body style='background-color: white;'>");
		out.println("<h3>"+prop.getText("file.importing_please_wait")+"</h3>");

		String type = Tools.getParameter(request, "type");
		String sheetName = request.getParameter("sheetName");
		if("".equals(sheetName)) sheetName = null;
		Logger.println(ImportService.class, "ImportService: type=" + type + ", sheetName=" + sheetName);

		if (type.indexOf('.') != -1) {
			if (Tools.isNotEmpty(importActionAllowedClass) && type.startsWith(importActionAllowedClass) == false) {
				out.println("<hr>ERROR: Permission denied");
				out.println("</body></html>");

				return null;
			}

			Adminlog.add(Adminlog.TYPE_IMPORTXLS, "ImportService: " + type + " file=" + file.getOriginalFilename() + " size=" + file.getSize(), -1, -1);
			try {
				Class<?> c = Class.forName(type);
				// MBO: pre lenivcov, ktorym sa nechce vyrabat ImportImpl triedu pre JPA beany :)
				if (ActiveRecord.class.isAssignableFrom(c) && c.isAnnotationPresent(XLSImport.class)) {
					XLSImport annotation = c.getAnnotation(XLSImport.class);
					if (DefaultEntityImporter.class.isAssignableFrom(annotation.importer())) {
						@SuppressWarnings("unchecked")
						Constructor<?> constructor = annotation.importer().getConstructor(new Class[] {InputStream.class, HttpServletRequest.class, PrintWriter.class, Class.class});
						DefaultEntityImporter importer = (DefaultEntityImporter)constructor.newInstance(new Object[] {file.getInputStream(), request, out, c});
						if (!file.getOriginalFilename().endsWith(".xls"))
							return printError(prop, out);

						importer.setFileName(file.getOriginalFilename());
						importer.doImport(prop);
					}
				} else {
					Constructor<?> constructor = c.getConstructor(new Class[] {InputStream.class, HttpServletRequest.class, PrintWriter.class});
					Object o = constructor.newInstance(new Object[] {file.getInputStream(), request, out});
					if (o instanceof ExcelImportJXL) {
						if (!file.getOriginalFilename().endsWith(".xls"))
							return printError(prop, out);

						ExcelImportJXL i = (ExcelImportJXL)o;
						i.setFileName(file.getOriginalFilename());
						i.doImport(sheetName, prop);
					} else if (o instanceof ExcelImport) {
						if (!file.getOriginalFilename().endsWith(".xls"))
							return printError(prop, out);

						ExcelImport i = (ExcelImport)o;
						i.doImport(sheetName, prop);
					} else if (o instanceof ExcelXImport) {
						if (!file.getOriginalFilename().endsWith(".xlsx"))
							return printError(prop, out);

						ExcelXImport i = (ExcelXImport)o;
						i.doImport(sheetName, prop);
					} else if(o instanceof CSVImport) {
						if (!file.getOriginalFilename().endsWith(".csv") && !file.getOriginalFilename().endsWith(".txt"))
							return printError(prop, out);

						CSVImport i = (CSVImport)o;
						i.doImport(request, file.getInputStream());
					}
				}

				//ak je nastavene, ulozime po uspesnom ukonceni na dane miesto napr. /files/import_xls/
				String saveExcelTo = request.getParameter("saveExcelTo");
				if(Tools.isNotEmpty(saveExcelTo)) {
					SimpleDateFormat sdf = new SimpleDateFormat("dd_MM_yyyy-HH_mm_ss");
					Integer ind = file.getOriginalFilename().lastIndexOf("\\");
					String fileName = file.getOriginalFilename().substring(++ind);
					fileName = DocTools.removeChars(fileName, true);
					saveExcelTo = saveExcelTo.endsWith("/") ? saveExcelTo : saveExcelTo + "/";

					IwcmFile dir = new IwcmFile(Tools.getRealPath(saveExcelTo));
					if(!dir.exists())
						dir.mkdirs();

					String path = saveExcelTo + sdf.format(Tools.getNow()) + "_" + fileName;
					IwcmFile iwcmFile = new IwcmFile(Tools.getRealPath(path));

					if (!iwcmFile.exists())
						iwcmFile.createNewFile();

					IwcmFsDB.writeFiletoDest(file.getInputStream(), new File(iwcmFile.getPath()), (int) file.getSize());
					Logger.println(ImportService.class, "ImportService: kopia XLS " + file.getOriginalFilename() + " nakopirovana do " + path);
					out.println("<p><strong>" + prop.getText("import_excel_action.kopia_ulozena_do", file.getOriginalFilename()) + ": </strong><a href=\"" + path + "\" target=\"_blank\">" + path + "</a></p>");
				}
			}
			catch (Exception e) {
				sk.iway.iwcm.Logger.error(e);
				out.println("<hr>ERROR: " + e.getMessage());
			}
		}

		out.println("<hr><strong>"+prop.getText("file.import_done")+"</strong><br/><br/>");

		if (request.getAttribute("disableReload") == null)
            out.println("<script type='text/javascript'>try { window.opener.location.reload(); } catch (e) { console.log(e); }</script>");

		if (setAdminLayout) {
            out.println("<style type='text/css'>#btnOk {display: none; } </style>");
            request.getRequestDispatcher("/admin/layout_bottom_dialog.jsp").include(request, response);
        } else {
            out.println("<hr>" + prop.getText("file.import_done"));
            out.println("</body></html>");
        }

		return null;
	}

	private static String printError(Prop prop, PrintWriter out) {
		out.println("<strong style='color: red'>" + prop.getText("file.import.bad_file_type") + "</strong>");
		out.println("</body></html>");
		return null;
	}
}