/*
|
Tango - Personal Media Center
|
Copyright (C) 2021 Ulrich Hilger
|
|
This program is free software: you can redistribute it and/or modify
|
it under the terms of the GNU Affero General Public License as
|
published by the Free Software Foundation, either version 3 of the
|
License, or (at your option) any later version.
|
|
This program is distributed in the hope that it will be useful,
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
GNU Affero General Public License for more details.
|
|
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.tango.api;
|
|
import com.sun.net.httpserver.HttpExchange;
|
import com.sun.net.httpserver.HttpHandler;
|
import de.uhilger.tango.App;
|
import java.io.IOException;
|
import java.io.OutputStream;
|
import java.util.Timer;
|
import java.util.TimerTask;
|
import java.util.logging.Logger;
|
|
/**
|
* Ein HTTP-Handler zum Stoppen der Anwendung
|
*
|
* @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
|
* dann die Anwendung beenden.
|
*
|
* @param e das Objekt mit Methoden zur Untersuchung der Anfrage sowie zum
|
* Anfertigen und Senden der Antwort
|
* @throws IOException falls etwas schief geht entsteht dieser Fehler
|
*/
|
@Override
|
public void handle(HttpExchange e) throws IOException {
|
Logger.getLogger(StopServerHandler.class.getName()).info(e.getRequestURI().toString());
|
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.info(App.getRs(RB_STOPPING_SERVER));
|
e.getHttpContext().getServer().stop(1);
|
Timer timer = new Timer();
|
timer.schedule(new AppStopper(), 2000);
|
}
|
|
/**
|
* Die Klasse AppStopper ermöglicht das asnychrone bzw.
|
* zeitgesteuerte Stoppen der Anwendung.
|
*/
|
class AppStopper extends TimerTask {
|
|
@Override
|
public void run() {
|
logger.info(App.getRs(RB_MEDIAZ_END));
|
App.stop();
|
}
|
}
|
|
}
|