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.Map;
025    
026    /**
027     * TableFilter_KBCLM は、TableFilter インターフェースを継承した、DBTableModel 処?の
028     * 実?ラスです?
029     *
030     * ここでは、キーは、GF80(DB定義書マスタ)のカラ????ム区?KBCLM)を設定します?
031     * SELECTする??ブルもカラ?固定です?設定するカラ??、KBCLM 固定です?
032     * ?限?なのは、CLM,UK,LUK,IXA,IXB,IXC,IXD,IXE,IXF,IXG,IXH,IXI,IXJ,IXK,NOT_NULL と KBCLM です?
033     * 唯??引数は、?通カラ?して?するCSV形式?カラ?です?keys="COM_CLMS" に、設定します?
034     *
035     * 具体的には、KBCLM に設定する?は、下記?とおりです?
036     *
037     * KBCLM
038     * 0:初期(未)  区?設定?初期状態で?
039     * 1:UK  (?  物?ニ?クカラ??
040     * 2:LUK (?  論理ユニ?クカラ??
041     * 3:IDX (+)   イン?クスカラ??
042     * 4:NN  (*)   Not Nullカラ??
043     * 5:?(_)   ??関連図では省略可能で?
044     * 6:除?-)   リソース反映除外カラ??
045     * 7:共?C)   全??ブル共通属?で?
046     * 8:有閑(Y)   存在しますが未使用カラ??
047     * 9:削除(X)   実?は削除済みで?
048     * 
049     * 設定する?の優先?位??:共?1:UK,2:LUK,3:IDX,4:NN になります?
050     *
051     * パラメータは、tableFilterタグの keys, vals にそれぞれ記述するか?BODY 部にCSS形式で記述します?
052     * 【パラメータ?
053     *  {
054     *       COM_CLMS   : {@COM_CLMS}  ; 共通カラ?して?するCSV形式?カラ?
055     *  }
056     *
057     * @og.formSample
058     * ●形式?
059     *      ?<og:tableFilter classId="KBCLM" keys="COM_CLMS" vals="{@COM_CLMS}" />
060     *
061     *      ② <og:tableFilter classId="KBCLM" >
062     *               {
063     *                   COM_CLMS   : {@COM_CLMS}   ;
064     *               }
065     *         </og:tableFilter>
066     *
067     * @og.rev 5.7.6.2 (2014/05/16) 新規追?
068     *
069     * @version  6.0  2014/05/02
070     * @author   Kazuhiko Hasegawa
071     * @since    JDK1.7,
072     */
073    public class TableFilter_KBCLM extends AbstractTableFilter {
074            //* こ?プログラ??VERSION??を設定します?       {@value} */
075            private static final String VERSION = "5.7.6.2 (2014/05/16)" ;
076    
077            /**
078             * keys の整合?チェ?を行うための初期設定を行います?
079             *
080             * @param       keysMap keys の整合?チェ?を行うための Map
081             */
082            @Override
083            protected void init( final Map<String,String> keysMap ) {
084                    keysMap.put( "COM_CLMS"         , "共通カラ?して?するCSV形式?カラ?"                                          );
085            }
086    
087            /**
088             * DBTableModel処?実行します?
089             *
090             * @return 処?果のDBTableModel
091             */
092            public DBTableModel execute() {
093                    DBTableModel table = getDBTableModel();         // 5.5.2.6 (2012/05/25) インターフェースにgetterメソ?追?
094    
095                    String comClms = StringUtil.nval( getValue( "COM_CLMS" ) ,null );
096    
097                    int clmNo  = table.getColumnNo( "CLM",false );          // 存在しな??合??1 を返す?
098                    int ukNo   = table.getColumnNo( "UK" ,false );
099                    int lukNo  = table.getColumnNo( "LUK",false );
100                    int ixaNo  = table.getColumnNo( "IXA",false );
101                    int ixbNo  = table.getColumnNo( "IXB",false );
102                    int ixcNo  = table.getColumnNo( "IXC",false );
103                    int ixdNo  = table.getColumnNo( "IXD",false );
104                    int ixeNo  = table.getColumnNo( "IXE",false );
105                    int ixfNo  = table.getColumnNo( "IXF",false );
106                    int ixgNo  = table.getColumnNo( "IXG",false );
107                    int ixhNo  = table.getColumnNo( "IXH",false );
108                    int ixiNo  = table.getColumnNo( "IXI",false );
109                    int ixjNo  = table.getColumnNo( "IXJ",false );
110                    int ixkNo  = table.getColumnNo( "IXK",false );
111                    int nnNo   = table.getColumnNo( "NOT_NULL",false );
112    
113                    int kbclmNo = table.getColumnNo( "KBCLM",false );       // 計算結果の値を書き?すカラ?
114    
115                    if( kbclmNo >= 0 ) {
116                            String[] data  = null;
117                            int rowCnt = table.getRowCount();
118                            boolean isUK  = false;
119                            boolean isLUK = false;
120                            boolean isIDX = false;
121                            boolean isNN  = false;
122                            boolean isCOM = false;
123    
124                            // KBCLMに変更がなければ、レコードを削除します?よって???チェ?します?
125                            for( int row=rowCnt-1; row>=0; row-- ) {
126                                    try {
127                                            data   = table.getValues( row );
128                                            isUK   = ukNo  >= 0 && data[ukNo]  != null && data[ukNo].trim().length() > 0 ;
129                                            isLUK  = lukNo >= 0 && data[lukNo] != null && data[lukNo].trim().length() > 0 ;
130                                            isNN   = nnNo  >= 0 && data[nnNo]  != null && data[nnNo].trim().length() > 0 ;
131                                            isCOM  = clmNo >= 0 && data[clmNo] != null && comClms != null
132                                                                    && comClms.indexOf( "'" + data[clmNo].trim() + "'" ) >= 0 ;
133                                            isIDX  = ixaNo >= 0 && data[ixaNo] != null && data[ixaNo].trim().length() > 0
134                                                      || ixbNo >= 0 && data[ixbNo] != null && data[ixbNo].trim().length() > 0
135                                                      || ixcNo >= 0 && data[ixcNo] != null && data[ixcNo].trim().length() > 0
136                                                      || ixdNo >= 0 && data[ixdNo] != null && data[ixdNo].trim().length() > 0
137                                                      || ixeNo >= 0 && data[ixeNo] != null && data[ixeNo].trim().length() > 0
138                                                      || ixfNo >= 0 && data[ixfNo] != null && data[ixfNo].trim().length() > 0
139                                                      || ixgNo >= 0 && data[ixgNo] != null && data[ixgNo].trim().length() > 0
140                                                      || ixhNo >= 0 && data[ixhNo] != null && data[ixhNo].trim().length() > 0
141                                                      || ixiNo >= 0 && data[ixiNo] != null && data[ixiNo].trim().length() > 0
142                                                      || ixjNo >= 0 && data[ixjNo] != null && data[ixjNo].trim().length() > 0
143                                                      || ixkNo >= 0 && data[ixkNo] != null && data[ixkNo].trim().length() > 0 ;
144    
145                                            // KBCLM の値をチェ?します?
146                                            String kbclm =makeKBCLM( isUK , isLUK , isIDX , isNN , isCOM , data[kbclmNo] ) ;
147                                            if( kbclm != null ) {
148                                                    data[kbclmNo] = kbclm ;                 // 値の書き戻?
149                                            }
150                                            else {
151                                                    table.removeValue( row );               // kbclm に変更がなければ、null なので、レコード削除
152                                            }
153                                    }
154                                    catch( RuntimeException ex ) {
155                                            ErrorMessage errMessage = makeErrorMessage( "TableFilter_KBCLM Error",ErrorMessage.NG );
156                                            errMessage.addMessage( row+1,ErrorMessage.NG,ex.getMessage() );
157                                            errMessage.addMessage( row+1,ErrorMessage.NG,StringUtil.array2csv( data ) );
158                                    }
159                            }
160                    }
161                    return table;
162            }
163    
164            /**
165             * UK,LUK,???ッ??,NotNull,共通カラ?から??ム区?KBCLM) を作?します?
166             * KBCLM に変更がなければ、null を返します?
167             *
168             * 0:初期(未)  区?設定?初期状態で?              (ここでは設定されません?
169             * 1:UK  (?  物?ニ?クカラ??               isUK=true の場合?第2優?
170             * 2:LUK (?  論理ユニ?クカラ??               isLUK=true の場合?第3優?
171             * 3:IDX (+)   イン?クスカラ??             isIDX=true の場合?第4優?
172             * 4:NN  (*)   Not Nullカラ??                        isNN=true の場合?第5優?
173             * 5:?(_)   ??関連図では省略可能で? 既存が 0,1,2,3,4,7 で該当しな??合?5:? に設定します?
174             * 6:除?-)   リソース反映除外カラ??   (ここでは設定されません?
175             * 7:共?C)   全??ブル共通属?で?               isCOM=true の場合?第1優?
176             * 8:有閑(Y)   存在しますが未使用カラ??  (ここでは設定されません?
177             * 9:削除(X)   実?は削除済みで?                   (ここでは設定されません?
178             *
179             * @og.rev 5.7.6.2 (2014/05/16) 新規追?
180             *
181             * @param  isUK 物?ニ?クキーかど?(true/false)
182             * @param  isLUK 論理ユニ?クキーかど?(true/false)
183             * @param  isIDX イン?クスカラ?ど?(true/false)
184             * @param  isNN  NOT NULL制?設定されて?かど?(true/false)
185             * @param  isCOM 共通カラ?と??して?かど?(true/false)
186             * @param  kbclm 現在の??ム区?KBCLM)の値
187             * @return 対応す???ム区?KBCLM)の値(変更がなければ、nullを返す)
188             */
189            private String makeKBCLM( final boolean isUK , final boolean isLUK , final boolean isIDX
190                                                             , final boolean isNN , final boolean isCOM , final String kbclm ) {
191    
192                    String rtn = null;
193    
194                    if(     isCOM )  { rtn = "7"; }
195                    else if( isUK )  { rtn = "1"; }
196                    else if( isLUK ) { rtn = "2"; }
197                    else if( isIDX ) { rtn = "3"; }
198                    else if( isNN  ) { rtn = "4"; }
199    
200                    // rtn == null は、該当なし?
201                    if( rtn == null && "0,1,2,3,4,7".indexOf( kbclm ) >= 0 ) { rtn = "5"; }      // 5:? に設?
202    
203                    if( rtn != null && rtn.equals( kbclm ) ) { rtn = null; }                                // 同じ値の場合?、null に戻す?
204    
205                    return rtn;
206            }
207    }