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.plugin.table; 017 018 import org.opengion.hayabusa.common.HybsSystemException; 019 import org.opengion.hayabusa.db.AbstractTableFilter; 020 import org.opengion.hayabusa.db.DBColumn; 021 import org.opengion.hayabusa.db.DBTableModel; 022 023 import org.opengion.hayabusa.resource.ResourceFactory; 024 import org.opengion.hayabusa.resource.ResourceManager; 025 026 import org.opengion.fukurou.util.ErrorMessage; 027 import org.opengion.fukurou.util.StringUtil; 028 import java.util.regex.Pattern; 029 import java.util.regex.Matcher; 030 import java.util.Locale; 031 import java.util.Map; 032 033 /** 034 * TableFilter_DBARG は、TableFilter インターフェースを継承した、DBTableModel 処?の 035 * 実?ラスです? 036 * 037 * ここでは、テキストから?オブジェクト名、カラ?、クラス、利用桁数を?り?します? 038 * 039 * ソースの?スト部は?,NAME_JA VARCHAR2(100) " と?形式??ストになって?す? 040 * これを?カラ?、クラス名部、使用桁数部に?します?上記?例では? 041 * それぞれを?NAME_JA、VARCHAR2?00 に?して、文字?配?に格納します? 042 * また?これら?ソースに?--" ?"/ * ??? * /" などのコメントが含まれるケース? 043 * あります?"--" コメント?、それ以降を無視しますが?/ *" コメント?、?行に 044 * またがる為、今回は処?象から外します? 045 * ソースの?スト部には、それら以外に、OBJECT_NAME に相当する行や?);" などの 046 * ソースの???後?無効な部?あります?無効な部??、null を返すことで 047 * 登録処?ら省?ください? 048 * 049 * パラメータは、tableFilterタグの keys, vals にそれぞれ記述するか?BODY 部にCSS形式で記述します? 050 * 【パラメータ? 051 * { 052 * TEXT : 処?おこな??ソースの?スト部のカラ? 053 * OBJ_NAME : キーとなるオブジェクト名のカラ? 054 * SEQNO : ソースの行番号のカラ? 055 * CLM : 処?果のカラ?を?納するカラ? 056 * CLS_NAME : 処?果のクラス名を格納するカラ? 057 * USE_LENGTH : 処?果の利用桁数を?納するカラ? 058 * CLM_NAME : 処?果のカラ?称?ラベル?を格納するカラ? 059 * MAX_LENGTH : 処?果の桁数を?納するカラ? 060 * } 061 * 062 * @og.formSample 063 * ●形式? 064 * select A.OBJECT_NAME AS OBJ_NAME,B.LINE AS SEQNO,'' AS CLM , 065 * '' AS CLS_NAME,'' AS USE_LENGTH,'' AS CLM_NAME, 066 * '' AS TABLE_NAME ,'' AS MAX_LENGTH, 067 * B.TEXT , '{@SYSTEM_ID}' AS SYSTEM_ID,'{@TBLSYU}' AS TBLSYU 068 * from USER_OBJECTS A inner join USER_SOURCE B 069 * on A.OBJECT_NAME = B.NAME 070 * where A.OBJECT_TYPE = 'TYPE' 071 * and B.TYPE = 'TYPE' 072 * and not A.OBJECT_NAME like '%ARRAY' 073 * order by A.OBJECT_NAME,B.LINE 074 * ?<og:tableFilter classId="DBARG" 075 * keys="TEXT,OBJ_NAME,SEQNO,CLM,CLS_NAME,USE_LENGTH,CLM_NAME,MAX_LENGTH" 076 * vals="TEXT,OBJ_NAME,SEQNO,CLM,CLS_NAME,USE_LENGTH,CLM_NAME,MAX_LENGTH" /> 077 * 078 * ② <og:tableFilter classId="DBARG" > 079 * { 080 * TEXT : 処?おこな??ソースの?スト部のカラ? 081 * OBJ_NAME : キーとなるオブジェクト名のカラ? 082 * SEQNO : ソースの行番号のカラ? 083 * CLM : 処?果のカラ?を?納するカラ? 084 * CLS_NAME : 処?果のクラス名を格納するカラ? 085 * USE_LENGTH : 処?果の利用桁数を?納するカラ? 086 * CLM_NAME : 処?果のカラ?称?ラベル?を格納するカラ? 087 * MAX_LENGTH : 処?果の桁数を?納するカラ? 088 * } 089 * </og:tableFilter> 090 * 091 * @og.rev 5.6.6.0 (2013/07/05) keys の整合?チェ?を追? 092 * 093 * @version 0.9.0 2000/10/17 094 * @author Kazuhiko Hasegawa 095 * @since JDK1.1, 096 */ 097 public class TableFilter_DBARG extends AbstractTableFilter { 098 //* こ?プログラ??VERSION??を設定します? {@value} */ 099 private static final String VERSION = "5.6.6.1 (2013/07/12)" ; 100 101 /** 102 * keys の整合?チェ?を行うための初期設定を行います? 103 * 104 * @og.rev 5.6.6.1 (2013/07/12) keys の整合?チェ?対? 105 * 106 * @param keysMap keys の整合?チェ?を行うための Map 107 */ 108 @Override 109 protected void init( final Map<String,String> keysMap ) { 110 keysMap.put( "TEXT" , "処?おこな??ソースの?スト部のカラ?" ); 111 keysMap.put( "OBJ_NAME" , "キーとなるオブジェクト名のカラ?" ); 112 keysMap.put( "SEQNO" , "ソースの行番号のカラ?" ); 113 keysMap.put( "CLM" , "処?果のカラ?を?納するカラ?" ); 114 keysMap.put( "CLS_NAME" , "処?果のクラス名を格納するカラ?" ); 115 keysMap.put( "USE_LENGTH" , "処?果の利用桁数を?納するカラ?" ); 116 keysMap.put( "CLM_NAME" , "処?果のカラ?称?ラベル?を格納するカラ?" ); 117 keysMap.put( "MAX_LENGTH" , "処?果の桁数を?納するカラ?" ); 118 } 119 120 // 5.5.7.4 (2012/10/25) OBJ_NAME,SEQNO 追? 121 // private static final String[] KEYS = new String[] { "TEXT","CLM","CLS_NAME","USE_LENGTH","CLM_NAME","MAX_LENGTH" }; 122 private static final String[] KEYS = new String[] { "TEXT","OBJ_NAME","SEQNO","CLM","CLS_NAME","USE_LENGTH","CLM_NAME","MAX_LENGTH" }; 123 private static final int TEXT = 0; 124 private static final int OBJ_NAME = 1; // 5.5.7.4 (2012/10/25) OBJ_NAME 追? 125 private static final int SEQNO = 2; // 5.5.7.4 (2012/10/25) SEQNO 追? 126 private static final int CLM = 3; 127 private static final int CLS_NAME = 4; 128 private static final int USE_LENGTH = 5; 129 private static final int CLM_NAME = 6; 130 private static final int MAX_LENGTH = 7; 131 132 /** 133 * DBTableModel処?実行します? 134 * 135 * @og.rev 5.5.2.6 (2012/05/25) protected変数を?private化したため?getterメソ?で取得するよ?変更 136 * @og.rev 5.5.7.4 (2012/10/25) OBJ_NAME,SEQNO を追?ることで、SEQNO を振りなおします? 137 * 138 * @return 処?果のDBTableModel 139 */ 140 public DBTableModel execute() { 141 DBTableModel table = getDBTableModel(); // 5.5.2.6 (2012/05/25) インターフェースにgetterメソ?追? 142 143 String lang = getValue( "LANG" ); 144 ResourceManager resource = ResourceFactory.newInstance( lang ); 145 146 int size = KEYS.length; 147 int[] clmNo = new int[size]; 148 for( int i=0; i<size; i++ ) { 149 String clm = getValue( KEYS[i] ); 150 clmNo[i] = table.getColumnNo( clm,false ); // 存在しな??合??1 151 if( clmNo[i] < 0 ) { 152 String errMsg = "検索結果に、[" + clm + "]を含めてください? ; 153 throw new HybsSystemException( errMsg ); 154 } 155 } 156 157 String[] data = null; 158 int rowCnt = table.getRowCount(); 159 DBTableModel rtnTbl = table.newModel(); 160 String bkObjName = ""; // 5.5.7.4 (2012/10/25) SEQNO を振りなおすためのキーブレイク 161 int seqno = 1 ; // 5.5.7.4 (2012/10/25) SEQNO 162 for( int row=0; row<rowCnt; row++ ) { 163 try { 164 data = table.getValues( row ); 165 String text = data[clmNo[TEXT]] ; 166 String[] temp = textSeparate( text ); 167 if( temp != null ) { 168 String objName = data[clmNo[OBJ_NAME]]; // 5.5.7.4 (2012/10/25) SEQNO を振りなおす 169 if( ! bkObjName.equals( objName ) ) { 170 bkObjName = objName; 171 seqno = 1; 172 } 173 174 data[clmNo[SEQNO]] = String.valueOf( seqno++ ); // 5.5.7.4 (2012/10/25) SEQNO を振りなおす 175 data[clmNo[CLM]] = temp[0]; 176 data[clmNo[CLS_NAME]] = temp[1]; 177 data[clmNo[USE_LENGTH]] = temp[2]; 178 // data[clmNo[CLM_NAME]] = resource.getLabel( temp[0] ) ; 179 180 DBColumn dbClm = resource.getDBColumn( temp[0] ); 181 if( dbClm != null ) { 182 data[clmNo[CLM_NAME]] = dbClm.getLabel() ; 183 String len = data[clmNo[MAX_LENGTH]] ; 184 if( len == null || len.length() == 0 ) { 185 data[clmNo[MAX_LENGTH]] = dbClm.getMaxlength() ; 186 } 187 } 188 // else { 189 // data[clmNo[CLM_NAME]] = temp[0] ; // ラベルが存在しな? 190 // } 191 rtnTbl.addColumnValues( data ); 192 } 193 } 194 catch( RuntimeException ex ) { 195 ErrorMessage errMessage = makeErrorMessage( "TableFilter_DBARG Error",ErrorMessage.NG ); 196 errMessage.addMessage( row+1,ErrorMessage.NG,"ERR MSG",ex.getMessage() ); 197 errMessage.addMessage( row+1,ErrorMessage.NG,"ERR Data",StringUtil.array2csv( data ) ); 198 } 199 } 200 201 return rtnTbl; 202 } 203 204 // private static final Pattern pt = Pattern.compile( "[^\\w]*([\\w]*)[^\\w]*(VARCHAR2|NUMBER)[^\\w]*\\(([^\\)]*)\\)",Pattern.CASE_INSENSITIVE ); 205 private static final Pattern pt = Pattern.compile( "[^\\w]*([\\w]*)[^\\w]*(VARCHAR2|NUMBER)[\\s]*([\\(\\d,\\)]*)",Pattern.CASE_INSENSITIVE ); 206 // (______) (_______________) (_____________) 207 208 /** 209 * ソースの?スト部を?割します? 210 * 211 * ソースの?スト部は?,NAME_JA VARCHAR2(100) " と?形式??ストになって?す? 212 * これを?カラ?、クラス名部、使用桁数部に?します?上記?例では? 213 * それぞれを?NAME_JA、VARCHAR2?00 に?して、文字?配?に格納します? 214 * また?これら?ソースに?--" ?"/ * ??? * /" などのコメントが含まれるケース? 215 * あります?"--" コメント?、それ以降を無視しますが?/ *" コメント?、?行に 216 * またがる為、今回は処?象から外します? 217 * ソースの?スト部には、それら以外に、OBJECT_NAME に相当する行や?);" などの 218 * ソースの???後?無効な部?あります?無効な部??、null を返すことで 219 * 登録処?ら省?ください? 220 * 221 * @og.rev 5.5.7.4 (2012/10/25) カラ??大?化と、桁数の ? 削除 222 * @og.rev 5.5.8.5 (2012/11/27) 桁数なし?場合?対? 223 * 224 * @param text ソースの?スト部 225 * 226 * @return ?後???配?(CLM,CLS_NAME,USE_LENGTHの?、無効な??タは null 227 */ 228 private String[] textSeparate( final String text ) { 229 230 int adrs = text.indexOf( "--" ); 231 String text2 = (adrs<0) ? text : text.substring( 0,adrs ) ; 232 233 String[] rtnTxt = null ; 234 Matcher mt = pt.matcher( text2 ); 235 if( mt.lookingAt() ) { 236 String clm = mt.group( 1 ); // カラ??名称:パターンとして、空白は含まな? 237 String cls = mt.group( 2 ); // クラスの名称(VARCHAR2|NUMBER) 238 String len = mt.group( 3 ); // 桁数:パターンとして、前後に空白を含??()を含??何もな?ど 239 240 // 5.5.8.5 (2012/11/27) 桁数なし?場合?対? 241 if( len != null ) { 242 int st = len.indexOf( '(' ); 243 int ed = len.indexOf( ')' ); 244 if( st >= 0 && ed >= 0 ) { 245 len = len.substring( st+1,ed ); 246 len = len.trim().replaceFirst("^0+", ""); // 5.5.7.4 (2012/10/25) 先?の 0 を削除する? 247 } 248 else { 249 len = ""; 250 } 251 } 252 else { 253 len = ""; 254 } 255 256 // if( clm != null && cls != null && len != null ) { 257 if( clm != null && cls != null ) { 258 clm = clm.toUpperCase(Locale.JAPAN); // 5.5.7.4 (2012/10/25) 大?化 259 cls = cls.toUpperCase(Locale.JAPAN); // 5.5.7.4 (2012/10/25) 大?化 260 // len = len.trim(); 261 // len = len.trim().replaceFirst("^0+", ""); // 5.5.7.4 (2012/10/25) 先?の 0 を削除する? 262 // if( len.length() > 0 ) { 263 rtnTxt = new String[] { clm,cls,len }; 264 // } 265 } 266 } 267 268 // マッチしな?また? 条件を?さな??合?、null 269 return rtnTxt ; 270 } 271 }