Persoenliche Mediazentrale
ulrich
2021-04-04 2b6134e50801f9fc66a27a2d565340f5773f251f
ResourceBundle eingebaut
2 files renamed
1 files added
2 files modified
141 ■■■■■ changed files
src/de/uhilger/mediaz/App.java 39 ●●●●● patch | view | raw | blame | history
src/de/uhilger/mediaz/Server.java 23 ●●●●● patch | view | raw | blame | history
src/de/uhilger/mediaz/api/FileHandler.java 38 ●●●●● patch | view | raw | blame | history
src/de/uhilger/mediaz/api/StopServerHandler.java 16 ●●●● patch | view | raw | blame | history
src/mediaz_de_DE.properties 25 ●●●●● patch | view | raw | blame | history
src/de/uhilger/mediaz/App.java
@@ -20,6 +20,7 @@
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -31,12 +32,20 @@
  private static final Logger logger = Logger.getLogger(App.class.getName());
  public static final String IP_PORT = "port";
  public static final String IP_WWW_DATA = "www-data";
  public static final String IP_CTX = "ctx";
  public static final String IP_CONF = "conf";
  private static HashMap initParams;
  /* ResourceBundle dieser App */
  private static ResourceBundle rb;
  /* Name des ResourceBundles dieser App */
  private static final String RB_NAME = "mediaz";
  /* ResourceBundle-Kennungen */
  public static final String RB_PARAM_FEHLT = "msgParamFehlt";
  public static final String RB_AP_PORT = "appParamPort";
  public static final String RB_AP_CONF = "appParamConf";
  public static final String RB_AP_WWW_DATA = "appParamWWWData";
  public static final String RB_AP_CTX = "appParamCtx";
  /**
   * <p>Start-Methode dieser Anwendung</p>
@@ -44,7 +53,7 @@
   * @param args Kommandozeilenparameter
   */
  public static void main(String[] args) {
    rb = ResourceBundle.getBundle(RB_NAME);
    logger.info(new File(".").getAbsolutePath());
    
    initParams = new HashMap();
@@ -53,29 +62,29 @@
      initParams.put(argParts[0], argParts[1]);
    }
    String portStr = getInitParameter(IP_PORT);
    String portStr = getInitParameter(getRs(RB_AP_PORT));
    if (portStr != null) {
      Server server = new Server(Integer.parseInt(portStr));
      try {
        String ctxName = getInitParameter(IP_CTX);
        String ctxName = getInitParameter(getRs(RB_AP_CTX));
        if (ctxName != null) {
          server.setContextName(ctxName);
          server.start();
        } else {
          logger.severe("Der Parameter " + IP_CTX + " muss angegeben werden.");
          logger.log(Level.INFO, getRs(RB_PARAM_FEHLT), getRs(RB_AP_CTX));
        }
        String conf = getInitParameter(IP_CONF);
        String conf = getInitParameter(getRs(RB_AP_CONF));
        if(conf != null) {
          File confDir = new File(conf);
          confDir.mkdirs();
        } else {
          logger.log(Level.INFO, App.getRs(RB_PARAM_FEHLT), getRs(RB_AP_CONF));
        }
      } catch (IOException ex) {
        Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
        logger.log(Level.SEVERE, null, ex);
      }
    } else {
      logger.severe("Der Parameter " + IP_PORT + " muss angegeben werden.");
      logger.log(Level.INFO, App.getRs(RB_PARAM_FEHLT), getRs(RB_AP_PORT));
    }
  }
@@ -102,4 +111,8 @@
    return param;
  }
  public static String getRs(String key) {
    return rb.getString(key);
  }
}
src/de/uhilger/mediaz/Server.java
@@ -18,12 +18,14 @@
package de.uhilger.mediaz;
import com.sun.net.httpserver.HttpServer;
import de.uhilger.mediaz.handler.FileHandler;
import de.uhilger.mediaz.handler.StopServerHandler;
import de.uhilger.mediaz.api.FileHandler;
import de.uhilger.mediaz.api.StopServerHandler;
import java.io.IOException;
import java.util.logging.Logger;
import java.net.InetSocketAddress;
import java.util.ResourceBundle;
import java.util.concurrent.Executors;
import java.util.logging.Level;
/**
 * Die Klasse Server stellt Methoden zur Ausf&uuml;hrung eines 
@@ -36,8 +38,10 @@
  
  private static final Logger logger = Logger.getLogger(Server.class.getName());
  
  public static final String STR_SLASH = "/";
  public static final String CMD_SERVER_STOP = "/server/stop";
  public static final String RB_SERVER_START_MSG = "msgServerStart";
  public static final String RB_WEBROOT = "webroot";
  public static final String RB_STOP_SERVER = "stopServer";
  public static final String RB_SLASH = "slash";
  
  private int port;
  
@@ -66,8 +70,9 @@
   * @param ctxName Name des Kontexts, unter dem der Server aufrufbar sein soll
   */
  public void setContextName(String ctxName) {
    if(!ctxName.startsWith(STR_SLASH)) {
      this.ctx = STR_SLASH + ctxName;
    String slash = App.getRs(RB_SLASH);
    if(!ctxName.startsWith(slash)) {
      this.ctx = slash + ctxName;
    } else {
      this.ctx = ctxName;
    }
@@ -81,11 +86,11 @@
   * in diesem Objekt 
   */
  public void start() throws IOException {
    logger.info("Server starting on port " + port);
    logger.log(Level.INFO, App.getRs(RB_SERVER_START_MSG), Integer.toString(port));
    HttpServer server = HttpServer.create(new InetSocketAddress(port), 0);
    server.createContext(ctx + STR_SLASH, new FileHandler(App.getInitParameter(App.IP_WWW_DATA)));
    server.createContext(ctx + CMD_SERVER_STOP, new StopServerHandler());
    server.createContext(ctx + App.getRs(RB_WEBROOT), new FileHandler(App.getInitParameter(App.getRs(App.RB_AP_WWW_DATA))));
    server.createContext(ctx + App.getRs(RB_STOP_SERVER), new StopServerHandler());
    server.setExecutor(Executors.newFixedThreadPool(20));
    server.start();
  }
src/de/uhilger/mediaz/api/FileHandler.java
File was renamed from src/de/uhilger/mediaz/handler/FileHandler.java
@@ -15,12 +15,14 @@
  You should have received a copy of the GNU Affero General Public License
  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
package de.uhilger.mediaz.handler;
package de.uhilger.mediaz.api;
import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import de.uhilger.mediaz.App;
import de.uhilger.mediaz.Server;
import static de.uhilger.mediaz.Server.RB_SLASH;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@@ -68,15 +70,17 @@
  public static final String HTTP_GET = "GET";
  
  /* String Konstanten */
  public static final String STR_BYTES = "bytes";
  public static final String STR_BLANK = " ";
  public static final String STR_DASH = "-";
  public static final String STR_COMMA = ",";
  public static final String STR_DOT = ".";
  public static final String STR_NOT_FOUND = " not found.";
  public static final String LM_PATTERN = "EEE, dd MMM yyyy HH:mm:ss zzz";
  public static final String RANGE_PATTERN = "[^\\d-,]";
  public static final String WELCOME_FILE = "index.html";
  /* ResourceBundle-Kennungen */
  public static final String RB_BYTES = "bytes";
  public static final String RB_DASH = "dash";
  public static final String RB_NOT_FOUND = "notFound";
  public static final String RB_LM_PATTERN = "lmPattern";
  public static final String RB_RANGE_PATTERN = "rangePattern";
  public static final String RB_WELCOME_FILE = "welcomeFile";
  /* Ablageort fuer Webinhalte */
  private final String fileBase;
@@ -111,8 +115,8 @@
      if (headers.containsKey(RANGE_HEADER)) {
        serveFileParts(e, new File(fileBase, fName));
      } else {
        if (fName.length() < 1 || fName.endsWith(Server.STR_SLASH)) {
          fName += WELCOME_FILE;
        if (fName.length() < 1 || fName.endsWith(App.getRs(RB_SLASH))) {
          fName += App.getRs(RB_WELCOME_FILE);
        }
        serveFile(e, new File(fileBase, fName));
      }
@@ -254,7 +258,7 @@
      Der regulaere Ausdruck "[^\\d-,]" bezeichnet alle Zeichen, die keine 
      Ziffern 0-9, Bindestrich oder Komma sind.
     */
    rangeHeader = rangeHeader.replaceAll(RANGE_PATTERN, "");
    rangeHeader = rangeHeader.replaceAll(App.getRs(RB_RANGE_PATTERN), "");
    /*
      Die Ranges ermitteln. 
@@ -277,7 +281,7 @@
    String[] rangeArray = rangeHeader.split(STR_COMMA);
    for (String rangeStr : rangeArray) {
      Range range = new Range();
      String[] values = rangeStr.split(STR_DASH);
      String[] values = rangeStr.split(App.getRs(RB_DASH));
      if (values.length < 2) {
        // Fall 3
        range.setStart(Long.parseLong(values[0]));
@@ -308,12 +312,12 @@
   */
  protected String contentRangeHdr(Range range, File file) {
    StringBuilder sb = new StringBuilder();
    sb.append(STR_BYTES);
    sb.append(App.getRs(RB_BYTES));
    sb.append(STR_BLANK);
    sb.append(range.getStart());
    sb.append(STR_DASH);
    sb.append(App.getRs(RB_DASH));
    sb.append(range.getEnd());
    sb.append(Server.STR_SLASH);
    sb.append(App.getRs(RB_SLASH));
    sb.append(file.length());
    return sb.toString();
  }
@@ -330,12 +334,12 @@
   */
  protected void setHeaders(HttpExchange e, File file) throws IOException {
    Headers resHeaders = e.getResponseHeaders();
    resHeaders.add(ACCEPT_RANGES_HEADER, STR_BYTES);
    resHeaders.add(ACCEPT_RANGES_HEADER, App.getRs(RB_BYTES));
    String mimeType = Files.probeContentType(file.toPath());
    if (mimeType != null) {
      resHeaders.add(CONTENT_TYPE, mimeType);
    }
    SimpleDateFormat sdf = new SimpleDateFormat(LM_PATTERN);
    SimpleDateFormat sdf = new SimpleDateFormat(App.getRs(RB_LM_PATTERN));
    Date date = new Date(file.lastModified());
    resHeaders.add(LAST_MODIFIED_DATE_HEADER, sdf.format(date));
  }
@@ -350,7 +354,7 @@
   */
  protected void sendNotFound(HttpExchange e, String fname) throws IOException {
    OutputStream os = e.getResponseBody();
    String response = fname + STR_NOT_FOUND;
    String response = fname + STR_BLANK + App.getRs(RB_NOT_FOUND);
    byte[] bytes = response.getBytes(StandardCharsets.UTF_8);
    e.sendResponseHeaders(SC_NOT_FOUND, bytes.length);
    os.write(bytes);
src/de/uhilger/mediaz/api/StopServerHandler.java
File was renamed from src/de/uhilger/mediaz/handler/StopServerHandler.java
@@ -15,7 +15,7 @@
  You should have received a copy of the GNU Affero General Public License
  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
package de.uhilger.mediaz.handler;
package de.uhilger.mediaz.api;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
@@ -33,6 +33,14 @@
 */
public class StopServerHandler implements HttpHandler {
  /* Der Logger fuer diesen StopServerHandler */
  private static final Logger logger = Logger.getLogger(StopServerHandler.class.getName());
  /* ResourceBundle-Kennungen */
  public static final String RB_STOPPING_SERVER = "stoppingServer";
  public static final String RB_SERVER_STOPPED = "serverStopped";
  public static final String RB_MEDIAZ_END = "mediazEnd";
  /**
   * Den Server geordnet herunterfahren und 
   * dann die Anwendung beenden.
@@ -44,13 +52,13 @@
  @Override
  public void handle(HttpExchange e) throws IOException {
    Logger.getLogger(StopServerHandler.class.getName()).info(e.getRequestURI().toString());
    String response = "Server stopped";
    String response = App.getRs(RB_SERVER_STOPPED);
    e.sendResponseHeaders(200, response.length());
    OutputStream os = e.getResponseBody();
    os.write(response.getBytes());
    os.flush();
    os.close();
    Logger.getLogger(StopServerHandler.class.getName()).info("stopping server.");
    logger.info(App.getRs(RB_STOPPING_SERVER));
    e.getHttpContext().getServer().stop(1);
    Timer timer = new Timer();
    timer.schedule(new AppStopper(), 2000);
@@ -64,7 +72,7 @@
    @Override
    public void run() {
      Logger.getLogger(StopServerHandler.class.getName()).info("Mediazentrale beendet.");
      logger.info(App.getRs(RB_MEDIAZ_END));
      App.stop();
    }
  }
src/mediaz_de_DE.properties
New file
@@ -0,0 +1,25 @@
# App-Parameter
appParamPort=port
appParamConf=conf
appParamWWWData=www-data
appParamCtx=ctx
# API-Endpunkte
webroot=/
stopServer=/server/stop
slash=/
dash=-
bytes=bytes
notFound=not found.
lmPattern=EEE, dd MMM yyyy HH:mm:ss zzz
rangePattern=[^\\d-,]
welcomeFile=index.html
stoppingServer=stopping server.
serverStopped=Server stopped.
mediazEnd=Mediazentrale beendet.
# Mitteilungen
msgServerStart=Server starting on port {0}
msgParamFehlt=Der Parameter {0} muss angegeben werden.