package ru.semiot.platform.apigateway.config; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.semiot.platform.apigateway.beans.TSDBQueryService; import ru.semiot.platform.apigateway.beans.impl.OSGiApiService; import ru.semiot.platform.apigateway.utils.DataBase; import rx.Observable; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.StringReader; import java.util.Enumeration; import java.util.HashMap; import java.util.Map.Entry; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import javax.inject.Inject; import javax.json.Json; import javax.json.JsonObject; import javax.json.JsonReader; import javax.servlet.AsyncContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @WebServlet(urlPatterns = "/config/ConfigurationDriver", asyncSupported = true) public class ConfigurationDriverHandler extends HttpServlet { private static final Logger logger = LoggerFactory .getLogger(ConfigurationDriverHandler.class); static final String nameConfigFile = "config-schema.jsonld"; @Inject private OSGiApiService service; @Inject private TSDBQueryService tsdb; @Inject private DataBase db; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { final AsyncContext ctx = request.startAsync(); HttpSession session = request.getSession(true); InputStream is = (InputStream) session.getAttribute("inputStreamFile"); session.removeAttribute("inputStreamFile"); byte[] byteArray = IOUtils.toByteArray(is); InputStream input1 = new ByteArrayInputStream(byteArray); InputStream input2 = new ByteArrayInputStream(byteArray); ZipInputStream zis = new ZipInputStream(input1); ZipEntry ze = zis.getNextEntry(); StringBuilder s = new StringBuilder(); byte[] buffer = new byte[1024]; int read = 0; while (ze != null) { String name = ze.getName(); if (name.contains(nameConfigFile)) { while ((read = zis.read(buffer, 0, 1024)) >= 0) { s.append(new String(buffer, 0, read)); } break; } ze = zis.getNextEntry(); } JsonObject jsonConfig = null; try (JsonReader reader = Json .createReader(new StringReader(s.toString()))) { jsonConfig = reader.readObject(); } catch (Exception e) { e.printStackTrace(); } session.setAttribute("inputStreamFile", input2); session.setAttribute("jsonConfig", jsonConfig); ctx.dispatch("/configuration/ConfigurationDriver"); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HashMap<String, String> parameters = getRequestParameters(request); if (request.getParameter("save") != null || request.getParameter("configure") != null) { StringBuilder propertyList = new StringBuilder(); if (parameters.size() < 1) { return; } for (Entry<String, String> entry : parameters.entrySet()) { if (propertyList.length() > 0) { propertyList.append(","); } propertyList.append(entry.getKey()); } parameters.put("apply", "true"); parameters.put("propertylist", propertyList.toString()); final AsyncContext ctx = request.startAsync(); HttpSession session = request.getSession(true); String pid = (String) session.getAttribute("pid"); session.removeAttribute("pid"); Observable<String> post = null; if (request.getParameter("save") != null) { parameters.remove("save"); // ЗАГРУЗКА!!!!!!!!!!!!! InputStream is = (InputStream) session.getAttribute("inputStreamFile"); String filename = (String) session.getAttribute("filename"); session.removeAttribute("inputStreamFile"); session.removeAttribute("filename"); post = service.sendPostUploadFile(is, filename, pid, parameters); } post.subscribe((symbolicName) -> {}, (Throwable e) -> logger.error(e.getMessage(), e), () -> { try { // response.flushBuffer(); response.sendRedirect("/config/DriversInstalled"); } catch (Exception e1) { logger.error(e1.getMessage(), e1); } ctx.complete(); }); } else { response.sendRedirect("/config/DriversInstalled"); } } private static HashMap<String, String> getRequestParameters( HttpServletRequest request) { HashMap<String, String> parameters = new HashMap<>(); Enumeration _enum = request.getParameterNames(); while (_enum.hasMoreElements()) { String key = (String) _enum.nextElement(); String value = request.getParameter(key); parameters.put(key, value); } return parameters; } }