/*
|
neon-image - Image extensions to Neon
|
Copyright (C) 2024 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.neon.image;
|
|
import com.sun.net.httpserver.Filter;
|
import com.sun.net.httpserver.HttpExchange;
|
import de.uhilger.neon.FileServer;
|
import java.io.IOException;
|
|
/**
|
* Der ImageFilter erzeugt verkleinerte Versionen einer Bilddatei
|
* nach Bedarf. Wenn die gewuenschte Dateigroesse noch nicht existiert
|
* oder die Originaldatei neuer ist als die verkleinerte Fassung,
|
* wird die verkleinerte Fassung neu erzeugt.
|
*
|
* Fuer jede Anfrage, wird geprueft ob eine Bilddatei angefragt ist,
|
* deren Dateiname einen der folgenden Namenszusaetze enthaelt:
|
*
|
* 120 - "_tn"
|
* 240 - "_kl"
|
* 500 - "_sm"
|
* 700 - "_mt"
|
* 1200 - "_gr"
|
*
|
* Fuer diese wird geprueft, ob die Datei existiert. Wenn nicht, wird geprueft,
|
* ob eine Bilddatei mit Dateiname ohne Namenszusatz existiert. Wenn ja, wird
|
* aus dieser Datei die gewuenschte Fassung erzeugt.
|
*
|
* Beispiel:
|
* Fuer die Anfrage nach /daten/mein-bild_tn.png wird aus der Datei
|
* /daten/mein-bild.png eine verkleinerte Fassung der Groesse 120 Bildpunkte
|
* entlang der laengsten Kante erzeugt, als /daten/mein-bild_tn.png gespeichert
|
* und ausgeliefert.
|
*
|
* Der Filter benoetigt das Attribut
|
* FileHandler.ATTR_FILE_BASE
|
* im HttpContext
|
*
|
* @author Ulrich Hilger
|
* @version 1, 30.06.2021
|
*/
|
public class ImageFilter extends Filter {
|
|
public static final String DESCRIPTION = "ImageFilter";
|
|
@Override
|
public void doFilter(HttpExchange exchange, Chain chain) throws IOException {
|
/*
|
Regex fuer Bilder
|
.+\.jpg|.+\.jpeg|.+\.png
|
(Testen z.B. auf https://regexr.com/)
|
*/
|
String pattern = (String) exchange.getHttpContext().getAttributes()
|
.getOrDefault("imageFilterPattern", ".+\\.jpg|.+\\.jpeg|.+\\.png");
|
String uriStr = exchange.getRequestURI().toString();
|
if(uriStr.toLowerCase().matches(pattern)) {
|
String fileBase = (String) exchange.getHttpContext().getAttributes()
|
.get(FileServer.ATTR_FILE_BASE);
|
String fileName = exchange
|
.getRequestURI()
|
.getPath()
|
.substring(exchange
|
.getHttpContext()
|
.getPath()
|
.length());
|
new ImageWorker().createImages(fileBase, fileName, uriStr);
|
}
|
chain.doFilter(exchange);
|
}
|
|
@Override
|
public String description() {
|
return DESCRIPTION;
|
}
|
|
}
|