1.1 --- a/java/nekurak.net-web/src/java/cz/frantovo/nekurak/servlet/Fotky.java Tue Mar 16 13:32:31 2010 +0100
1.2 +++ b/java/nekurak.net-web/src/java/cz/frantovo/nekurak/servlet/Fotky.java Sun Jun 20 14:46:47 2010 +0200
1.3 @@ -37,91 +37,91 @@
1.4 */
1.5 public class Fotky extends HttpServlet {
1.6
1.7 - /** Název inicializačního parametru */
1.8 - private static final String INIT_ADRESAR = "adresar";
1.9 - /** Název podadresáře obsahujícího fotku v plném rozlišení */
1.10 - public static final String PODADRESAR_ORIGINAL = "original";
1.11 - /** Název podadresáře obsahujícího výchozí náhled fotky */
1.12 - public static final String PODADRESAR_NAHLED = "nahled";
1.13 - public static final String PRIPONA = "jpg";
1.14 - private static final String LOMITKO = File.separator;
1.15 - /** Regulární výraz */
1.16 - private static final String VZOR_CESTY = "^" + LOMITKO + "(" + PODADRESAR_ORIGINAL + "|" + PODADRESAR_NAHLED + ")" + LOMITKO + "\\d+\\." + PRIPONA + "$";
1.17 - private static final String MIME_TYP = "image/jpeg";
1.18 - private File adresar;
1.19 - private static final Logger log = Logger.getLogger(Fotky.class.getSimpleName());
1.20 + /** Název inicializačního parametru */
1.21 + private static final String INIT_ADRESAR = "adresar";
1.22 + /** Název podadresáře obsahujícího fotku v plném rozlišení */
1.23 + public static final String PODADRESAR_ORIGINAL = "original";
1.24 + /** Název podadresáře obsahujícího výchozí náhled fotky */
1.25 + public static final String PODADRESAR_NAHLED = "nahled";
1.26 + public static final String PRIPONA = "jpg";
1.27 + private static final String LOMITKO = File.separator;
1.28 + /** Regulární výraz */
1.29 + private static final String VZOR_CESTY = "^" + LOMITKO + "(" + PODADRESAR_ORIGINAL + "|" + PODADRESAR_NAHLED + ")" + LOMITKO + "\\d+\\." + PRIPONA + "$";
1.30 + private static final String MIME_TYP = "image/jpeg";
1.31 + private File adresar;
1.32 + private static final Logger log = Logger.getLogger(Fotky.class.getSimpleName());
1.33
1.34 - @Override
1.35 - public void init() throws ServletException {
1.36 - super.init();
1.37 - String initAdresar = getServletConfig().getInitParameter(INIT_ADRESAR);
1.38 - adresar = new File(initAdresar);
1.39 - if (adresar.isDirectory()) {
1.40 - log.log(Level.INFO, "Servlet „Fotka“ byl úspěšně inicializován.");
1.41 - log.log(Level.INFO, "Adresář s fotkami: " + initAdresar);
1.42 - log.log(Level.INFO, "RegExp cesty: " + VZOR_CESTY);
1.43 - } else {
1.44 - throw new ServletException("Servlet „Fotka“ se nepodařilo inicializovat. Cesta: " + initAdresar);
1.45 + @Override
1.46 + public void init() throws ServletException {
1.47 + super.init();
1.48 + String initAdresar = getServletConfig().getInitParameter(INIT_ADRESAR);
1.49 + adresar = new File(initAdresar);
1.50 + if (adresar.isDirectory()) {
1.51 + log.log(Level.INFO, "Servlet „Fotka“ byl úspěšně inicializován.");
1.52 + log.log(Level.INFO, "Adresář s fotkami: {0}", initAdresar);
1.53 + log.log(Level.INFO, "RegExp cesty: {0}", VZOR_CESTY);
1.54 + } else {
1.55 + throw new ServletException("Servlet „Fotka“ se nepodařilo inicializovat. Cesta: " + initAdresar);
1.56 + }
1.57 }
1.58 - }
1.59
1.60 - /**
1.61 - * @param pozadavek pouze GET (není důvod podporovat POST)
1.62 - * @param odpoved odešleme fotku s MIME typem podle konstanty, délkou a datem podle souboru.
1.63 - * @throws ServletException pokud je požadovaná cesta chybná (nevyhovuje vzoru)
1.64 - * @throws IOException
1.65 - */
1.66 - @Override
1.67 - protected void doGet(HttpServletRequest pozadavek, HttpServletResponse odpoved) throws ServletException, IOException {
1.68 + /**
1.69 + * @param pozadavek pouze GET (není důvod podporovat POST)
1.70 + * @param odpoved odešleme fotku s MIME typem podle konstanty, délkou a datem podle souboru.
1.71 + * @throws ServletException pokud je požadovaná cesta chybná (nevyhovuje vzoru)
1.72 + * @throws IOException
1.73 + */
1.74 + @Override
1.75 + protected void doGet(HttpServletRequest pozadavek, HttpServletResponse odpoved) throws ServletException, IOException {
1.76
1.77 - String cesta = zkontrolujParametr(pozadavek.getPathInfo());
1.78 - File soubor = new File(adresar, cesta);
1.79 + String cesta = zkontrolujParametr(pozadavek.getPathInfo());
1.80 + File soubor = new File(adresar, cesta);
1.81
1.82 - if (soubor.isFile() && soubor.canRead()) {
1.83 + if (soubor.isFile() && soubor.canRead()) {
1.84
1.85 - if (soubor.lastModified() > pozadavek.getDateHeader("If-Modified-Since")) {
1.86 - /** Soubor se změnil nebo ho klient ještě nemá načtený. */
1.87 - odpoved.setContentType(MIME_TYP);
1.88 - odpoved.setContentLength((int) soubor.length());
1.89 - odpoved.setDateHeader("Last-Modified", soubor.lastModified());
1.90 + if (soubor.lastModified() > pozadavek.getDateHeader("If-Modified-Since")) {
1.91 + /** Soubor se změnil nebo ho klient ještě nemá načtený. */
1.92 + odpoved.setContentType(MIME_TYP);
1.93 + odpoved.setContentLength((int) soubor.length());
1.94 + odpoved.setDateHeader("Last-Modified", soubor.lastModified());
1.95
1.96 - ServletOutputStream vystup = odpoved.getOutputStream();
1.97 - InputStream vstup = new FileInputStream(soubor);
1.98 + ServletOutputStream vystup = odpoved.getOutputStream();
1.99 + InputStream vstup = new FileInputStream(soubor);
1.100
1.101 - try {
1.102 - byte[] zasobnik = new byte[1024];
1.103 - int bajtuNacteno;
1.104 - while ((bajtuNacteno = vstup.read(zasobnik)) != -1) {
1.105 - vystup.write(zasobnik, 0, bajtuNacteno);
1.106 - }
1.107 - } catch (Exception e) {
1.108 - throw new ServletException("Chyba při odesílání obrázku klientovi.", e);
1.109 - } finally {
1.110 - vstup.close();
1.111 - vystup.close();
1.112 + try {
1.113 + byte[] zasobnik = new byte[1024];
1.114 + int bajtuNacteno;
1.115 + while ((bajtuNacteno = vstup.read(zasobnik)) != -1) {
1.116 + vystup.write(zasobnik, 0, bajtuNacteno);
1.117 + }
1.118 + } catch (Exception e) {
1.119 + throw new ServletException("Chyba při odesílání obrázku klientovi.", e);
1.120 + } finally {
1.121 + vstup.close();
1.122 + vystup.close();
1.123 + }
1.124 + } else {
1.125 + /** Soubor se od posledního načtení klientem nezměnil → není potřeba ho posílat znova. */
1.126 + odpoved.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
1.127 + }
1.128 +
1.129 + } else {
1.130 + /** Neexistující nebo nečitelný soubor → HTTP 404 chyba */
1.131 + odpoved.sendError(HttpServletResponse.SC_NOT_FOUND);
1.132 }
1.133 - } else {
1.134 - /** Soubor se od posledního načtení klientem nezměnil → není potřeba ho posílat znova. */
1.135 - odpoved.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
1.136 - }
1.137 + }
1.138
1.139 - } else {
1.140 - /** Neexistující nebo nečitelný soubor → HTTP 404 chyba */
1.141 - odpoved.sendError(HttpServletResponse.SC_NOT_FOUND);
1.142 + /**
1.143 + * @param cesta cesta požadovaná klientem: <code>request.getPathInfo()</code>
1.144 + * @throws ServletException pokud cesta nevyhovuje vzoru
1.145 + */
1.146 + private static String zkontrolujParametr(String cesta) throws ServletException {
1.147 + if (Pattern.matches(VZOR_CESTY, cesta)) {
1.148 + /** cesta je v pořádku → pokračujeme */
1.149 + return cesta;
1.150 + } else {
1.151 + /** Chybná cesta → HTTP 500 chyba */
1.152 + throw new ServletException("Chybná cesta k obrázku: " + cesta);
1.153 + }
1.154 }
1.155 - }
1.156 -
1.157 - /**
1.158 - * @param cesta cesta požadovaná klientem: <code>request.getPathInfo()</code>
1.159 - * @throws ServletException pokud cesta nevyhovuje vzoru
1.160 - */
1.161 - private static String zkontrolujParametr(String cesta) throws ServletException {
1.162 - if (Pattern.matches(VZOR_CESTY, cesta)) {
1.163 - /** cesta je v pořádku → pokračujeme */
1.164 - return cesta;
1.165 - } else {
1.166 - /** Chybná cesta → HTTP 500 chyba */
1.167 - throw new ServletException("Chybná cesta k obrázku: " + cesta);
1.168 - }
1.169 - }
1.170 }