Filterやめた
- id:eccoHowling:20071026:p1
続き。
事前にファイルを作るタイプのフィルタだと頻繁な変更に耐えられないとわかったのでリクエスト毎に変換する方式に戻す。ついでに、Quircusがサーブレットなのを見て同じように拡張子がsvgのファイルへのリクエストをキャッチするサーブレットにしてみたら、I/Oのコードが大幅に減った。これだと他のサーブレットの結果を変換するとか言った方法は採れないのだけど、替わりにクエリで出力形式を指定する形にした。本当ならリクエストヘッダのacceptフィールドを見て形式を判断する形が良いのだろうか?
以下コード。
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { File file = new File(getServletContext().getRealPath( request.getServletPath() )); if ( file.exists() ) { Transcoder transcoder; String type = request.getParameter("rasterize"); if ( "png".equalsIgnoreCase(type) ) { transcoder = new PNGTranscoder(); response.setContentType("image/png"); } else if ( "tiff".equalsIgnoreCase(type) ) { transcoder = new TIFFTranscoder(); response.setContentType("image/tiff"); } else if ( "jpeg".equalsIgnoreCase(type) ) { transcoder = new JPEGTranscoder(); response.setContentType("image/jpeg"); } else { transcoder = null; response.setContentType("image/svg+xml"); } if ( transcoder != null ) { transcoder.transcode( new TranscoderInput(file.toURL().toString()), new TranscoderOutput(response.getOutputStream()) ); } else { InputStream in = new FileInputStream(file); OutputStream out = response.getOutputStream(); int b; while ( (b = in.read()) != -1 ) { out.write(b); } out.close(); } } else { response.sendError(HttpServletResponse.SC_NOT_FOUND); } } catch ( Exception e ) { e.printStackTrace(); response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage()); } }