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.develop; 017 018import java.util.Locale; 019import java.util.regex.Pattern; 020import java.util.regex.Matcher; 021 022import static org.opengion.fukurou.util.StringUtil.isNull; 023 024/** 025 * GF91.GF92テーブルとJSPの変換オブジェクト 026 * 027 * 028 * @author Takeshi.Takada 029 * 030 */ 031public final class JspConvertEntity { 032 // 5.5.2.6 (2012/05/25) findbugs対応 033 private static final String[] DBKEY = {"SYSTEM_ID","PGID","NMSYORI","SEQ","CLM","CLM_NAME","KBACCS", 034 "MUST","DEFAULT_VAL","TABLE_NAME","ZOKUSEI","SETU", 035 "NMSYS","NMPG","HPGID","USE_ORDER","AS_CLM","JOINTYPE","AS_TABLE","CLS_NAME"}; 036 037 // 5.1.1.0 (2009/12/01) データのアクセス用の配列番号のID 038 private static final int PGID = 1; // COMMENTのみ 039 private static final int NMSYORI = 2; 040 // private static final int SEQ = 3; // 未使用 041 private static final int CLM = 4; 042 private static final int CLM_NAME = 5; // 5.6.4.4 (2013/05/31) カラム名 追加 043 // private static final int KBACCS = 6; // 未使用 044 private static final int MUST = 7; 045 private static final int DEFAULT_VAL = 8; 046 private static final int TABLE_NAME = 9; 047 private static final int ZOKUSEI = 10; 048 // private static final int SETU = 11; // 未使用 049 private static final int NMSYS = 12; // COMMENTのみ 050 private static final int NMPG = 13; // COMMENTのみ 051 // private static final int HPGID = 14; // 未使用 052 private static final int USE_ORDER = 15; 053 private static final int AS_CLM = 16; 054 private static final int JOINTYPE = 17; 055 private static final int AS_TABLE = 18; 056 private static final int CLS_NAME = 19; 057 058 private final String _type; // GF92.NMSYORI 059 private final String _column_name; // GF92.CLM 060 private final String _clm_name_ja; // 5.6.4.4 (2013/05/31) カラム名 追加(GF92にはなく、リソースから変換した名称) 061 private final String _table_name; // GF92.TABLE_NAME GF91.TABLE_NAME 062 private final String _as_table_name; // GF91.AS_TABLE 063 private final String _as_column_name; // GF92.AS_CLM 064 private final String _default_value; // GF92.DEFAULT_VAL 065 private final String _remarks; // GF92.ZOKUSEI 066 private final String _must; // GF92.MUST 067 068 private final String _nmsys; // GF90.NMSYS 069 private final String _pgid; // GF92.PGID 070 private final String _nmpg ; // GF90.NMPG 071 072 private final String _use_order; // GF92.USE_ORDER 073 private final boolean _is_number; // 074 private final String _join_type; // GF92.JOIN_TYPE 075 076 private final JspConvertEntity _join_column; 077 078 /** 079 * ファクトリクラス 080 * QUERY、JOIN、CONST は、ZOKUSEIデータが 存在しないとき、作成しません。 081 * ここでは、null を返します。 082 * 083 * @param data (GF92.NMSYORI) 084 * @param clmNo カラム番号配列 085 * 086 * @return 新しく作成された JspConvertEntity 087 */ 088 public static JspConvertEntity newInstance( final String[] data, final int[] clmNo ) { 089 String nmSyori = data[clmNo[NMSYORI]]; 090 String zokusei = data[clmNo[ZOKUSEI]]; 091 092 if( isNull( zokusei ) ) { 093 if( "QUERY".equals(nmSyori) || 094 "JOIN".equals(nmSyori) || 095 "CONST".equals(nmSyori) ) { return null; } 096 } 097 098 return new JspConvertEntity( data, clmNo ) ; 099 } 100 101 /** 102 * コンストラクタ 103 * 104 * @og.rev 5.6.4.4 (2013/05/31) カラム名 追加 105 * 106 * @param data データ配列 107 * @param clmNo カラムの配列番号 108 */ 109 private JspConvertEntity( final String[] data, final int[] clmNo ) { 110 _type = data[clmNo[NMSYORI]]; // GF92.NMSYORI 111 _table_name = data[clmNo[TABLE_NAME]]; // GF92.TABLE_NAME GF91.TABLE_NAME 112 _as_table_name = data[clmNo[AS_TABLE]]; // GF91.AS_TABLE 113 _column_name = data[clmNo[CLM]]; // GF92.CLM 114 _clm_name_ja = data[clmNo[CLM_NAME]]; // 5.6.4.4 (2013/05/31) カラム名 115 _as_column_name = data[clmNo[AS_CLM]]; // GF92.AS_CLM 116 _default_value = data[clmNo[DEFAULT_VAL]]; // GF92.DEFAULT_VAL 117 _remarks = data[clmNo[ZOKUSEI]]; // GF92.ZOKUSEI 118 _must = data[clmNo[MUST]]; // GF92.MUST 119 _use_order = data[clmNo[USE_ORDER]]; // GF92.USE_ORDER 120 _is_number = "NUMBER".equals( data[clmNo[CLS_NAME]]); // 121 _join_type = data[clmNo[JOINTYPE]]; // GF92.JOIN_TYPE 122 123 _nmsys = data[clmNo[NMSYS]]; // GF90.NMSYS 124 _pgid = data[clmNo[PGID]]; // GF92.PGID 125 _nmpg = data[clmNo[NMPG]]; // GF90.NMPG 126 127 if( "JOIN".equals(_type) ) { 128 _join_column = createLeftTable( _remarks ); 129 } 130 else { 131 _join_column = null; 132 } 133 } 134 135 /** 136 * コンストラクタ(通常利用していない) 137 * createLeftTable( String zokusei ) から呼び出す、内部だけで利用しているコンストラクタ 138 * 139 * @og.rev 5.6.4.4 (2013/05/31) カラム名 追加 140 * 141 * @param type 処理名(GF92.NMSYORI) 142 * @param table_name テーブル名(GF92.TABLE_NAME,GF91.TABLE_NAME) 143 * @param as_table_name テーブル別名(GF91.AS_TABLE) 144 * @param column_name カラム名(GF92.CLM) 145 */ 146 private JspConvertEntity( final String type, final String table_name, final String as_table_name, final String column_name ) { 147 _type = type; // GF92.NMSYORI 148 _table_name = table_name; // GF92.TABLE_NAME GF91.TABLE_NAME 149 _as_table_name = as_table_name; // GF91.AS_TABLE 150 _column_name = column_name; // GF92.CLM 151 _clm_name_ja = null; // 5.6.4.4 (2013/05/31) カラム名 152 _as_column_name = null; // GF92.AS_CLM 153 _default_value = null; // GF92.DEFAULT_VAL 154 _remarks = null; // GF92.ZOKUSEI 155 _must = null; // GF92.MUST 156 _use_order = null; // GF92.USE_ORDER 157 _is_number = false; // 158 _join_type = null; // GF92.JOIN_TYPE 159 _join_column = null; 160 _nmsys = null; // GF90.NMSYS 161 _pgid = null; // GF92.PGID 162 _nmpg = null; // GF90.NMPG 163 } 164 165 /** 166 * データのアクセス用のカラム名配列を返します。 167 * これを利用して、カラム名の番号を取得し、JspConvertEntity#newInstance( String[],int[] ) の 168 * 2番目の引数に指定します。 169 * 170 * @og.rev 5.5.2.6 (2012/05/25) findbugs対応。JspConvertEntity.DBKEY を、JspConvertEntity.getDBKEY() に変更。 171 * 172 * @return DBKEY配列のクローン 173 */ 174 public static String[] getDBKEY() { 175 return DBKEY.clone(); 176 } 177 178 /** 179 * データのタイプを取得。(GF92.NMSYORI) 180 * 181 * @return データのタイプ 182 */ 183 public String getType(){ 184 return _type; 185 } 186 187 /** 188 * テーブル名を取得。(GF92.TABLE_NAME GF91.TABLE_NAME) 189 * 190 * @return テーブル名 191 */ 192 public String getTableName(){ 193 return _table_name; 194 } 195 196 /** 197 * カラム名を取得。(GF92.CLM) 198 * 199 * @return カラム名 200 */ 201 public String getColumnName(){ 202 return _column_name; 203 } 204 205 /** 206 * カラム名称を取得。 207 * 208 * カラム名称は、GF92.CLM をキーにリソースを検索した結果の日本語になります。SELECT文のコメントに使います。 209 * 210 * @og.rev 5.6.4.4 (2013/05/31) カラム名 追加 211 * 212 * @return カラム名称 213 */ 214 public String getColumnCommentName(){ 215 return _clm_name_ja; 216 } 217 218 /** 219 * テーブル名が先頭に付いたカラム名を取得。 220 * 221 * @return カラム名(テーブル名付き) 222 */ 223 public String getFullColumnName(){ 224 String preffix = ""; 225 226 if ( isNull( _as_table_name ) ) { 227 preffix = _table_name; 228 } 229 else { 230 preffix = _as_table_name; 231 } 232 //集計関数が利用されている場合は、関数別に特別な処理を実装する必要がある。 233 //現在は、テーブル名やテーブル別名を付加せずにスルーする様に実装してあります。 234 Matcher matcher = null; 235 for (JspEnumeration.TREATS_STRING_FUNCTIONS func : JspEnumeration.TREATS_STRING_FUNCTIONS.values()){ 236 String k = func.toString(); 237 matcher = Pattern.compile("(((\\s*?)|\\()" + k + "(\\s+?))|(((\\s*?)|\\()" + k.toLowerCase( Locale.JAPAN ) + "(\\s+?))").matcher( _column_name ); 238 if (matcher.find()){ 239 return func.update( _column_name , new String[]{ } ); 240 } 241 } 242 return preffix + "." + _column_name; 243 } 244 245 /** 246 * 結合先のカラム情報を取得。 247 * 248 * @return 結合先のカラム 249 */ 250 public JspConvertEntity getJoinColumn(){ 251 return _join_column; 252 } 253 254 /** 255 * テーブルに付ける別名を取得(GF91.AS_TABLE) 256 * 257 * @return テーブルに付ける別名 258 */ 259 public String getAsTableName(){ 260 return _as_table_name; 261 } 262 263 /** 264 * カラムに付ける別名を取得(GF92.AS_CLM) 265 * 266 * @return カラムに付ける別名 267 */ 268 public String getAsColumnName(){ 269 return _as_column_name; 270 } 271 272 /** 273 * Select句ですぐに利用可能なカラム名を取得。 274 * 275 * @return カラム名 276 */ 277 public String getSelectPartColumnName(){ 278 if( isNull( _remarks ) || "DISP".equalsIgnoreCase( _remarks ) ) { 279 if( isNull( _as_column_name ) ) { 280 return getFullColumnName(); 281 } 282 else { 283 return getFullColumnName() + " as " + _as_column_name; 284 } 285 } 286 else { 287 if( isNull( _as_column_name ) ) { 288 return _remarks + "(" + getFullColumnName() + ")"; 289 } 290 else { 291 return _remarks + "(" + getFullColumnName() + ") as " + _as_column_name; 292 } 293 } 294 } 295 296 /** 297 * From句ですぐに利用可能なカラム名を取得。 298 * 299 * @return 別名のついたテーブル名 300 */ 301 public String getFromPartTableName(){ 302 if( isNull( _as_table_name ) ) { 303 return _table_name; 304 }else{ 305 return _table_name + " " + _as_table_name; 306 } 307 } 308 309 /** 310 * 初期値を取得。(GF92.DEFAULT_VAL) 311 * 312 * @return 初期値 313 */ 314 public String getDefaultValue(){ 315 return _default_value; 316 } 317 318 /** 319 * 属性内容を取得。(GF92.ZOKUSEI) 320 * 321 * @return 属性内容 322 */ 323 public String getRemarks(){ 324 return _remarks; 325 } 326 327 /** 328 * 必須を取得。(GF92.MUST) 329 * 330 * @return 必須 331 */ 332 public String getMust(){ 333 return _must; 334 } 335 336 /** 337 * 並び替え設定か否かを判定(GF92.USE_ORDER) 338 * 339 * @return 判定結果 340 */ 341 public String getUseOrder(){ 342 return _use_order; 343 } 344 345 /** 346 * 数値項目か否かを判定 347 * 348 * @return 判定結果 349 */ 350 public boolean isNumber(){ 351 return _is_number; 352 } 353 354 /** 355 * システムの名称を取得します。(GF90.NMSYS) 356 * 357 * @return 名称 358 */ 359 public String getNmSys(){ 360 return _nmsys; 361 } 362 363 /** 364 * プログラムIDを取得します。(GF92.PGID) 365 * 366 * @return プログラムID 367 */ 368 public String getPgid(){ 369 return _pgid; 370 } 371 372 /** 373 * プログラムの名称を取得します。(GF90.NMPG) 374 * 375 * @return 名称 376 */ 377 public String getNmpg(){ 378 return _nmpg; 379 } 380 381 /** 382 * 外部結合かを判定(GF92.JOIN_TYPE) 383 * 384 * @return 判定結果 385 */ 386 public String getJoinType(){ 387 return _join_type; 388 } 389 390 /** 391 * 外部結合かを判定(GF92.JOIN_TYPE) 392 * 393 * @param zokusei 属性情報 394 * 395 * @return 外部結合のJspConvertEntityオブジェクト 396 */ 397 private JspConvertEntity createLeftTable( final String zokusei ){ 398 JspConvertEntity rgt = null; 399 400 String[] rgt_data = zokusei.split( "__" ); 401 if( rgt_data.length == 3 ){ 402 String rgt_tbl = rgt_data[1]; 403 String rgt_as_tbl = rgt_data[2].substring( 0 , rgt_data[2].indexOf('.') ); 404 String rgt_clm = rgt_data[2].substring( rgt_data[2].indexOf('.') + 1 ); 405 406 rgt = new JspConvertEntity( "JOIN",rgt_tbl,rgt_as_tbl,rgt_clm ); 407 } 408 409 return rgt; 410 } 411}