Newer
Older
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import java.net.HttpURLConnection;
public void handle(HttpExchange hex) throws IOException {
HttpsExchange he = (HttpsExchange) hex;
Alfredo Chissotti
committed
if (requestMethod.compareToIgnoreCase("options") == 0) {
Alfredo Chissotti
committed
return;
}
Alfredo Chissotti
committed
if (requestMethod.compareToIgnoreCase("POST") != 0) {
Helper.sendCors(he, 405);
return;
}
String body = Helper.readBody(he.getRequestBody());
// verifica user
String user = Helper.checkTokenGetUser(he);
if (user == null) {
Alfredo Chissotti
committed
JSONObject j = null;
try {
j = new JSONObject(body);
Alfredo Chissotti
committed
String dm = j.getString("domain");
Dominio d = DBC.getDom(dm);
if (d != null) {
Helper.sendCors(he, 403);
Alfredo Chissotti
committed
} catch (JSONException | SQLException e) {
e.printStackTrace();
return;
}
Alfredo Chissotti
committed
// inserisco i dati nel DB
try {
// qui leggo e parsifico i json nel body, inserisco tutti i campi nel db
String domain = j.getString("domain");
DBC.insertDom(domain);
// questa chiamata serve ad assicurarsi che l'utente che ha effettuato la
// chiamata sia anche amministratore del dominio
JSONArray arrUsers = j.getJSONArray("users");
int k = 0;
boolean didUserSetHimself = false;
while (k < arrUsers.length()) {
JSONObject userObj = arrUsers.getJSONObject(k);
k++;
Alfredo Chissotti
committed
String usr = userObj.getString("user");
if (user.equals(usr)) {//se l'utente e' colui che ha fatto la chiamata, l'ho gia' sistemato => passo al successivo
if(!userObj.getString("role").equals("A")){//the user didn't set himself as an admin, we have to correct that
arrUsers.put(k-1, userObj.put("role","A"));//new JSONObject().put("user", usr).put("role", "A").put("passwd", userObj.getString("passwd")));
}
Alfredo Chissotti
committed
continue;
Alfredo Chissotti
committed
if (userObj.getString("role").equals("A")) {
DBC.insertAmministra(usr, domain);
} else if (userObj.getString("role").equals("U")) {
DBC.insertUsa(usr, domain);
} else
System.err.println(userObj.toString());
if(!didUserSetHimself){//l'utente non si e' settato lui stesso come amministratore, lo faccio io
arrUsers.put(new JSONObject().put("user", user).put("role", "A").put("passwd", user));
Alfredo Chissotti
committed
JSONArray arrServ = j.getJSONArray("services");// array con solo il nome dei servizi da installare
Alfredo Chissotti
committed
ArrayList<String> moduleHosts = new ArrayList<String>();
for (int i = 0; i < arrServ.length(); i++) {
String modul = arrServ.getString(i).replace("gpio","bbgpio").replace("arduino","AinDout_Arduino1wifi");
Alfredo Chissotti
committed
moduleHosts.addAll(DBC.insertService(domain, modul));
}
Alfredo Chissotti
committed
// divido gli host in base al loro module
// Per ogni host e module, associo ad ogni module tutti i suoi host
// moduleHosts puo' avere module0---host1 e module0---host2, hostsMap unisce i due host sullo stesso module
Alfredo Chissotti
committed
HashMap<String, ArrayList<String>> hostsMap = new HashMap<String, ArrayList<String>>();
for (String mh : moduleHosts) {
String[] mhSplit = mh.split("---");
String module = mhSplit[0];
String host = mhSplit[1];
ArrayList<String> hostsList;
if (hostsMap.containsKey(module)) {
hostsList = hostsMap.get(module);
} else {
hostsList = new ArrayList<String>();
hostsMap.put(module, hostsList);
}
hostsList.add(host);
// System.out.println("riga 120 modulo = "+ module + " host = "+ host);
Alfredo Chissotti
committed
}
// imposta correttamente l'array dei servizi
JSONArray arrServiziFinale = new JSONArray();
for (int i = 0; i < arrServ.length(); i++) {
JSONObject row = new JSONObject();
String mod = arrServ.getString(i).replace("gpio","bbgpio").replace("arduino","AinDout_Arduino1wifi");
// System.out.println("mod = "+mod + " indice = "+i);
Alfredo Chissotti
committed
ArrayList<String> ho = hostsMap.get(mod);
Alfredo Chissotti
committed
for (String h : ho) {
row.put("host", h.replace("BB1","luci"));
row.put("service", mod);
Alfredo Chissotti
committed
row.put("uri", DBC.getURI(mod));
arrServiziFinale.put(row);
}
}
// System.out.println("riga 137 arrServiziFinale = "+arrServiziFinale);
Alfredo Chissotti
committed
j.put("services", arrServiziFinale);
Alfredo Chissotti
committed
} catch (SQLException | JSONException e) {
Alfredo Chissotti
committed
// ora bisogna fare la chiamata al CloudApp, non prima!
// effettuo chiamata a CloudAppManager
// è una chiamata annidata nella risposta alla webapp
// -richiesta REST da webApp a /install
// -prendo da DB e poi chiamo CloudAppMng su /install
// -attendo risposta da CloudAppMng e chiudo
// -rispondo a webApp e chiudo
// EZ
HttpURLConnection con = Helper.sendMessageToCloudapp("install", j.toString());
Alfredo Chissotti
committed
int status = con.getResponseCode();
Alfredo Chissotti
committed
// FIXME serve avere anche il content?
// String cloudappResponse = Helper.getResponseFromConnection(con);
Alfredo Chissotti
committed
con.disconnect();
// finita chiamata a CloudApp
Helper.sendCors(he, status);