src/de/uhilger/mediaz/App.java | ●●●●● patch | view | raw | blame | history | |
src/de/uhilger/mediaz/Server.java | ●●●●● patch | view | raw | blame | history | |
src/de/uhilger/mediaz/api/FileHandler.java | ●●●●● patch | view | raw | blame | history | |
src/de/uhilger/mediaz/api/StopServerHandler.java | ●●●●● patch | view | raw | blame | history | |
src/mediaz_de_DE.properties | ●●●●● 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)); } } @@ -101,5 +110,9 @@ } 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ü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; @@ -32,6 +32,14 @@ * @author Ulrich Hilger */ 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 @@ -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.