package ru.semiot.platform.apigateway.config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.semiot.platform.apigateway.beans.impl.ExternalQueryService; import ru.semiot.platform.apigateway.beans.impl.OSGiApiService; import rx.Observable; import rx.exceptions.Exceptions; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import javax.inject.Inject; import javax.json.JsonArray; 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/AvailableDrivers", asyncSupported = true) public class AvailableDriversHandler extends HttpServlet { private static final Logger logger = LoggerFactory .getLogger(AvailableDriversHandler.class); @Inject OSGiApiService service; @Inject ExternalQueryService extService; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { final AsyncContext ctx = req.startAsync(); Observable<JsonArray> jsonBundles = extService.getDriversJsonArray(); Observable<List<String>> listInstalledBundles = service .getPidListBundles(); Observable.zip(jsonBundles, listInstalledBundles, (jnBundles, lstInstalledBundles) -> { ctx.getRequest().setAttribute("jnBundles", jnBundles); ctx.getRequest().setAttribute("lstInstalledBundles", lstInstalledBundles); return new String(); }).subscribe(ConfigHelper.dispatch(ctx, "/configuration/AvailableDrivers")); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HashMap<String, String> parameters = getRequestParameters(request); if (request.getParameter("install") != null) { final AsyncContext ctx = request.startAsync(); String url = parameters.get("url"); Observable<InputStream> bundleIS = extService .getBundleInputStream(url); bundleIS.map((inputStream) -> { HttpSession session = request.getSession(true); session.setAttribute("inputStreamFile", inputStream); // ctx.getRequest() session.setAttribute("filename", url); try { response.sendRedirect("/config/ConfigurationDriver"); } catch (Exception e1) { throw Exceptions.propagate(e1); } return new String(); }).subscribe((__) -> {}, (Throwable e) -> logger.error(e.getMessage(), e), () -> ctx.complete()); } } private static HashMap<String, String> getRequestParameters( HttpServletRequest request) { HashMap<String, String> parameters = new HashMap<String, String>(); Enumeration _enum = request.getParameterNames(); while (_enum.hasMoreElements()) { String key = (String) _enum.nextElement(); String value = request.getParameter(key); parameters.put(key, value); } return parameters; } }