package zx.soft.zk.manager.controller;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.zookeeper.KeeperException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import zx.soft.zk.manager.dao.Dao;
import zx.soft.zk.manager.utils.ServletUtil;
import zx.soft.zk.manager.utils.ZooKeeperUtil;
@WebServlet(urlPatterns = { "/import" })
@MultipartConfig(fileSizeThreshold = 1024 * 1024 * 10, // 10 MB
maxFileSize = 1024 * 1024 * 50, // 50 MB
maxRequestSize = 1024 * 1024 * 100)
// 100 MB
public class Import extends HttpServlet {
private static final long serialVersionUID = 8804574480729624940L;
private final static Logger logger = LoggerFactory.getLogger(Import.class);
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException {
logger.debug("Importing Action!");
try {
Properties globalProps = (Properties) this.getServletContext().getAttribute("globalProps");
Dao dao = new Dao(globalProps);
String zkServer = globalProps.getProperty("zkServer");
String[] zkServerLst = zkServer.split(",");
StringBuilder sbFile = new StringBuilder();
String scmOverwrite = "false";
String scmServer = "";
String scmFilePath = "";
String scmFileRevision = "";
String uploadFileName = "";
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1034);
ServletFileUpload upload = new ServletFileUpload(factory);
List<?> items = upload.parseRequest(request);
Iterator<?> iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (item.isFormField()) {
if (item.getFieldName().equals("scmOverwrite")) {
scmOverwrite = item.getString();
}
if (item.getFieldName().equals("scmServer")) {
scmServer = item.getString();
}
if (item.getFieldName().equals("scmFilePath")) {
scmFilePath = item.getString();
}
if (item.getFieldName().equals("scmFileRevision")) {
scmFileRevision = item.getString();
}
} else {
uploadFileName = item.getName();
sbFile.append(item.getString());
}
}
InputStream inpStream;
if (sbFile.toString().length() == 0) {
uploadFileName = scmServer + scmFileRevision + "@" + scmFilePath;
logger.debug("P4 file Processing " + uploadFileName);
dao.insertHistory((String) request.getSession().getAttribute("authName"), request.getRemoteAddr(),
"Importing P4 File: " + uploadFileName + "<br/>" + "Overwrite: " + scmOverwrite);
URL url = new URL(uploadFileName);
URLConnection conn = url.openConnection();
inpStream = conn.getInputStream();
} else {
logger.debug("Upload file Processing " + uploadFileName);
dao.insertHistory((String) request.getSession().getAttribute("authName"), request.getRemoteAddr(),
"Uploading File: " + uploadFileName + "<br/>" + "Overwrite: " + scmOverwrite);
inpStream = new ByteArrayInputStream(sbFile.toString().getBytes());
}
// open the stream and put it into BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(inpStream));
String inputLine;
List<String> importFile = new ArrayList<>();
Integer lineCnt = 0;
while ((inputLine = br.readLine()) != null) {
lineCnt++;
// Empty or comment?
if (inputLine.trim().equals("") || inputLine.trim().startsWith("#")) {
continue;
}
if (inputLine.startsWith("-")) {
//DO nothing.
} else if (!inputLine.matches("/.+=.+=.*")) {
throw new IOException("Invalid format at line " + lineCnt + ": " + inputLine);
}
importFile.add(inputLine);
}
br.close();
ZooKeeperUtil.INSTANCE.importData(importFile, Boolean.valueOf(scmOverwrite),
ServletUtil.INSTANCE.getZookeeper(request, response, zkServerLst[0]));
for (String line : importFile) {
if (line.startsWith("-")) {
dao.insertHistory((String) request.getSession().getAttribute("authName"), request.getRemoteAddr(),
"File: " + uploadFileName + ", Deleting Entry: " + line);
} else {
dao.insertHistory((String) request.getSession().getAttribute("authName"), request.getRemoteAddr(),
"File: " + uploadFileName + ", Adding Entry: " + line);
}
}
request.getSession().setAttribute("flashMsg", "Import Completed!");
response.sendRedirect("/home");
} catch (FileUploadException | IOException | InterruptedException | KeeperException ex) {
ServletUtil.INSTANCE.renderError(request, response, ex.getMessage());
}
}
}