| | |
| | | import com.sun.net.httpserver.HttpExchange; |
| | | import de.uhilger.mediaz.App; |
| | | import static de.uhilger.mediaz.App.RB_EP_LISTE; |
| | | import static de.uhilger.mediaz.App.RB_EP_LISTE_ALLES; |
| | | import de.uhilger.mediaz.Server; |
| | | import static de.uhilger.mediaz.Server.RB_SLASH; |
| | | import de.uhilger.mediaz.entity.Ablageort; |
| | | import de.uhilger.mediaz.store.FileStorage; |
| | | import de.uhilger.mediaz.entity.Entity; |
| | | import de.uhilger.mediaz.entity.Geraet; |
| | | import static de.uhilger.mediaz.store.FileStorage.ST_ABLAGEORT; |
| | | import static de.uhilger.mediaz.store.FileStorage.ST_GERAET; |
| | | import de.uhilger.mediaz.store.Storage; |
| | | import java.io.IOException; |
| | | import java.net.URI; |
| | | import java.util.Iterator; |
| | | import java.util.List; |
| | | import java.util.logging.Level; |
| | | import java.util.logging.Logger; |
| | | |
| | | import java.net.http.HttpClient; |
| | | import java.net.http.HttpClient.Version; |
| | | import java.net.http.HttpClient.Redirect; |
| | | import java.net.http.HttpRequest; |
| | | import java.net.http.HttpResponse; |
| | | import java.net.http.HttpResponse.BodyHandlers; |
| | | import java.time.Duration; |
| | | import java.util.ArrayList; |
| | | |
| | | |
| | | /** |
| | | * HttpHandler fuer die Verwaltung von Entitaeten der Mediazentrale |
| | | * |
| | | * GET /mz/api/store/[typname]/[name] |
| | | * GET /mz/api/store/[typname]/liste |
| | | * GET /mz/api/store/[typname]/listealles (nur Typ Geraet) |
| | | * |
| | | * @author Ulrich Hilger |
| | | * @version 1, 5.4.2021 |
| | |
| | | @Override |
| | | protected String put(HttpExchange e) throws IOException { |
| | | String path = e.getRequestURI().toString(); |
| | | String[] elems = path.split(App.getRs(Server.RB_SLASH)); |
| | | String[] elems = path.split(Server.SLASH); |
| | | String type = elems[elems.length - 2]; |
| | | String elemName = elems[elems.length - 1]; // alter Name, wenn Aenderung |
| | | if(!elemName.equalsIgnoreCase(App.getRs(RB_EP_LISTE))) { |
| | |
| | | Object o = gson.fromJson(bodyLesen(e), fs.typeFromName(type).getType()); |
| | | if(o instanceof Entity) { |
| | | Entity entity = (Entity) o; |
| | | if(fs.exists(type, elemName)) { |
| | | if(fs.exists(type, elemName)) { // Aenderung |
| | | fs.delete(type, elemName); |
| | | // wenn Ablageort, hier noch alten Kontext entfernen |
| | | if(type.equalsIgnoreCase(FileStorage.ST_ABLAGEORT)) { |
| | | Entity aoe = fs.read(type, elemName); |
| | | if(aoe instanceof Ablageort) { |
| | | Ablageort ablageort = (Ablageort) aoe; |
| | | App.getServer().ablageortEntfernen(ablageort.getUrl()); |
| | | } |
| | | } |
| | | fs.write(entity, true); |
| | | } else { |
| | | // wenn Ablageort, hier noch neuen Kontext anlegen |
| | | if(type.equalsIgnoreCase(FileStorage.ST_ABLAGEORT)) { |
| | | if(entity instanceof Ablageort) { |
| | | Ablageort ablageort = (Ablageort) entity; |
| | | App.getServer().ablageortHinzufuegen(ablageort); |
| | | } |
| | | } |
| | | } else { // Neu |
| | | fs.write(entity, false); |
| | | // wenn Ablageort, hier noch neuen Kontext anlegen |
| | | if(type.equalsIgnoreCase(FileStorage.ST_ABLAGEORT)) { |
| | | if(entity instanceof Ablageort) { |
| | | Ablageort ablageort = (Ablageort) entity; |
| | | App.getServer().ablageortHinzufuegen(ablageort); |
| | | } |
| | | } |
| | | } |
| | | return type + App.getRs(Server.RB_SLASH) + entity.getName(); |
| | | return type + Server.SLASH + entity.getName(); |
| | | } else { |
| | | return "Ungueltiges Objekt im Body."; |
| | | } |
| | |
| | | |
| | | private boolean loeschen(HttpExchange e) { |
| | | String path = e.getRequestURI().toString(); |
| | | String[] elems = path.split(App.getRs(Server.RB_SLASH)); |
| | | String[] elems = path.split(Server.SLASH); |
| | | String type = elems[elems.length - 2]; |
| | | String elemName = elems[elems.length - 1]; |
| | | FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF))); |
| | | if(type.equalsIgnoreCase(FileStorage.ST_ABLAGEORT)) { |
| | | // im laufenden Server den Context entfernen |
| | | Entity entity = fs.read(type, elemName); |
| | | if(entity instanceof Ablageort) { |
| | | Ablageort ablageort = (Ablageort) entity; |
| | | App.getServer().ablageortEntfernen(ablageort.getUrl()); |
| | | } |
| | | } |
| | | return fs.delete(type, elemName); |
| | | } |
| | | |
| | | private String lesen(HttpExchange e) { |
| | | private String lesen(HttpExchange e) throws IOException, InterruptedException { |
| | | String path = e.getRequestURI().toString(); |
| | | String[] elems = path.split(App.getRs(Server.RB_SLASH)); |
| | | String[] elems = path.split(Server.SLASH); |
| | | FileStorage fs = new FileStorage(App.getInitParameter(App.getRs(App.RB_AP_CONF))); |
| | | if(path.endsWith(App.getRs(RB_SLASH))) { |
| | | if(path.endsWith(Server.SLASH)) { |
| | | List list = null; |
| | | if(elems[elems.length - 1].equalsIgnoreCase(App.getRs(RB_EP_LISTE))) { |
| | | if(elems[elems.length - 1].equalsIgnoreCase(App.getRs(RB_EP_LISTE_ALLES))) { |
| | | String type = elems[elems.length - 2]; |
| | | logger.fine(type); |
| | | if(type.equalsIgnoreCase(ST_GERAET)) { |
| | | list = collectDeviceStatus(fs, type); |
| | | Gson gson = new Gson(); |
| | | Object o = gson.fromJson(bodyLesen(e), fs.typeFromName(type).getType()); |
| | | return gson.toJson(list); |
| | | } |
| | | } else if(elems[elems.length - 1].equalsIgnoreCase(App.getRs(RB_EP_LISTE))) { |
| | | String type = elems[elems.length - 2]; |
| | | logger.fine(type); |
| | | list = fs.list(type); |
| | | if(type.equalsIgnoreCase(ST_ABLAGEORT)) { |
| | | list.add("Livestreams"); |
| | | } |
| | | } else { |
| | | String type = elems[elems.length - 1]; |
| | | logger.fine(type); |
| | |
| | | |
| | | @Override |
| | | public String get(HttpExchange e) { |
| | | return lesen(e); |
| | | try { |
| | | return lesen(e); |
| | | } catch (IOException | InterruptedException ex) { |
| | | Logger.getLogger(StorageHandler.class.getName()).log(Level.SEVERE, null, ex); |
| | | return ex.getLocalizedMessage(); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | |
| | | public boolean delete(HttpExchange e) { |
| | | return loeschen(e); |
| | | } |
| | | |
| | | private List collectDeviceStatus(Storage fs, String type) throws IOException, InterruptedException { |
| | | List list = fs.listObjects(type); |
| | | List<Geraet> newList = new ArrayList(); |
| | | Iterator<Entity> i = list.iterator(); |
| | | while (i.hasNext()) { |
| | | Entity entity = i.next(); |
| | | if (entity instanceof Geraet) { |
| | | Geraet g = (Geraet) entity; |
| | | String statusurl = g.getStatusUrl(); |
| | | logger.info(statusurl); |
| | | |
| | | HttpRequest request = HttpRequest.newBuilder() |
| | | .uri(URI.create(statusurl)) |
| | | .build(); |
| | | HttpClient client = HttpClient.newBuilder() |
| | | .version(Version.HTTP_1_1) |
| | | .followRedirects(Redirect.NORMAL) |
| | | .connectTimeout(Duration.ofSeconds(20)) |
| | | //.proxy(ProxySelector.of(new InetSocketAddress("proxy.example.com", 80))) |
| | | //.authenticator(Authenticator.getDefault()) |
| | | .build(); |
| | | HttpResponse<String> response = client.send(request, BodyHandlers.ofString()); |
| | | logger.finer(Integer.toString(response.statusCode())); |
| | | logger.finer(response.body()); |
| | | // {"ison":false,"has_timer":false,"overpower":false} |
| | | String[] parts = response.body().split(",")[0].split(":"); |
| | | logger.finer("ison: " + parts[1]); |
| | | g.setStatus(Boolean.parseBoolean(parts[1])); |
| | | newList.add(g); |
| | | } |
| | | } |
| | | return newList; |
| | | } |
| | | } |