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.db.AbstractTableFilter;
019 import org.opengion.hayabusa.db.DBTableModel;
020
021 import org.opengion.fukurou.util.ErrorMessage;
022 import org.opengion.fukurou.util.StringUtil;
023
024 import java.util.Locale;
025 import java.util.Map;
026
027 /**
028 * TableFilter_DTYPE は、TableFilter インターフェースを継承した、DBTableModel 処ç�?”¨の
029 * 実è£?‚¯ラスですã?
030 *
031 * ここでは、キーの CLS_NAME,USE_LENGTH より、DTYPE の値を設定しますã?
032 * CLS_NAME は、VARCHAR2, NUMBER などのカラãƒ??属æ?を表しますã?
033 * USE_LENGTH はã€?•·ã�?使用桁数)ですã?
034 * DTYPE は、X(10) ã‚?? S9(8) などの簡易型カラãƒ?±žæ?ですã?
035 * エンジンを使用したシスãƒ?ƒ では、この属æ?より、さらに詳細にカラãƒ?‚’定義するã€?
036 * DBTYPE 属æ?がã?ありますã?å°?�¥çš?�«は、この定義を使用するようにåˆ?‚Š替えてã�?��予定ですã?
037 *
038 * CLS_NAME,USE_LENGTH,DTYPE の カラãƒ?��につã�?�¦は、å?期å?はこã?ままですがã€?
039 * keys , vals にæŒ?®šすれã?、別名につã�?�¦も使用することが可能ですã?
040 *
041 * パラメータは、tableFilterタグの keys, vals にそれぞれ記述するかã?BODY 部にCSS形式で記述しますã?
042 * 【パラメータã€?
043 * {
044 * CLS_NAME : CLS_NAME ; VARCHAR2, NUMBER などのカラãƒ?±žæ?を指定するカラãƒ?��を指定しますã?(初期値:CLS_NAME)
045 * USE_LENGTH : USE_LENGTH ; 長ã�?使用桁数)を表すカラãƒ?��を指定しますã? (初期値:USE_LENGTH)
046 * DTYPE : DTYPE ; X,R,S9,R,D,CLOB など、エンジンを使用したシスãƒ?ƒ で規定した詳細定義(初期値:DTYPE)
047 * }
048 *
049 * @og.formSample
050 * ●形式ï¼?
051 * â‘?<og:tableFilter classId="DTYPE" keys="CLS_NAME,USE_LENGTH,DTYPE" vals='"TABLE_NAME,CLM"' />
052 *
053 * ② <og:tableFilter classId="DTYPE" >
054 * {
055 * CLS_NAME : CLS_NAME ;
056 * USE_LENGTH : USE_LENGTH ;
057 * DTYPE : DTYPE ;
058 * }
059 * </og:tableFilter>
060 *
061 * @og.rev 5.6.6.0 (2013/07/05) keys の整合æ?チェãƒ?‚¯を追åŠ?
062 *
063 * @version 0.9.0 2000/10/17
064 * @author Kazuhiko Hasegawa
065 * @since JDK1.5,
066 */
067 public class TableFilter_DTYPE extends AbstractTableFilter {
068 //* こã?プログラãƒ??VERSIONæ–?—å?を設定しますã? {@value} */
069 private static final String VERSION = "5.6.6.1 (2013/07/12)" ;
070
071 /**
072 * keys の整合æ?チェãƒ?‚¯を行うための初期設定を行いますã?
073 *
074 * @og.rev 5.6.6.1 (2013/07/12) keys の整合æ?チェãƒ?‚¯対å¿?
075 *
076 * @param keysMap keys の整合æ?チェãƒ?‚¯を行うための Map
077 */
078 @Override
079 protected void init( final Map<String,String> keysMap ) {
080 keysMap.put( "CLS_NAME" , "VARCHAR2, NUMBER などのカラãƒ?±žæ?を指定するカラãƒ?��を指å®?初期値:CLS_NAME)" );
081 keysMap.put( "USE_LENGTH" , "長ã�?使用桁数)を表すカラãƒ?��を指å®?(初期値:USE_LENGTH)" );
082 keysMap.put( "DTYPE" , "X,R,S9,R,D,CLOB など、エンジンを使用したシスãƒ?ƒ で規定した詳細定義(初期値:DTYPE)" );
083 }
084
085 /**
086 * DBTableModel処ç�?‚’実行しますã?
087 *
088 * @og.rev 5.5.2.6 (2012/05/25) protected変数をã?private化したためã?getterメソãƒ?ƒ‰で取得するよã�?�«変更
089 * @og.rev 5.5.8.2 (2012/11/09) X,S9 の条件åˆ?�‘を変更しますã?(MICS対å¿?
090 *
091 * @return 処ç�?µ�果のDBTableModel
092 */
093 public DBTableModel execute() {
094 DBTableModel table = getDBTableModel(); // 5.5.2.6 (2012/05/25) インターフェースにgetterメソãƒ?ƒ‰追åŠ?
095
096 String cls = StringUtil.nval( getValue( "CLS_NAME" ) ,"CLS_NAME" );
097 String len = StringUtil.nval( getValue( "USE_LENGTH" ) ,"USE_LENGTH" );
098 String typ = StringUtil.nval( getValue( "DTYPE" ) ,"DTYPE" );
099
100 int clsNo = table.getColumnNo( cls,false ); // 存在しなã�??合ã?ã€?1 を返すã€?
101 int lenNo = table.getColumnNo( len,false );
102 int typNo = table.getColumnNo( typ,false );
103
104 if( clsNo >= 0 && lenNo >= 0 && typNo >= 0 ) {
105 String[] data = null;
106 int rowCnt = table.getRowCount();
107 String clsVal = null;
108 String lenVal = null;
109 for( int row=0; row<rowCnt; row++ ) {
110 try {
111 data = table.getValues( row );
112 clsVal = ( data[clsNo] == null ) ? "" : data[clsNo].trim().toUpperCase(Locale.JAPAN) ; // CLS_NAME(VARCHAR,NUMBER など)
113 lenVal = ( data[lenNo] == null ) ? "" : data[lenNo].trim().replace( '.',',' ) ; // USE_LENGTH(使用桁数)
114
115 // 長さで、小数部がã? 0 の場合ã?、整数のみと判断するã€?
116 int cm = lenVal.indexOf( ",0" );
117 if( cm >= 0 ) { lenVal = lenVal.substring( 0,cm ); }
118
119 // 5.5.8.2 (2012/11/09) X,S9 の条件åˆ?�‘を変更しますã?(MICS対å¿?
120 String typVal = makeDTYPE( clsVal ,lenVal ) ;
121 data[typNo] = typVal;
122
123 if( lenVal.contains( "," ) ) { data[lenNo] = lenVal ; } // "," が含まれてã�?‚‹場合ã?、ã?再設å®?
124
125 // table.setValueAt( typVal,row,typNo );
126
127 // StringBuilder typVal = new StringBuilder();
128 // // 5.5.8.2 (2012/11/09) X,S9 の条件åˆ?�‘を変更しますã?
129 // String clsVal2 = clsVal.substring(0,2); // 先é??’文字で判定しますã?
130 // // NUMBER , INTEGER , INT64 , DECIMAL
131 // if( "NU".equalsIgnoreCase( clsVal2 ) || "IN".equalsIgnoreCase( clsVal2 ) || "DE".equalsIgnoreCase( clsVal2 ) ) {
132 // typVal.append( "S9(" );
133 // }
134 // // TIMESTAMP , DATE
135 // else if( "TI".equalsIgnoreCase( clsVal2 ) || "DA".equalsIgnoreCase( clsVal2 ) ) {
136 // typVal.append( "T(" );
137 // }
138 // // VARCHAR , VARCHAR2 , CHAR , CLOB
139 // // else if( "VA".equalsIgnoreCase( clsVal2 ) || "CH".equalsIgnoreCase( clsVal2 ) || "CL".equalsIgnoreCase( clsVal2 ) ) {
140 // // typVal.append( "X(" );
141 // // }
142 // else {
143 // typVal.append( "X(" );
144 // }
145 //
146 //// if( "NUMBER".equalsIgnoreCase( clsVal ) ) {
147 //// typVal.append( "S9(" );
148 //// }
149 //// else {
150 //// typVal.append( "X(" );
151 //// }
152 //
153 // int cm = lenVal.indexOf( ".0" );
154 // if( cm > 0 ) {
155 // typVal.append( lenVal.substring( 0,cm ) );
156 // }
157 // else {
158 // typVal.append( lenVal );
159 // }
160 // typVal.append( ')' );
161 //
162 // table.setValueAt( typVal.toString(),row,typNo );
163 }
164 catch( RuntimeException ex ) {
165 ErrorMessage errMessage = makeErrorMessage( "TableFilter_DTYPE Error",ErrorMessage.NG );
166 errMessage.addMessage( row+1,ErrorMessage.NG,ex.getMessage() );
167 errMessage.addMessage( row+1,ErrorMessage.NG,StringUtil.array2csv( data ) );
168 errMessage.addMessage( row+1,ErrorMessage.NG,"CLS=[" + clsVal + "],LEN=[" + lenVal + "]" );
169 }
170 }
171 }
172
173 return table;
174 }
175
176 /**
177 * クラス,長さデータ から、DTYPE æ–?—å?を作æ?しますã?
178 *
179 * ifæ–??ç¾??から、ã?スタãƒ??タを利用した条件判定方式で判定しますã?
180 * またã?以前からã?、S9:数å?とã€?X:æ–??ã�?�‘ではなくã?R:少数、D:日時ã?CLOB:ãƒ?‚スãƒ?を追åŠ?�—ますã?
181 * 桁数未設定ã?場合ã?ã€?桁数) を使用せず、記号ã�?�‘になりますã?
182 *
183 * @og.rev 5.5.8.2 (2012/11/09) 新規追åŠ?
184 *
185 * @param clsVal クラスãƒ??タ(not null保障 , 大æ–?—保障)
186 * @param lenVal 長さデータ(not null , カンマ保障)
187 * @return 対応すã‚?DTYPE æ–?—å?
188 */
189 private String makeDTYPE( final String clsVal,final String lenVal ) {
190 StringBuilder typVal = new StringBuilder();
191
192 int size = MASTER_DATA.length;
193 for( int i=0; i<size; i++ ) {
194 String clsMstr = MASTER_DATA[i][NO_CLS];
195 String lenMstr = MASTER_DATA[i][NO_LEN];
196
197 if( ( clsMstr == null || clsVal.startsWith( clsMstr ) ) &&
198 ( lenMstr == null || lenVal.contains( lenMstr ) ) ) {
199 typVal.append( MASTER_DATA[i][NO_TYP] );
200 break ;
201 }
202 }
203 if( typVal.length() == 0 ) { typVal.append( MASTER_DATA[size-1][NO_TYP] ); } // MASTER_DATA のæœ?µ‚レコードでマッチするã?で、来なã�??ã�?
204
205 if( ! lenVal.isEmpty() ) { // 長さが存在する場合ã?ã€?xx)の数字部åˆ?‚’記述する。これが通常のケース
206 typVal.append( "(" ).append( lenVal ).append( ")" );
207 }
208
209 return typVal.toString();
210 }
211
212 // 5.5.8.2 (2012/11/09) DTYPE の条件åˆ?�‘を変更しますã?
213 //* DTYPE の条件åˆ?�‘の マスターãƒ??タレコーãƒ?を設定しますã? {@value} */
214 private static final String[][] MASTER_DATA = new String[][] {
215 // cls , len , dbtype
216 { "VA" , null , "X" } , // VARCHAR , VARCHAR2
217 { "NU" , "," , "R" } , // NUMBER(少数)
218 { "NU" , null , "S9" } , // NUMBER(整数)
219 { "IN" , null , "S9" } , // INTEGER , INT64
220 { "DE" , null , "R" } , // DECIMAL
221 { "TI" , null , "D" } , // TIMESTAMP
222 { "DA" , null , "D" } , // DATE
223 { "CL" , null , "CLOB" } , // CLOB
224 { null , null , "X" } // そã?ä»?CHAR , LONG ä»?
225 } ;
226
227 private static final int NO_CLS = 0;
228 private static final int NO_LEN = 1;
229 private static final int NO_TYP = 2;
230 }