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 */ 016 package org.opengion.hayabusa.servlet; 017 018 import java.io.FileInputStream; 019 import java.io.IOException; 020 import java.io.PrintWriter; 021 import java.io.UnsupportedEncodingException; 022 import java.util.Enumeration; 023 import java.util.HashMap; 024 025 import javax.servlet.ServletException; 026 import javax.servlet.ServletOutputStream; 027 import javax.servlet.http.HttpServlet; 028 import javax.servlet.http.HttpServletRequest; 029 import javax.servlet.http.HttpServletResponse; 030 031 import org.opengion.fukurou.util.Closer; 032 import org.opengion.hayabusa.common.HybsSystem; 033 import org.opengion.hayabusa.common.HybsSystemException; 034 import 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 */ 047 public 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 }