App zur Steuerung des mpv Mediaplayers auf einem Raspberry Pi über HTTP
ulrich
2021-03-24 cd13d928c8c2108c4fc6025ac617562bb8d3f9f6
commit | author | age
b5cc80 1 /*
U 2  * To change this license header, choose License Headers in Project Properties.
3  * To change this template file, choose Tools | Templates
4  * and open the template in the editor.
5  */
6 package de.uhilger.avdirektor.handler;
7
8 import com.sun.net.httpserver.HttpExchange;
9 import com.sun.net.httpserver.HttpHandler;
10 import java.io.IOException;
11 import java.io.OutputStream;
12 import java.util.HashMap;
13 import java.util.Map;
14 import java.util.Set;
15 import java.util.logging.Level;
16 import java.util.logging.Logger;
17
18 /**
19  *
20  * @author ulrich
21  */
22 public abstract class AbstractHandler extends OMXPlayer implements HttpHandler {
23
24   private static final Logger logger = Logger.getLogger(AbstractHandler.class.getName());
25   
26   protected String cmd;
27   protected Map map;
28   
29   @Override
30   public void handle(HttpExchange t) throws IOException {
31     logger.log(Level.FINE, "RequestURI: {0}", t.getRequestURI().toString());
32     StringBuilder params = buildParams(t);
33     String antwort = process(t, params.toString());
34     sendResponse(t, cmd, antwort);
35   }
36   
37   protected abstract String process(HttpExchange t, String params);
38   
39   protected StringBuilder buildParams(HttpExchange t) {
40     map = getQueryMap(t);
41     StringBuilder params = new StringBuilder();
42     return params;
43   }
44   
45   protected void sendResponse(HttpExchange t, String cmd, String antwort) throws IOException {
46     String response = getResponseString(map, cmd, antwort);
47     t.sendResponseHeaders(200, response.length());
48     OutputStream os = t.getResponseBody();
49     os.write(response.getBytes());
50     os.close();    
51   }
52   
53   public void setCmd(String cmd) {
54     this.cmd = cmd;
55   }
56   
57   public String getCmd(String cmd) {
58     return this.cmd;
59   }
60
61   /* --- --- */
62   
63   protected String getParam(Map map, String key) {
64     Object o = map.get(key);
65     if(o != null) {
66       return o.toString();
67     } else {
68       return null;
69     }
70   }
71   
72   /*
73     Den Query-Teil einer URL in die Parameter zerlegen
74   
75     Die Zerlegung erfolgt mit String.split nach 
76     & und dann nach =
77   */
78   protected Map getQueryMap(HttpExchange t) {
79     HashMap map = new HashMap();
80     String query = t.getRequestURI().getQuery();
81     if(query != null && query.length() > 0) {
82       String qParts[] = query.split("&");
83       for(String qPart : qParts) {
84         logger.finer("qPart: " + qPart);
85         String pParts[] = qPart.split("=");
86         map.put(pParts[0], pParts[1]);
87         logger.finer("pParts[0]: " + pParts[0] + ", pParts[1]: " + pParts[1]);
88       }
89     }
90     return map;
91   }
92   
93   protected String getResponseString(Map map, String cmd, String antwort) {
94     Set keys = map.keySet();
95     StringBuilder buf = new StringBuilder();
96     buf.append(cmd);
97     buf.append(System.lineSeparator());
98     keys.forEach((Object key) -> {
99       buf.append("key: ");
100       buf.append(key);
101       buf.append(System.lineSeparator());
102       buf.append("value: "); 
103       buf.append(map.get(key));
104       buf.append(System.lineSeparator());
105       //logger.log(Level.FINE, "key {0} value {1}", new Object[]{key, map.get(key)});
106     });
107     buf.append(antwort);
108     return buf.toString();
109   }
110     
111   
112 }