001/* 002 * Copyright (c) 2009 The openGion Project. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 013 * either express or implied. See the License for the specific language 014 * governing permissions and limitations under the License. 015 */ 016package org.opengion.hayabusa.servlet; 017 018import java.io.FileInputStream; 019import java.io.IOException; 020import java.io.PrintWriter; 021import java.io.UnsupportedEncodingException; 022import java.util.Enumeration; 023import java.util.HashMap; 024 025import javax.servlet.ServletException; 026import javax.servlet.ServletOutputStream; 027import javax.servlet.http.HttpServlet; 028import javax.servlet.http.HttpServletRequest; 029import javax.servlet.http.HttpServletResponse; 030 031import org.opengion.fukurou.util.Closer; 032import org.opengion.hayabusa.common.HybsSystem; 033import org.opengion.hayabusa.common.HybsSystemException; 034import org.opengion.hayabusa.remote.RemoteControllable; 035 036/** 037 * 外部からキーと値を投げて処理をさせるサーブレットです。 038 * Post,Get両方に対応しています。 039 * classキーが必須です。(値はhayabusa/remote/内のクラス名) 040 * 041 * @og.rev 4.1.0.0 (2007/12/20) 新規作成 042 * @version 4.1 043 * @author Masakazu Takahashi 044 * @since JDK6.0, 045 * 046 */ 047public class RemoteControlServlet extends HttpServlet { 048 private static final long serialVersionUID = 542020111201L; 049 private static final String REMOTE_PKG = "org.opengion.hayabusa.remote."; 050 051 /** 052 * Postメソッドで与えられたrequestをcallClassメソッドに渡します。 053 * callClassメソッドではclassパラメータの値を利用してクラスをロードし、処理を行います。 054 * 具体的な処理はcallClassメソッドをご覧下さい。 055 * 056 * @param request HttpServletRequestリクエスト 057 * @param response HttpServletResponseレスポンス 058 * @throws ServletException サーブレット関係のエラーが発生した場合、throw されます。 059 * @throws IOException 入出力エラーが発生したとき 060 */ 061 @Override 062 public void doPost( final HttpServletRequest request, final HttpServletResponse response ) throws ServletException, IOException { 063 callClass( request, response ); 064 } 065 066 /** 067 * Getメソッドで与えられたrequestをcallClassメソッドに渡します。 068 * callClassメソッドではclassパラメータの値を利用してクラスをロードし、処理を行います。 069 * 具体的な処理はcallClassメソッドをご覧下さい。 070 * 071 * @param request HttpServletRequestリクエスト 072 * @param response HttpServletResponseレスポンス 073 * @throws ServletException サーブレット関係のエラーが発生した場合、throw されます。 074 * @throws IOException 入出力エラーが発生したとき 075 */ 076 @Override 077 public void doGet( final HttpServletRequest request, final HttpServletResponse response ) throws ServletException, IOException { 078 callClass( request, response ); 079 } 080 081 /** 082 * POSTとGETに対する実際の処理です 083 * 必須パラメータclassで与えられたクラス名でorg.opengion.hayabusa.remoteから 084 * クラスをロードし、MAPに格納したrequestパラメータをそのクラスに対して渡します。 085 * ロードするクラスはRemoteControllableを実装している必要があります。 086 * ロードしたクラスの処理が終了すると、返されたStringをresponseに出力して終了します。 087 * なお、classパラメータがnullの場合は何もせずに終了します。 088 * 089 * @og.rev 5.4.2.0 (2011/12/01) フォワード対応 090 * 091 * @param request リクエスト 092 * @param response レスポンス 093 * @throws ServletException サーブレット関係のエラーが発生した場合、throw されます。 094 * @throws IOException 入出力エラーが発生したとき 095 */ 096 private void callClass( final HttpServletRequest request, final HttpServletResponse response ) throws ServletException, IOException { 097 // 5.4.2.0 (2011/12/01) リクエストのエンコードを指定 098 try { 099 request.setCharacterEncoding( "UTF-8" ); 100 } 101 catch ( UnsupportedEncodingException ex ) { 102 throw new HybsSystemException( ex ); 103 } 104 105 // 5.4.2.0 (2011/12/01) フォワード対応 106 String file = request.getParameter( "file" ); 107 if( file != null && file.length() > 0 ) { 108 response.setContentType( "application/octet-stream" ); 109 // ファイル内容の出力 110 FileInputStream fin = null; 111 ServletOutputStream out = null; 112 try { 113 fin = new FileInputStream( file ); 114 out = response.getOutputStream(); 115 116 // ファイル読み込み用バッファ 117 byte buffer[] = new byte[4096]; 118 int size; 119 while((size = fin.read(buffer))!=-1) { 120 out.write(buffer,0, size); 121 out.flush(); 122 } 123 } 124 finally { 125 Closer.ioClose( fin ); 126 Closer.ioClose( out ); 127 } 128 } 129 else { 130 String clazz = request.getParameter( "class" ); // パラメータ"class"だけは必ず必要 131 if( clazz == null ) { 132 return; // 暫定処理 133 } 134 135 Enumeration<?> paramEnm = request.getParameterNames(); // 4.3.3.6 (2008/11/15) Generics警告対応 136 HashMap<String,String> paramMap = new HashMap<String,String>(); 137 while ( paramEnm.hasMoreElements() ) { 138 String key = ( String )( paramEnm.nextElement() ); 139 paramMap.put( key, request.getParameter( key ) ); 140 } 141 142 RemoteControllable rmtC = ( RemoteControllable )HybsSystem.newInstance( REMOTE_PKG + clazz ); 143 String rtnString = rmtC.remoteControl( paramMap ); 144 response.setContentType( "text/xml; charset=UTF-8" ); 145 PrintWriter out = response.getWriter(); 146 out.println( rtnString ); 147 out.flush(); 148 out.close(); 149 } 150 } 151}