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.remote; 017 018 import java.util.ArrayList; 019 import java.util.List; 020 import java.util.Map; 021 022 import org.opengion.fukurou.db.Transaction; 023 import org.opengion.fukurou.db.TransactionReal; 024 import org.opengion.fukurou.transfer.TransferConfig; 025 import org.opengion.fukurou.transfer.TransferRead; 026 import org.opengion.fukurou.util.ApplicationInfo; 027 import org.opengion.fukurou.util.StringUtil; 028 import org.opengion.hayabusa.common.HybsSystem; 029 import org.opengion.hayabusa.common.HybsSystemException; 030 031 /** 032 * RemoteControllableインタフェイスを実?? 033 * サーブレ?経由で?伝?読取??行うためのクラスです? 034 * 035 * こ?クラスは、伝?読取???ラ?ークラスです? 036 * 引数のKBREADのパラメーターに基づき?伝?読取オブジェクトを生?し?伝?処?実行します? 037 * 詳細につ?は、{@link org.opengion.fukurou.transfer.TransferRead_HTTP}を参照して下さ?? 038 * 039 * @og.rev 5.4.2.0 (2011/12/01) 新規作? 040 * 041 * @version 4.1 042 * @author Hiroki Nakamura 043 * @since JDK6.0, 044 * 045 */ 046 public class TransferReadWrapper implements RemoteControllable { 047 048 // 伝?読取クラスのベ?スクラス? 049 private static final String READ_CLASS_BASE = "org.opengion.fukurou.transfer.TransferRead_" ; 050 051 // コネクションにアプリケーション??を追記するかど??? 052 private static final boolean USE_DB_APPLICATION_INFO = HybsSystem.sysBool( "USE_DB_APPLICATION_INFO" ) ; 053 054 private static final ApplicationInfo appInfo; 055 056 static { 057 if( USE_DB_APPLICATION_INFO ) { 058 appInfo = new ApplicationInfo(); 059 // ユーザーID,IPアドレス,ホスト名 060 appInfo.setClientInfo( "TransferReadWrapper",HybsSystem.HOST_ADRS,HybsSystem.HOST_NAME ); 061 // 画面ID,操?プログラ?D 062 appInfo.setModuleInfo( "TransferReadWrapper","TransferReadWrapper","TransferReadWrapper" ); 063 } 064 else { 065 appInfo = null; 066 } 067 } 068 /** 069 * RemoteControllableインタフェイスの実?ソ?です? 070 * 071 * @param valMap サーブレ?が受け取ったキーと値のマッ? 072 * 073 * @return XML形式?実行結果 074 */ 075 @Override 076 public String remoteControl( final Map<String,String> valMap ) { 077 // パラメーターより伝?設定オブジェクトを生?します? 078 TransferConfig conf = new TransferConfig( 079 valMap.get( "KBREAD" ) 080 , valMap.get( "READOBJ" ) 081 , valMap.get( "READPRM" ) 082 , valMap.get( "KBEXEC" ) 083 , valMap.get( "EXECDBID" ) 084 , valMap.get( "EXECOBJ" ) 085 , valMap.get( "EXECPRM" ) 086 , valMap.get( "ERROR_SENDTO" ) 087 , valMap.get( "HFROM" ) 088 , null, -1 ); 089 Transaction tran = null; 090 String rtn = null; 091 try { 092 tran = new TransactionReal( appInfo ); 093 TransferRead read = (TransferRead)StringUtil.newInstance( READ_CLASS_BASE + valMap.get( "KBREAD" ) ); 094 095 // ??タ読? 096 String type = valMap.get( "type" ); 097 if( "read".equals( type ) ) { 098 String[] data = read.read( conf, tran ); 099 // 完?エラー処??ために更新キーを取得しXMLに埋め込? 100 String[] keys = read.getKeys(); 101 rtn = makeXml( data, keys ); 102 } 103 // 完??? 104 else if( "complete".equals( type ) ) { 105 // パラメーターから更新キーを読み取る 106 String[] keys = getKeys( valMap ); 107 read.setKeys( keys ); 108 read.complete( conf, tran ); 109 } 110 // エラー処? 111 else if( "error".equals( type ) ) { 112 // パラメーターから更新キーを読み取る 113 String[] keys = getKeys( valMap ); 114 read.setKeys( keys ); 115 read.error( conf, appInfo ); 116 } 117 else { 118 String errMsg = "処?イプが不正です?[?可能タイ?read,complete,error][?されたタイ?" + type + "]"; 119 throw new HybsSystemException( errMsg ); 120 } 121 } 122 catch ( Throwable ex ) { 123 String msg = "伝?読取??HTTP経由)でエラーが発生しました?; 124 throw new HybsSystemException( msg, ex ); 125 } 126 finally { 127 if( tran != null ) { tran.close(); } 128 } 129 130 return rtn; 131 } 132 133 /** 134 * 伝?読取???結果から??タ?及?キー?からXML??タを生成します? 135 * 136 * @og.rev 5.4.4.5 (2012/02/20) 特定文字をエスケープす? 137 * @param data ??タ?(配?) 138 * @param key 更新時に使用するキー?(配?) 139 * 140 * @return XML??タ 141 */ 142 private String makeXml( final String[] data, final String[] key ) { 143 StringBuilder buf = new StringBuilder(); 144 buf.append( "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" ); 145 buf.append( "<root>" ); 146 buf.append( " <dataList>" ); 147 if( data != null ) { 148 for( String d : data ) { 149 // buf.append( " <data>" ).append( d ).append( "</data>" ); 150 buf.append( " <data>" ).append( StringUtil.htmlFilter(d) ).append( "</data>" ); 151 } 152 } 153 buf.append( " </dataList>" ); 154 buf.append( " <keyList>" ); 155 if( key != null ) { 156 for( String k : key ) { 157 // buf.append( " <key>" ).append( k ).append( "</key>" ); 158 buf.append( " <key>" ).append( StringUtil.htmlFilter(k) ).append( "</key>" ); 159 } 160 } 161 buf.append( " </keyList>" ); 162 buf.append( "</root>" ); 163 return buf.toString(); 164 } 165 166 /** 167 * パラメーターより伝?読取オブジェクトに渡すキー?(配?)を生成します? 168 * 対象パラメーターは?(??タ件数) と ②k1?kn(??タ) です? 169 * 170 * @param valMap パラメーターMap 171 * 172 * @return 値?(配?) 173 */ 174 private String[] getKeys( final Map<String,String> valMap ) { 175 int rows = 0; 176 String rno = valMap.get( "n" ); 177 if( rno != null && rno.length() > 0 ) { 178 rows = Integer.valueOf( rno ); 179 } 180 List<String> list = new ArrayList<String>(); 181 for( int i=0; i<rows; i++ ) { 182 // String key = valMap.get( "k" + String.valueOf( i ) ); 183 String key = valMap.get( "k" + i ); 184 list.add( key ); 185 } 186 // return list.toArray( new String[0] ); 187 return list.toArray( new String[list.size()] ); 188 } 189 }