01 import java.awt.*; 
02 import java.awt.image.*; 
03 import java.io.*; 
04 import javax.servlet.*; 
05 import javax.servlet.http.*; 
06 
07 import Acme.JPM.Encoders.*; 
08 
09 public class GreyScaleServletCached extends HttpServlet { 
10 
11   // vytvoríme hash tabuľku
12   Hashtable gifs = new Hashtable();
13 
14   public void doGet (HttpServletRequest req, HttpServletResponse res) 
15                                  throws ServletException, IOException { 
16     res.setContentType("image/gif"); 
17     ServletOutputStream out = res.getOutputStream(); 
18 
19     // získame info o umiestnení obrázku 
20     String source = req.getPathTranslated(); 
21     if (source == null) { 
22      throw new ServletException("Chyba v umiestnení obrázku"); 
23     } 
24     
25     // ak skonvertovaný obrázok existuje, pošleme ho
26     if (gifs.containsKey(source)) {
27     ByteArrayOutputStream baos = (ByteArrayOutputStream) gifs.get(source);
28     baos.writeTo(out);
29       return;
30     }
31     
32     /* vytvoríme viacnásobne použiteľný frame, pričom 
33     tentokrát nepotrebujeme volať metódu addNotify() */ 
34     Frame frame = new Frame();
35     
36     // natiahneme obrázok do pamäte 
37     Image image = Toolkit.getDefaultToolkit().getImage(source); 
38     MediaTracker mt = new MediaTracker(frame); 
39     mt.addImage(image, 0); 
40     try { 
41      mt.waitForAll(); 
42     } 
43     catch (InterruptedException e) { 
44      getServletContext().log("Chyba pri načítaní obrázka", e); 
45      throw new ServletException(e.getMessage()); 
46     } 
47 
48     // zistíme rozmery obrázku 
49     int width = image.getWidth(frame); 
50     int height = image.getHeight(frame); 
51   
52     // obrázok preženieme cez filter 
53     Image filtered = frame.createImage(new FilteredImageSource(image.getSource(),new GreyScaleFilter()));
54     
55     // obrázok zakódujeme, uložíme do Hashtable a pošleme 
56     ByteArrayOutputStream baos = new ByteArrayOutputStream();
57     GifEncoder encoder = new GifEncoder(filtered, baos);
58     encoder.encode();
59     gifs.put(source, baos);
60     baos.writeTo(out);
61   } 
62 }