package ru.semiot.platform.apigateway.config;
import org.apache.commons.lang3.StringUtils;
import org.apache.jena.query.ResultSet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.semiot.platform.apigateway.beans.TSDBQueryService;
import ru.semiot.platform.apigateway.beans.impl.ExternalQueryService;
import ru.semiot.platform.apigateway.beans.impl.OSGiApiService;
import ru.semiot.platform.apigateway.beans.impl.SPARQLQueryService;
import rx.Observable;
import java.io.IOException;
import java.util.Enumeration;
import java.util.HashMap;
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;
@WebServlet(urlPatterns = "/config/DriversInstalled", asyncSupported = true)
public class DriversInstalledHandler extends HttpServlet {
private static final Logger logger = LoggerFactory.getLogger(DriversInstalledHandler.class);
public static final String QUERY_ID_SYSTEMS_SERNSORS_FOR_DRIVER = "SELECT DISTINCT "
+ "?system_id ?sensor_id "
+ "WHERE { "
+ "GRAPH <urn:semiot:graphs:private> { "
+ "?system semiot:hasDriver "
+ "<urn:semiot:drivers:${DRIVER}> } "
+ "?system dcterms:identifier ?system_id; "
+ "ssn:hasSubSystem ?sensor. "
+ "?sensor dcterms:identifier ?sensor_id. }";
public static final String QUERY_ID_SYSTEMS_PROCESSES_FOR_DRIVER = "SELECT DISTINCT "
+ "?system_id ?process_id "
+ "WHERE { "
+ "GRAPH <urn:semiot:graphs:private> { "
+ "?system semiot:hasDriver "
+ "<urn:semiot:drivers:${DRIVER}> } "
+ "?system dcterms:identifier ?system_id; "
+ "semiot:supportedProcess ?process. "
+ "?process dcterms:identifier ?process_id. }";
@Inject
OSGiApiService service;
@Inject
SPARQLQueryService query;
@Inject
TSDBQueryService tsdbQuery;
@Inject
ExternalQueryService externalService;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
final AsyncContext ctx = req.startAsync();
Observable<JsonArray> jsonArray = service.getBundlesJsonArray();
jsonArray.subscribe((jsArray) -> ctx.getRequest().setAttribute("jsonArray", jsArray),
(Throwable e) -> logger.warn(e.getMessage(), e),
() -> ctx.dispatch("/configuration/DriversInstalled"));
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HashMap<String, String> parameters = getRequestParameters(request);
String pid = parameters.get("id_bundle");
if (StringUtils.isNotBlank(pid)) {
if (request.getParameter("uninstall") != null) {
final AsyncContext ctx = request.startAsync();
Observable<String> unistall = service.sendPostUninstall(pid);
unistall.map((__) -> {
Observable<JsonArray> jsonArray = service.getBundlesJsonArray();
JsonArray jsArray = jsonArray.toBlocking().single();
ctx.getRequest().setAttribute("jsonArray", jsArray);
return jsArray;
}).subscribe(ConfigHelper.dispatch(ctx, "/configuration/DriversInstalled"));
} else if (request.getParameter("uninstallWithDeleteData") != null) {
final AsyncContext ctx = request.startAsync();
Observable<String> unistall = service.sendPostUninstall(pid);
unistall.map((__) -> {
Observable<ResultSet> obsSystemsRS = query.select(
QUERY_ID_SYSTEMS_SERNSORS_FOR_DRIVER.replace("${DRIVER}", pid));
ResultSet systemsSensorsRS = obsSystemsRS.toBlocking().single();
Observable<ResultSet> commresSystemsRS = query.select(
QUERY_ID_SYSTEMS_PROCESSES_FOR_DRIVER.replace("${DRIVER}", pid));
ResultSet systemsProcessesRS = commresSystemsRS.toBlocking().single();
tsdbQuery.remove(systemsSensorsRS, systemsProcessesRS).subscribe();
externalService.sendRsRemoveFromFuseki(pid).subscribe();
Observable<JsonArray> jsonArray = service.getBundlesJsonArray();
JsonArray jsArray = jsonArray.toBlocking().single();
ctx.getRequest().setAttribute("jsonArray", jsArray);
return jsArray;
}).subscribe(ConfigHelper.dispatch(ctx, "/configuration/DriversInstalled"));
}
}
}
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);
// request.get
parameters.put(key, value);
}
return parameters;
}
}