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.fukurou.util.StringUtil;
019    import org.opengion.hayabusa.db.AbstractTableFilter;
020    import org.opengion.hayabusa.db.DBTableModel;
021    
022    import java.util.Map;
023    
024    /**
025     * TableFilter_BIKO2CODE は、TableFilter インターフェースを継承した、DBTableModel 処?の
026     * 実?ラスです?
027     *
028     * ここでは、DB定義書??の備???し?コードリソースとして登録可能な形に再構築します?
029     * 入力カラ?してBIKOが?出力カラ?して、CODE,CODENAME,SEQが?です?
030     * それぞれのカラ?は、keys,valsの引数としても指定可能です?
031     *
032     * ?方法としては、まず備??' '(スペ?ス)区?に?し?<del>取り出したコード情報?
033     * DBTableModelの行として追?ます?</del>
034     * そ?上で、さらに取り出した値?:'で?してコードとコード名称に?します?
035     * ?(SEQ)につ?は、備??記載されて??になります?
036     *
037     * また?BIKO,CODE,CODENAME,SEQ で?したカラ? DBTableModel に存在しな??合??
038     * 処?のも?を無視します?そ?場合?、警告も出力されませんので、ご注意く???
039     *
040     * パラメータは、tableFilterタグの keys, vals にそれぞれ記述するか?BODY 部にCSS形式で記述します?
041     * 【パラメータ?
042     *  {
043     *       BIKO       : 入力カラ?;    備???を?納して?入力カラ??
044     *       CODE       : 出力カラ?;    コードを格納する?力カラ??
045     *       CODENAME   : 出力カラ?;    コード名称を?納する?力カラ??
046     *       SEQ        : 出力カラ?;    並び?格納する?力カラ?。備??記載されて??になります?
047     *  }
048     *
049     * @og.formSample
050     * ●形式?
051     *      select TABLE_NAME,CLM,NAME_JA,EDITOR,RENDERER,DBTYPE,BIKO,0 SEQ,'' CODE,'' CODENAME,UNIQ,SYSTEM_ID from GF05
052     *      ?&lt;og:tableFilter classId="BIKO2CODE" keys="BIKO,CODE," vals='"TABLE_NAME,CLM"' /&gt;
053     *
054     *      ② &lt;og:tableFilter classId="BIKO2CODE" &gt;
055     *               {
056     *                       BIKO       : 入力カラ?;    備???を?納して?入力カラ??
057     *                       CODE       : 出力カラ?;    コードを格納する?力カラ??
058     *                       CODENAME   : 出力カラ?;    コード名称を?納する?力カラ??
059     *                       SEQ        : 出力カラ?;    並び?格納する?力カラ?。備??記載されて??になります?
060     *               }
061     *         &lt;/og:tableFilter&gt;
062     *
063     * @og.rev 4.1.0.0(2008/01/18) 新規作?
064     * @og.rev 5.6.6.0 (2013/07/05) keys の整合?チェ?を追?
065     *
066     * @version  0.9.0  2000/10/17
067     * @author   Hiroki Nakamura
068     * @since    JDK1.1,
069     */
070    public class TableFilter_BIKO2CODE extends AbstractTableFilter {
071            //* こ?プログラ??VERSION??を設定します?       {@value} */
072            private static final String VERSION = "5.6.6.1 (2013/07/12)" ;
073    
074            /**
075             * keys の整合?チェ?を行うための初期設定を行います?
076             *
077             * @og.rev 5.6.6.1 (2013/07/12) keys の整合?チェ?対?
078             *
079             * @param       keysMap keys の整合?チェ?を行うための Map
080             */
081            @Override
082            protected void init( final Map<String,String> keysMap ) {
083                    keysMap.put( "BIKO"             , "備???を?納して?入力カラ?"         );
084                    keysMap.put( "CODE"     , "コードを格納する?力カラ?"                     );
085                    keysMap.put( "CODENAME" , "コード名称を?納する?力カラ?"          );
086                    keysMap.put( "SEQ"              , "並び?格納する?力カラ?"                     );
087            }
088    
089            /**
090             * DBTableModel処?実行します?
091             *
092             * @og.rev 5.5.2.6 (2012/05/25) protected変数を?private化したため?getterメソ?で取得するよ?変更
093             * @og.rev 5.5.8.5 (2012/11/27) スペ?スで?し?":" が存在する?のみ、コードリソース化します?
094             *
095             * @return 処?果のDBTableModel
096             */
097            public DBTableModel execute() {
098                    DBTableModel table = getDBTableModel();         // 5.5.2.6 (2012/05/25) インターフェースにgetterメソ?追?
099    
100                    int bikoNo = table.getColumnNo( StringUtil.nval( getValue( "BIKO" ), "BIKO" ), false );         // 存在しな??合??1 を返す?
101                    int codeNo = table.getColumnNo( StringUtil.nval( getValue( "CODE" ), "CODE" ), false );
102                    int nameNo = table.getColumnNo( StringUtil.nval( getValue( "CODENAME" ),"CODENAME" ), false );
103                    int seqNo  = table.getColumnNo( StringUtil.nval( getValue( "SEQ" ),  "SEQ" ), false );
104    
105                    char sep = ' ';
106    
107                    if( bikoNo >= 0 && codeNo >= 0 && nameNo >= 0 && seqNo >= 0 ) {
108                            String[] data  = null;
109                            String[] nData = null;
110                            String[] clmValArr = null;
111                            int addRows = 0;
112                            int rowCnt = table.getRowCount();
113                            for( int row=0; row<rowCnt; row++ ) {
114                                    addRows = 0;
115                                    data = table.getValues( row );
116                                    // タグがあった?合?無?
117                                    if( data[bikoNo].indexOf( "/>" ) < 0 && data[bikoNo].indexOf( "</" ) < 0 ) {
118                                            clmValArr = StringUtil.csv2Array( data[bikoNo], sep );
119    //                                      for ( int i = 0; i < clmValArr.length; i++ ) {
120    //                                              addRows++;
121    //                                              nData = new String[data.length];
122    //                                              System.arraycopy( data, 0, nData, 0, data.length );
123    //                                              int clnIdx = clmValArr[i].indexOf( ':' );
124    //                                              if( clnIdx < 0 ) {
125    //                                                      nData[codeNo] = clmValArr[i];
126    //                                                      nData[nameNo] = "";
127    //                                              }
128    //                                              else {
129    //                                                      nData[codeNo] = clmValArr[i].substring( 0, clmValArr[i].indexOf( ':' ) );
130    //                                                      nData[nameNo] = clmValArr[i].substring( clmValArr[i].indexOf( ':' ) + 1 );
131    //                                              }
132    //                                              nData[seqNo] = String.valueOf( i );
133    //                                              table.addValues( nData, row+addRows, false );
134    //                                      }
135                                            // 5.5.8.5 (2012/11/27) スペ?スで?し?":" が存在する?のみ、コードリソース化します?
136                                            int seq = 0;
137                                            for ( int i = 0; i < clmValArr.length; i++ ) {
138                                                    String clmVal = clmValArr[i];
139                                                    int clnIdx = clmVal.indexOf( ':' );
140                                                    if( clnIdx >= 0 ) {
141                                                            nData = new String[data.length];
142                                                            System.arraycopy( data, 0, nData, 0, data.length );
143    
144                                                            nData[codeNo] = clmVal.substring( 0, clnIdx );
145                                                            nData[nameNo] = clmVal.substring( clnIdx + 1 );
146                                                            nData[seqNo]  = String.valueOf( seq++ );
147    
148                                                            addRows++;
149                                                            table.addValues( nData, row+addRows, false );
150                                                    }
151                                            }
152    
153                                            if( addRows > 0 ) {
154                                                    table.removeValue( row );
155                                                    addRows--;
156                                            }
157    
158                                            row += addRows;
159                                            rowCnt += addRows;
160                                    }
161                            }
162                    }
163    
164                    return table;
165            }
166    }