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.system.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         * デフォルトコンストラクター
053         *
054         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
055         */
056        public RemoteControlServlet() { super(); }              // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
057
058        /**
059         * Postメソッドで与えられたrequestをcallClassメソッドに渡します。
060         * callClassメソッドではclassパラメータの値を利用してクラスをロードし、処理を行います。
061         * 具体的な処理はcallClassメソッドをご覧下さい。
062         *
063         * @param request HttpServletRequestリクエスト
064         * @param response HttpServletResponseレスポンス
065         * @throws ServletException サーブレット関係のエラーが発生した場合、throw されます。
066         * @throws IOException 入出力エラーが発生したとき
067         */
068        @Override
069        public void doPost( final HttpServletRequest request, final HttpServletResponse response )      throws ServletException, IOException {
070                callClass( request, response );
071        }
072
073        /**
074         * Getメソッドで与えられたrequestをcallClassメソッドに渡します。
075         * callClassメソッドではclassパラメータの値を利用してクラスをロードし、処理を行います。
076         * 具体的な処理はcallClassメソッドをご覧下さい。
077         *
078         * @param request HttpServletRequestリクエスト
079         * @param response HttpServletResponseレスポンス
080         * @throws ServletException サーブレット関係のエラーが発生した場合、throw されます。
081         * @throws IOException 入出力エラーが発生したとき
082         */
083        @Override
084        public void doGet( final HttpServletRequest request, final HttpServletResponse response )       throws ServletException, IOException {
085                callClass( request, response );
086        }
087
088        /**
089         * POSTとGETに対する実際の処理です
090         * 必須パラメータclassで与えられたクラス名でorg.opengion.hayabusa.remoteから
091         * クラスをロードし、MAPに格納したrequestパラメータをそのクラスに対して渡します。
092         * ロードするクラスはRemoteControllableを実装している必要があります。
093         * ロードしたクラスの処理が終了すると、返されたStringをresponseに出力して終了します。
094         * なお、classパラメータがnullの場合は何もせずに終了します。
095         *
096         * @og.rev 5.4.2.0 (2011/12/01) フォワード対応
097         *
098         * @param request リクエスト
099         * @param response レスポンス
100         * @throws ServletException サーブレット関係のエラーが発生した場合、throw されます。
101         * @throws IOException 入出力エラーが発生したとき
102         */
103        private void callClass( final HttpServletRequest request, final HttpServletResponse response ) throws ServletException, IOException {
104                // 5.4.2.0 (2011/12/01) リクエストのエンコードを指定
105                try {
106                        request.setCharacterEncoding( "UTF-8" );
107                }
108                catch( final UnsupportedEncodingException ex ) {
109                        throw new HybsSystemException( ex );
110                }
111
112                // 5.4.2.0 (2011/12/01) フォワード対応
113                final String file = request.getParameter( "file" );
114                if( file != null && file.length() > 0 ) {
115                        response.setContentType( "application/octet-stream" );
116                        // ファイル内容の出力
117                        FileInputStream     fin = null;
118                        ServletOutputStream out = null;
119                        try {
120                                fin = new FileInputStream( file );
121                                out = response.getOutputStream();
122
123                                // ファイル読み込み用バッファ
124                                final byte buffer[]  = new byte[4096];
125                                int size;
126                                while((size = fin.read(buffer))!=-1) {
127                                        out.write(buffer,0, size);
128                                        out.flush();
129                                }
130                        }
131                        finally {
132                                Closer.ioClose( fin );
133                                Closer.ioClose( out );
134                        }
135                }
136                else {
137                        final String clazz = request.getParameter( "class" ); // パラメータ"class"だけは必ず必要
138                        if( clazz == null ) {
139                                return; // 暫定処理
140                        }
141
142                        final Enumeration<?> paramEnm = request.getParameterNames();            // 4.3.3.6 (2008/11/15) Generics警告対応
143                        final HashMap<String,String> paramMap = new HashMap<>();
144                        while( paramEnm.hasMoreElements() ) {
145                                final String key = ( String )( paramEnm.nextElement() );
146                                paramMap.put( key, request.getParameter( key ) );
147                        }
148
149                        final RemoteControllable rmtC = HybsSystem.newInstance( REMOTE_PKG + clazz );
150                        final String rtnString = rmtC.remoteControl( paramMap );
151                        response.setContentType( "text/xml; charset=UTF-8" );
152                        final PrintWriter out = response.getWriter();
153                        out.println( rtnString );
154                        out.flush();
155                        out.close();
156                }
157        }
158}