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.fukurou.transfer; 017 018 import java.io.IOException; 019 020 import org.opengion.fukurou.db.Transaction; 021 import org.opengion.fukurou.util.StringUtil; 022 import org.opengion.fukurou.util.URLConnect; 023 024 /** 025 * ä¼é?è¦æ±‚ã«å¯¾ã—ã¦ã®HTTP経由ã§ä¼é?処ç?‚’実行ã—ã¾ã™ã? 026 * 027 * èªå–方法ã«ã‚ˆã‚Šèªã¿å–ã£ãŸãƒ‡ãƒ¼ã‚¿ã‚’POSTãƒ??ã‚¿ã¨ã—ã¦é€ä¿¡ã—ã?リモートã?スト上㧠028 * ä¼é?処ç?‚’実行ã—ã¾ã™ã? 029 * 030 * 処ç??æµã‚Œã¨ã—ã¦ã¯ä»¥ä¸‹ã?よã†ã«ãªã‚Šã¾ã™ã? 031 * â‘?TTPã§ä¼é?処ç?‚’実行ã™ã‚‹ãŸã‚ã?サーブレãƒ?ƒˆã‚’呼ã³å‡ºã™ã? 032 * â‘¡â‘?§å‘¼ã³å‡ºã—ã•れãŸã‚µãƒ¼ãƒ–レãƒ?ƒˆãŒã?ä¼é?処ç?‚’実行ã™ã‚‹ãŸã‚ã?オブジェクトを生æ?ã—ã? 033 * ä¼é?処ç?‚’実行ã™ã‚‹ã? 034 * ③処ç?µ‚äº?¾Œã?ä¼é?プãƒã‚»ã‚¹ã«åˆ¶å¾¡ãŒæˆ»ã‚Šã?èªå–方法ã«åŸºã¥ã後å?ç?完äº??ç?¾ãŸã? 035 * エラー処ç?ãŒå®Ÿè¡Œã•れã¾ã™ã? 036 * 037 * ã¾ãšâ‘ ã«ã¤ã?¦ã€å‘¼ã³å‡ºã—ã•れるサーブレãƒ?ƒˆã¯ã€? 038 * [リモート接続å?URL]servlet/remoteControl?class=TransferExecWrapper ã«ãªã‚Šã¾ã™ã? 039 * [リモート接続å?URL]ã¯ã€http://[ホストå]:[ãƒã?ト番å·]/[コンãƒ?‚ストå]ã®å½¢å¼ã«ãªã‚Šã¾ã™ãŒã€? 040 * ã“れã«ã¤ã?¦ã¯ã€å®Ÿè¡Œå¯¾è±¡ã§æŒ?®šã—ã¾ã™ã? 041 * 次ã«â‘¡ã«ã¤ã?¦ã€ã‚µãƒ¼ãƒ–レãƒ?ƒˆçµŒç”±ã§å®Ÿè¡Œã•れるä¼é?処ç?«ã¤ã?¦ã€ãã®å®Ÿè¡Œæ–¹æ³•ã?ã€? 042 * 具体的ã«ã¯ã€ã‚µãƒ–クラスã®ã‚¯ãƒ©ã‚¹åã«å¯¾ã—ã¦ã€ã“ã®ã‚¯ãƒ©ã‚¹(親クラス)ã®ã‚¯ãƒ©ã‚¹å?"_" を除外ã—ãŸéƒ¨åˆ?Œ 043 * 実行方法ã¨ã—ã¦èªè˜ã•れã¾ã™ã? 044 * 具体的ã«ã¯ã€ã‚¯ãƒ©ã‚¹åã?æœ?¾Œã?"_"(アンãƒ??ãƒã?)以é™ãŒå®Ÿè¡Œæ–¹æ³•ã¨ã—ã¦èªè˜ã•れã? 045 * 例ã¨ã—ã¦ã€ã‚µãƒ–クラスåãŒTransferExec_HTTP_CB01ã®å ´åˆã?接続å?ã«ãŠã‘る実行方法ã? 046 * æ—§ä¼é?DB登録(CB01)ã¨ãªã‚Šã¾ã™ã? 047 * ã¾ãŸã?リモートã?スト上ã§å®Ÿè¡Œã•れるä¼é?処ç??[リモート実行対象]ã¯ã€å?ã®å®Ÿè¡Œå¯¾è±¡ã§è¨å®šã—ã¾ã™ã? 048 * ã“ã?ã“ã¨ã‹ã‚‰ã€HTTP経由ã§ä¼é?処ç?‚’実行ã™ã‚‹å?åˆã?å…??実行対象ã«ã¯ã€[リモート接続å?URL]㨠049 * [リモート実行対象]ã®2ã¤ã‚’è¨å®šã™ã‚‹å¿?¦ãŒã‚りã¾ã™ã? 050 * 具体的ãªè¨å®šæ–¹æ³•ã«ã¤ã?¦ã¯å?‚µãƒ–クラスã®JavaDocã‚’å‚ç…§ã—ã¦ä¸‹ã•ã?? 051 * æœ?¾Œã«â‘¢ã«ã¤ã?¦ã€æŽ¥ç¶šæ™‚ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå?åˆã‚„ã€ãƒ¬ã‚¹ãƒãƒ³ã‚¹ãƒ??ã‚¿ã«å¯¾ã—ã¦"row_error"ã¨ã?† 052 * æ–?—å?ãŒå˜åœ¨ã™ã‚‹å ´åˆã?ã€ã‚¨ãƒ©ãƒ¼ã¨ã—ã¦å‡¦ç?—ã¾ã™ã? 053 * ãれ以外ã?å ´åˆã?ã€æ£å¸¸çµ‚äº?¨ã—ã¦å‡¦ç?—ã¾ã™ã? 054 * 055 * HTTP接続時ã«ã¯ã€ä»¥ä¸‹ã?ãƒã‚¹ãƒˆãƒ‡ãƒ¼ã‚¿ãŒé?ä¿¡ã•れã¾ã™ã? 056 * [ãƒã‚¹ãƒˆãƒ‡ãƒ¼ã‚¿] 057 * ・KBREAD (èªå–æ–¹æ³? 058 * ・READOBJ (èªå–対象) 059 * ・READPRM (èªå–パラメーター) 060 * ・KBEXEC (実行方æ³? â€»ã‚µãƒ–ã‚¯ãƒ©ã‚¹ã®æœ?¾Œã?"_"(アンãƒ??ãƒã?)以é™ã?æ–?—å? 061 * ・EXECDBID (実行接続å?DBID) 062 * ・EXECOBJ (リモート実行対象) ※ãƒãƒ¼ã‚«ãƒ«ã®å®Ÿè¡Œå¯¾è±¡ã‹ã‚‰ãƒªãƒ¢ãƒ¼ãƒˆæŽ¥ç¶šå?URLを除ã?Ÿæ–?—å? 063 * ・EXECPRM (実行パラメーター) 064 * ・ERROR_SENDTO (èªã¿å–りå…??ストコーãƒ? 065 * ・HFROM (èªã¿å–りå…??ストコーãƒ? 066 * ・n (ãƒ??ã‚¿ä»¶æ•°) 067 * ・v1?žvn (ãƒ??ã‚¿) 068 * 069 * @og.group ä¼é?シスãƒ?ƒ 070 * 071 * @version 5.0 072 * @author Hiroki.Nakamura 073 * @since JDK1.6 074 */ 075 public abstract class TransferExec_HTTP implements TransferExec { 076 077 // リモート制御サーブレãƒ?ƒˆå? 078 private static final String REMOTE_SERVLET = "servlet/remoteControl?class=TransferExecWrapper"; 079 080 /** 081 * URL接続を実行ã—ã¾ã™ã? 082 * 083 * @param vals ä¼é?ãƒ??ã‚¿(é…å?) 084 * @param config ä¼é?è¨å®šã‚ªãƒ–ジェクãƒ? 085 * @param tran トランザクションオブジェクãƒ? 086 */ 087 @Override 088 public void execute( final String[] vals, final TransferConfig config, final Transaction tran ) { 089 URLConnect conn = null; 090 try { 091 splitExecObj( config.getExecObj() ); 092 conn = new URLConnect( getRemoteHost() + REMOTE_SERVLET, TransferConfig.HTTP_AUTH_USER_PASS ); 093 if( config.getProxyHost() != null && config.getProxyHost().length() > 0 ) { 094 conn.setProxy( config.getProxyHost(), config.getProxyPort() ); 095 } 096 097 conn.setCharset( "UTF-8" ); 098 // ãƒã‚¹ãƒˆãƒ‡ãƒ¼ã‚¿ã‚’生æˆã—ã¾ã™ã? 099 conn.setPostData( getPostData( vals, config ) ); 100 101 conn.connect(); 102 103 String readData = conn.readData(); 104 // è¿”ã•れãŸãƒ??ã‚¿ä¸ã«"row_error"ãŒå˜åœ¨ã™ã‚‹å ´åˆã?エラーã¨ã—ã¦å‡¦ç?—ã¾ã™ã? 105 if( readData != null && readData.indexOf( "row_error" ) >= 0 ) { 106 throw new RuntimeException( readData ); 107 } 108 } 109 catch( IOException ex ) { 110 String errMsg = "URL接続時ã«ä¾‹å¤–ãŒç™ºç”Ÿã—ã¾ã—ãŸã€?; 111 throw new RuntimeException( errMsg, ex ); 112 } 113 finally { 114 if( conn != null ) { conn.disconnect(); } 115 } 116 } 117 118 /** 119 * ãƒãƒ¼ã‚«ãƒ«ã®å®Ÿè¡Œå¯¾è±¡ã‚’ã?リモート接続å?ã®å®Ÿè¡Œå¯¾è±¡ã¨ãƒªãƒ¢ãƒ¼ãƒˆæŽ¥ç¶šå?URLã«åˆ?§£ã—ã¾ã™ã? 120 * 121 * @param localExecObj ãƒãƒ¼ã‚«ãƒ«ã®å®Ÿè¡Œå¯¾è±¡ 122 */ 123 protected abstract void splitExecObj( final String localExecObj ); 124 125 /** 126 * リモート接続å?URLã‚’è¿”ã—ã¾ã™ã? 127 * ã“ã?メソãƒ?ƒ‰ã¯ã€{@link #splitExecObj(String)}ã®å¾Œã«å‘¼ã³å‡ºã—ã™ã‚‹å¿?¦ãŒã‚りã¾ã™ã? 128 * 129 * @return リモート接続å?URL 130 */ 131 protected abstract String getRemoteHost(); 132 133 /** 134 * リモート接続å?ã®å®Ÿè¡Œå¯¾è±¡ã‚’è¿”ã—ã¾ã™ã? 135 * ã“ã?メソãƒ?ƒ‰ã¯ã€{@link #splitExecObj(String)}ã®å¾Œã«å‘¼ã³å‡ºã—ã™ã‚‹å¿?¦ãŒã‚りã¾ã™ã? 136 * 137 * @return 接続URL 138 */ 139 protected abstract String getRemoteExecObj(); 140 141 /** 142 * ä¼é?ãƒ??ã‚¿åŠã?ä¼é?è¨å®šã‚’POSTãƒ??ã‚¿ã¨ã—ã¦ã‚·ãƒªã‚¢ãƒ©ã‚¤ã‚ºã—ã¾ã™ã? 143 * 144 * @param vals ä¼é?ãƒ??ã‚¿(é…å?) 145 * @param config ä¼é?è¨å®šã‚ªãƒ–ジェクãƒ? 146 * 147 * @return ãƒã‚¹ãƒˆãƒ‡ãƒ¼ã‚¿ 148 */ 149 private String getPostData( final String[] vals, final TransferConfig config ) { 150 // サブクラスåã‹ã‚‰è¦ªã‚¯ãƒ©ã‚¹å?"_"を除ã?Ÿéƒ¨åˆ?‚’実行方法ã¨ã™ã‚‹ã€? 151 String kbExec = getClass().getName().replace( getClass().getSuperclass().getName() + "_", "" ); 152 153 StringBuilder buf = new StringBuilder(); 154 buf.append( "KBREAD=" ).append( StringUtil.urlEncode( config.getKbRead() ) ); 155 buf.append( "&READOBJ=" ).append( StringUtil.urlEncode( config.getReadObj() ) ); 156 buf.append( "&READPRM=" ).append( StringUtil.urlEncode( config.getReadPrm() ) ); 157 buf.append( "&KBEXEC=" ).append( StringUtil.urlEncode( kbExec ) ); 158 buf.append( "&EXECDBID=" ).append( StringUtil.urlEncode( config.getExecDbid() ) ); 159 buf.append( "&EXECOBJ=" ).append( StringUtil.urlEncode( getRemoteExecObj() ) ); 160 buf.append( "&EXECPRM=" ).append( StringUtil.urlEncode( config.getExecPrm() ) ); 161 buf.append( "&ERROR_SENDTO=").append( StringUtil.urlEncode( config.getErrorSendto() ) ); 162 buf.append( "&HFROM=" ).append( StringUtil.urlEncode( config.getHfrom() ) ) ; 163 164 if( vals != null && vals.length > 0 ) { 165 buf.append( "&n=" ).append( vals.length ); 166 for( int i=0; i<vals.length; i++ ) { 167 buf.append( "&v" ).append( i ).append( "=" ); 168 buf.append( StringUtil.urlEncode( vals[i] ) ); 169 } 170 } 171 else { 172 buf.append( "&n=0" ); 173 } 174 175 return buf.toString(); 176 } 177 }