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.fukurou.process;
017    
018    import java.util.List;
019    import java.util.ArrayList;
020    
021    /**
022     * LineModelFilter は、フィルター条件をチェ?して、LineModel のフィルタリング
023     * を判定する実?ラスです?
024     * フィルター条件 には、パ?ージプライベ?トな、FilterOperation enum ?
025     * ?します?
026     *
027     * 注意:このクラスは、同期??れて?せん?
028     *
029     * @version  4.0
030     * @author   Kazuhiko Hasegawa
031     * @since    JDK5.0,
032     */
033    public class LineModelFilter {
034            private final List<FilterOperation> opes = new ArrayList<FilterOperation>();
035            private final List<String> clms = new ArrayList<String>();
036            private final List<String> vals = new ArrayList<String>();
037            private int[] clmNo = null;     // ??の LineModel で構築します?
038            private int   size  = 0;
039    
040            /**
041             * フィルター条件を指定します?
042             * オペレータには、FilterOperation enum ?使用してください?
043             * ?できません?
044             *
045             * @param   ope フィルター条件のオペレーション(PREFIX, SUFFIX, INSTR, EQUALS, MATCH, UNMATCH)
046             * @param   clm 条件判定するカラ?
047             * @param   val 条件値
048             */
049            public void add( final FilterOperation ope,final String clm,final String val ) {
050            //      if( OPERATOR.indexOf( ope ) < 0 ) {
051            //              String errMsg = "オペレータには、prefix,suffix,instr,equals,match,unmatch 以外??できません? ;
052            //              throw new RuntimeException( errMsg );
053            //      }
054    
055                    opes.add( ope );
056                    clms.add( clm );
057                    vals.add( val );
058            }
059    
060            /**
061             * LineModelを指定して、条件にマッチするか、チェ?します?
062             *
063             * @param       data    処?象のLineModel
064             *
065             * @return  演算結果がすべて成立する??true/不??false
066             */
067            public boolean filter( final LineModel data ) {
068                    if( clmNo == null ) {
069                            size  = clms.size();
070                            clmNo = new int[size];
071                            for( int i=0; i<size; i++ ) {
072                                    clmNo[i] = data.getColumnNo( clms.get(i) );
073                            }
074                    }
075    
076                    boolean exist = true;
077                    for( int i=0; i<size; i++ ) {
078                            Object value = data.getValue(clmNo[i]);
079                            if( value == null ) { exist = false; break; }
080    
081                            FilterOperation ope = opes.get(i);
082                            String clmData = String.valueOf( value );
083                            String argment = vals.get(i);
084    
085                            final boolean flag ;
086                            switch( ope ) {
087                                    case PREFIX:    flag = clmData.startsWith( argment );   break;
088                                    case SUFFIX:    flag = clmData.endsWith( argment );             break;
089                                    case INSTR:             flag = clmData.contains( argment );             break;
090                                    case EQUALS:    flag = clmData.equalsIgnoreCase( argment ); break;
091                                    case MATCH:             flag = clmData.matches( argment );              break;
092                                    case UNMATCH:   flag = ! clmData.matches( argment );    break;
093                                    default :               flag = false;                                                   break;
094                            }
095    
096                            if( !flag ) { exist = false; break; }
097                    }
098                    return exist;
099            }
100    
101            /**
102             * こ?オブジェクト????表現を返します?
103             *
104             * オペレーション(カラ?値) の?? です?
105             *
106             * @return ???表現
107             */
108            @Override
109            public String toString() {
110                    int size = opes.size();
111                    StringBuilder rtn = new StringBuilder();
112                    for( int i=0; i<size; i++ ) {
113                            rtn.append( opes.get(i) ).append( '(' );
114                            rtn.append( clms.get(i) ).append( ',' );
115                            rtn.append( vals.get(i) ).append( ") + " );
116                    }
117                    return rtn.toString();
118            }
119    }
120    
121    /**
122     * フィルター条件のオペレーションの列挙型です?
123     * オペレータには、PREFIX, SUFFIX, INSTR, EQUALS, MATCH, UNMATCH ?
124     * 定義して?す?
125     */
126    //enum FilterOperation {
127    //      PREFIX, SUFFIX, INSTR, EQUALS, MATCH, UNMATCH
128    //}