java/nekurak.net-web/src/java/cz/frantovo/nekurak/servlet/Fotky.java
changeset 145 0efefbf5f8b6
parent 69 4964cf581166
     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  }