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.hayabusa.taglib;
017    
018    import org.opengion.hayabusa.common.HybsSystem;
019    import org.opengion.hayabusa.common.HybsSystemException;
020    
021    import org.opengion.fukurou.util.StringUtil ;
022    import static org.opengion.fukurou.util.StringUtil.nval ;
023    
024    import java.util.Locale ;
025    
026    /**
027     * val1 属æ? 㨠val2 属æ?ã®æ–?­—å?表ç¾ã®æ¯”è¼?«ã‚ˆã‚Š BODY を表示/éžè¡¨ç¤ºã‚’å?り替ãˆã‚‹ã‚¿ã‚°ã§ã™ã?
028     *
029     * val1.equals( val2 ) ã?æˆç«‹ã™ã‚Œã??¤ BODY を表示ã—ã¾ã™ã?
030     * val1 ã?null ã®å ´åˆã?ã€ç„¡æ¡ä»¶ã§éžæ?ç«‹ã«ãªã‚Šã¾ã™ã?
031     *  ( val1 == val2 ) ã¯ãƒã‚§ãƒ?‚¯ã—ãªã?¨ã?†ã‚¤ãƒ¡ãƒ¼ã‚¸ã§ã™ã?
032     * val1 ã?null ã‹ã©ã?‹åˆ¤æ–­ã™ã‚‹å ´åˆã?ã€nullCheck="true" を使用ã—ã¦ãã ã•ã„ã€?
033     * ãã?ä»–ã?属æ?ã¯ã€æ¯”è¼?–¹æ³•ã‚’æŒ?®šã—ã¾ã™ã?
034     *
035     * @og.formSample
036     * â—å½¢å¼ï¼?lt;og:equals val1="…" val2="[…]" ?¥?¥?¥ >?¥?¥?¥</og:equals>
037     * â—body?šã‚ã‚?EVAL_BODY_INCLUDE:BODYをインクルードã—ã€{@XXXX} ã¯è§£æžã—ã¾ã›ã‚“)
038     *
039     * â—Tag定義??
040     *   <og:equals
041     *       val1             â—‹ã?TAG】equals ã§æ¯”è¼?™ã‚‹ã¨ãã?ã€ç¬¬?‘引数(左辺)を指定ã—ã¾ã?å¿??)ã€?
042     *       val2               ã€TAG】equals ã§æ¯”è¼?™ã‚‹ã¨ãã?ã€ç¬¬?’引数(å³è¾º)を指定ã—ã¾ã?
043     *       ignoreCase         ã€TAG】大æ–?­?å°æ–‡å­—を区別ã—ãªã?‹ã©ã?‹[true/false]を指定ã—ã¾ã?åˆæœŸå€¤:false(区別ã™ã‚‹))
044     *       startsWith         ã€TAG】ã“ã®æ–?­—å?ãŒã?æŒ?®šã•ã‚ŒãŸæŽ¥é ­è¾žã§å§‹ã¾ã‚‹ã‹ã©ã?‹[true/false]を判定ã—ã¾ã?åˆæœŸå€¤:false)
045     *       nullCheck          ã€TAG】null ãƒã‚§ãƒ?‚¯ã‚’行ã†ã‹ã©ã?‹[true/false]を指定ã—ã¾ã?åˆæœŸå€¤:false)
046     *       notEquals          ã€TAGã€‘åˆ¤å®šçµæžœã‚’å転ã•ã›ã‚‹ã‹ã©ã?‹[true/false]を指定ã—ã¾ã?åˆæœŸå€¤:false)
047     *       contains           ã€TAG】文字å?ãŒå«ã¾ã‚Œã¦ã?‚‹ã‹ã©ã?‹[true/false]ã®åˆ¤å®šã—ã¾ã?åˆæœŸå€¤:false)
048     *       endsWith           ã€TAG】指定ã•ã‚ŒãŸæŽ¥å°¾è¾žã§çµ‚ã‚‹ã‹ã©ã?‹[true/false]を判定ã—ã¾ã?åˆæœŸå€¤:false)
049     *       matches            ã€TAG】指定ã•ã‚ŒãŸæ­£è¦è¡¨ç¾ã¨ä¸??ã™ã‚‹ã‹ã©ã?‹[true/false]を判定ã—ã¾ã?åˆæœŸå€¤:false)
050     *       useStop            ã€TAG】BODYã‚’å?ç?¾Œã«åœæ­¢ã™ã‚‹ã‹ã©ã?‹[true/false]を指定ã—ã¾ã?åˆæœŸå€¤:false)
051     *       operator           ã€TAG】比è¼?™ã‚‹æ“作を EQ,LT,LE,GT,GE ã‹ã‚‰æŒ?®šã—ã¾ã?åˆæœŸå€¤:EQ)
052     *       compareType        ã€TAGã€‘å¤§å°æ¯”è¼?™ã‚‹æ–¹æ³?STRING:剿–¹æ¯”è¼?ã€NUMBER:数値比è¼?を指定ã—ã¾ã?åˆæœŸå€¤:STRING)
053     *       debug              ã€TAG】デãƒãƒƒã‚°æƒ??ã‚’å?力ã™ã‚‹ã‹ã©ã?‹[true/false]を指定ã—ã¾ã?åˆæœŸå€¤:false)
054     *   >   ... Body ...
055     *   </og:equals>
056     *
057     * â—使用ä¾?
058     *      ・<og:equals val1="ABCD" val2="{@value}" >
059     *            val1.equals( val2 ) 時ã«å®Ÿè¡Œã—ãŸã„å†?®¹
060     *        </og:equals>
061     *      ・<og:equals val1="{@value}" nullCheck="true" >
062     *            val1ãŒnullã®æ™‚ã«å®Ÿè¡Œã—ãŸã„å†?®¹
063     *        </og:equals>
064     *
065     *         val1         : equals ã§æ¯”è¼?™ã‚‹ã¨ãã?ã€ç¬¬?‘引数を指定ã—ã¾ã?å¿??)ã€?
066     *         val2         : equals ã§æ¯”è¼?™ã‚‹ã¨ãã?ã€ç¬¬?’引数を指定ã—ã¾ã™ã?
067     *         ignoreCase   : 大æ–?­?å°æ–‡å­—を区別ã—ãªã?‹ã©ã?‹[true/false]を指定ã—ã¾ã?åˆæœŸå€¤:false[区別ã™ã‚‹])ã€?
068     *         startsWith   : ã“ã?æ–?­—å?ãŒã?æŒ?®šã•ã‚ŒãŸæŽ¥é ­è¾žã§å§‹ã¾ã‚‹ã‹ã©ã?‹[true/false]を判定ã—ã¾ã?åˆæœŸå€¤:false)ã€?
069     *         nullCheck    : null ãƒã‚§ãƒ?‚¯ã‚’行ã†ã‹ã©ã?‹[true/false]を指定ã—ã¾ã?åˆæœŸå€¤:false)ã€?
070     *         notEquals    : åˆ¤å®šçµæžœã‚’å転ã•ã›ã‚‹ã‹ã©ã?‹[true/false]æŒ?®šã—ã¾ã?åˆæœŸå€¤:false)ã€?
071     *         contains     : æ–?­—å?ãŒå«ã¾ã‚Œã¦ã?‚‹ã‹ã©ã?‹[true/false]ã®åˆ¤å®šã—ã¾ã?åˆæœŸå€¤:false)ã€?
072     *         endsWith     : æŒ?®šã•ã‚ŒãŸæŽ¥å°¾è¾žã§çµ‚ã‚‹ã‹ã©ã?‹[true/false]を判定ã—ã¾ã?åˆæœŸå€¤:false)ã€?
073     *         matches      : æŒ?®šã•ã‚ŒãŸæ­£è¦è¡¨ç¾ã¨ä¸??ã™ã‚‹ã‹ã©ã?‹[true/false]を判定ã—ã¾ã?åˆæœŸå€¤:false)ã€?
074     *         operator     : LT(<)ã€LE(<=)ã€GT(>)ã€GE(>=)ã€EQ(==)を指定ã—ã¾ã?åˆæœŸå€¤:EQ)
075     *         compareType  : STRING(剿–¹æ¯”è¼? ã?NUMBER(数値比è¼? ã‹ã‚’æŒ?®šã—ã¾ã?åˆæœŸå€¤:STRING)ã€?
076     *         debug        : ãƒ?ƒãƒ?‚°æƒ??ã‚?出力ã™ã‚‹ã‹ã©ã?‹[true/false]を指定ã—ã¾ã?åˆæœŸå€¤:false)ã€?
077     *
078     * @og.group ç”»é¢åˆ¶å¾¡
079     *
080     * @version  4.0
081     * @author   Kazuhiko Hasegawa
082     * @since    JDK5.0,
083     */
084    public class EqualsTag extends CommonTagSupport {
085            //* ã“ã?プログラãƒ??VERSIONæ–?­—å?を設定ã—ã¾ã™ã?       {@value} */
086            private static final String VERSION = "5.1.2.0 (2010/01/01)" ;
087    
088            private static final long serialVersionUID = 512020100101L ;
089    
090            // 3.8.1.3B (2006/01/30) operator ã«æŒ?®šã§ãる定数を定義
091            private static final String[] OPERATOR_LIST = new String[] { "EQ","LT","LE","GT","GE","GE" };
092    
093            // 3.8.1.3B (2006/01/30) compareType ã«æŒ?®šã§ãる定数を定義
094            private static final String[] COMP_TYPE_LIST = new String[] { "STRING","NUMBER" };
095    
096            private String  value1          = null;
097            private String  value2          = null;
098            // 5.1.2.0 (2010/01/01)
099    //      private boolean ignoreCase      = true;         // 大æ–?­?å°æ–‡å­—ã?区別
100            private boolean ignoreCase      = false;                // 大æ–?­?å°æ–‡å­—ã?区別
101            private boolean isStartsWith= false;    // å…ˆé?ã‹ã‚‰å§‹ã¾ã‚‹ã‹ã©ã?‹ã®ãƒã‚§ãƒ?‚¯(startsWith)
102            private boolean nullCheck       = false;        // null ãƒã‚§ãƒ?‚¯ã‚’行ã†å ´åˆã†ã‹ã©ã?‹??
103            private boolean notEquals       = false;        // åˆ¤å®šçµæžœã‚’å転ã•ã›ã¦å‡¦ç?—ã¾ã™ã?
104    
105            // 3.2.0.0 (2003/05/22) 判定方法ã«ä»¥ä¸‹ã??“方法を追åŠ?—ã¾ã™ã?
106            private boolean isContains      = false;        // æ–?­—å?ãŒå«ã¾ã‚Œã¦ã?‚‹ã‹ã©ã?‹ã®åˆ¤å®?
107            private boolean isEndsWith      = false;        // æŒ?®šã•ã‚ŒãŸæŽ¥å°¾è¾žã§çµ‚ã‚‹ã‹ã©ã?‹ã‚’判å®?endsWith)
108            private boolean isMatches       = false;        // æŒ?®šã•ã‚ŒãŸæ­£è¦è¡¨ç¾ã¨ä¸??ã™ã‚‹ã‹ã©ã?‹ã‚’判å®?
109    
110            // 3.8.1.2 (2005/12/19) BODYã‚’å?ç?¾Œã«åœæ­¢ã™ã‚‹ã‹ã©ã?‹ã‚’指定ã—ã¾ã™ã?
111            private boolean useStop         = false;        // BODYã‚’å?ç?¾Œã«åœæ­¢(true)ã™ã‚‹ã‹ã©ã?‹
112    
113            // 3.8.1.3B (2006/01/30) operatorã€compareType 属æ?を追åŠ?—ã¾ã™ã?
114            private String  operator        = "EQ";
115            private String  compareType     = "STRING";
116    
117            /**
118             * Taglibã®é–‹å§‹ã‚¿ã‚°ãŒè¦‹ã¤ã‹ã£ãŸã¨ãã«å‡¦ç?™ã‚?doStartTag() ã‚?オーãƒã?ライドã—ã¾ã™ã?
119             *
120             * @og.rev 3.2.0.0 (2003/05/22) 判定方法ã«,contains,endsWith,matches ã®æ–¹æ³•を追åŠ?
121             * @og.rev 3.8.1.3B (2006/01/30) operatorã€compareType 属æ?を追åŠ?—ã¾ã™ã?
122             * @og.rev 3.8.5.1 (2006/04/28) equals ã®çµæžœã?true 時ã?ã¿ã€useStop="true" を有効ã«ã™ã‚‹ã€?
123             *
124             * @return      後続å?ç??æŒ?¤º
125             */
126            @Override
127            public int doStartTag() {
128                    boolean rtn = notEquals;
129                    if( ( isStartsWith      && startsWith(  value1,value2 ) )       ||      // 先㫠isStartsWith ã‚’ãƒã‚§ãƒ?‚¯
130                            ( isContains    && contains(    value1,value2 ) )       ||
131                            ( isEndsWith    && endsWith(    value1,value2 ) )       ||
132                            ( isMatches             && matches(             value1,value2 ) )       ||
133                            ( nullCheck             && isNullCheck( value1 )  )                     ||
134                            ( operation( value1,value2,operator,compareType,ignoreCase ) ) ) {
135                                    rtn = ! notEquals;
136                    }
137    
138                    // 3.8.5.1 (2006/04/28) equals ã®çµæžœã?true 時ã?ã¿ã€useStop="true" を有効ã«ã™ã‚‹ã€?
139                    useStop = useStop && rtn ;              // å°‘ã—回りãã©ã?Œåˆ¤ã‚Šã‚„ã™ã„ã§ã—ょã€?
140    
141                    if( rtn ) { return( EVAL_BODY_INCLUDE ); }
142                    else      { return( SKIP_BODY );         }
143            }
144    
145            /**
146             * Taglibã®çµ‚äº?‚¿ã‚°ãŒè¦‹ã¤ã‹ã£ãŸã¨ãã«å‡¦ç?™ã‚?doEndTag() ã‚?オーãƒã?ライドã—ã¾ã™ã?
147             *
148             * @og.rev 3.8.1.2 (2005/12/19) useStop 属æ?ã‚’å?ç?—ã¾ã™ã?
149             *
150             * @return      後続å?ç??æŒ?¤º
151             */
152            @Override
153            public int doEndTag() {
154                    if( useStop ) {
155                            return(SKIP_PAGE);              // ペã?ã‚¸ã®æ®‹ã‚Šã®å‡¦ç?‚’行ã‚ãªã??
156                    }
157                    else {
158                            return(EVAL_PAGE);              // ペã?ã‚¸ã®æ®‹ã‚Šã‚’評価ã™ã‚‹ã€?
159                    }
160            }
161    
162            /**
163             * タグリブオブジェクトをリリースã—ã¾ã™ã?
164             * キャãƒ?‚·ãƒ¥ã•れã¦å†åˆ©ç”¨ã•れるã?ã§ã€ãƒ•ィールドã?åˆæœŸè¨­å®šã‚’行ã„ã¾ã™ã?
165             *
166             * @og.rev 2.0.0.4 (2002/09/27) カスタãƒ?‚¿ã‚°ã® release() メソãƒ?ƒ‰ã‚’ã?追åŠ?
167             * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応ã?release2() ã‚?doEndTag()ã§å‘¼ã¶ã€?
168             * @og.rev 3.2.0.0 (2003/05/22) 判定方法ã«,contains,endsWith,matches ã®æ–¹æ³•を追åŠ?
169             * @og.rev 3.8.1.2 (2005/12/19) useStop 属æ?ã®è¿½åŠ?
170             * @og.rev 3.8.1.3 (2006/01/30) operatorã€compareType 属æ?を追åŠ?—ã¾ã™ã?
171             * @og.rev 5.1.2.0 (2010/01/01) ignoreCase属æ?ã®åˆæœŸå€¤ã‚’false(大æ–?­—ã?å°æ–‡å­—を区別ã™ã‚‹)
172             *
173             */
174            @Override
175            protected void release2() {
176                    super.release2();
177                    value1          = null;
178                    value2          = null;
179                    // 5.1.2.0 (2010/01/01)
180    //              ignoreCase      = true;         // 大æ–?­?å°æ–‡å­—ã?区別
181                    ignoreCase      = false;                // 大æ–?­?å°æ–‡å­—ã?区別
182                    isStartsWith    = false;        // å…ˆé?ã‹ã‚‰å§‹ã¾ã‚‹ã‹ã©ã?‹ã®ãƒã‚§ãƒ?‚¯
183                    nullCheck       = false;        // null ãƒã‚§ãƒ?‚¯ã‚’行ã†å ´åˆã†ã‹ã©ã?‹??
184                    notEquals       = false;        // åˆ¤å®šçµæžœã‚’å転ã•ã›ã¦å‡¦ç?—ã¾ã™ã?
185                    isContains      = false;        // æ–?­—å?ãŒå«ã¾ã‚Œã¦ã?‚‹ã‹ã©ã?‹ã®åˆ¤å®?
186                    isEndsWith              = false;        // æŒ?®šã•ã‚ŒãŸæŽ¥å°¾è¾žã§çµ‚ã‚‹ã‹ã©ã?‹ã‚’判å®?
187                    isMatches               = false;        // æŒ?®šã•ã‚ŒãŸæ­£è¦è¡¨ç¾ã¨ä¸??ã™ã‚‹ã‹ã©ã?‹ã‚’判å®?
188                    useStop         = false;        // 3.8.1.2 (2005/12/19)
189                    operator        = "EQ";         // 3.8.1.3B (2006/01/30)
190                    compareType     = "STRING";     // 3.8.1.3B (2006/01/30)
191            }
192    
193            /**
194             * operator ã«å¯¾å¿œã—ãŸæ¯”è¼??ç?‚’行ã„ã¾ã™ã?
195             * val1 ã¾ãŸã?ã€val2 ã?null ã®å ´åˆã?ã€ç„¡æ¡ä»¶ã§ false ã‚’è¿”ã—ã¾ã™ã?
196             *
197             * @og.rev 3.8.1.3 (2006/02/06) 判定方法ã«, LT, GT, LE, GE, EQ追åŠ?
198             *
199             * @param   val1 第?‘引数
200             * @param   val2 第?’引数
201             * @param   op 比è¼?–¹æ³?
202             * @param   ty 比è¼?¨®é¡?
203             * @param   ig 大尿–‡å­—ã?区別
204             *
205             * @return  第ä¸?¼•æ•°ã?null ã§ãªãã?且㤠opeã«å¯¾å¿œã—ãŸæ¯”è¼?µæžœã‚’è¿”ã—ã¾ã™ã?
206             */
207            private boolean operation( final String val1,final String val2,final String op,final String ty,final boolean ig ) {
208                    if( isNullCheck( val1 ) || isNullCheck( val2 )) { return false; }
209                    // æ–?­—å?比è¼?
210                    final boolean rtn;
211                    if( "STRING".equals( ty ) ) {
212                            String va1    = val1;
213                            String va2    = val2;
214                            // 大æ–?­—å°æ–‡å­—を区別ã—ãªã?
215                            if( ig ) {
216                                    va1 = val1.toUpperCase(Locale.JAPAN);
217                                    va2 = val2.toUpperCase(Locale.JAPAN);
218                            }
219                            if( "LT".equals( op ) ) {
220                                    rtn = va1.compareTo( va2 ) < 0;
221                            } else if( "GT".equals( op ) ) {
222                                    rtn = va1.compareTo( va2 ) > 0;
223                            } else if( "LE".equals( op ) ) {
224                                    rtn = va1.compareTo( va2 ) <= 0;
225                            } else if( "GE".equals( op ) ) {
226                                    rtn = va1.compareTo( va2 ) >= 0;
227                            } else {
228                                    rtn = va1.equals( va2 );
229                            }
230                    // 数字比�
231                    } else {
232                            // 厳å¯?«å‡¦ç?—ãªãã¦è‰¯ã?¨æ€ã†ã®ã§BigDecimalã¯ä½¿ã‚ãªã?
233                            double d1  = StringUtil.parseDouble( val1 );
234                            double d2  = StringUtil.parseDouble( val2 );
235                            if( "LT".equals( op ) ) {
236                                    rtn = d1 < d2;
237                            } else if( "GT".equals( op ) ) {
238                                    rtn = d1 > d2;
239                            } else if( "LE".equals( op ) ) {
240                                    rtn = d1 <= d2;
241                            } else if( "GE".equals( op ) ) {
242                                    rtn = d1 >= d2;
243                            } else {
244            //                      rtn = d1 == d2;
245                                    rtn = Math.abs(d1 - d2) < 0.0000001 ;
246                            }
247                    }
248                    return rtn ;
249            }
250    
251            /**
252             * startsWith ã§æ¯”è¼?™ã‚‹ã¨ãã?ã€æ¯”è¼?ƒ¡ã‚½ãƒ?ƒ‰ã€?
253             *
254             * val1 ãŒã?比è¼??ã®æ–?­—å?ã§ã€val2 ãŒéƒ¨åˆ?–‡å­—å?ã«ãªã‚Šã¾ã™ã?
255             *
256             * @param   val1 第?‘引数
257             * @param   val2 第?’引数
258             *
259             * @return  第ä¸?¼•æ•°ã?null ã§ãªãã?且㤠val1.startsWith( val2 ) ã®å ´å?true
260             */
261            private boolean startsWith( final String val1,final String val2 ) {
262                    boolean rtn = false;
263                    if( ! isNullCheck( val1 ) && ! isNullCheck( val2 ) ) {
264                            if( ignoreCase ) { rtn = (val1.toUpperCase(Locale.JAPAN)).startsWith( val2.toUpperCase(Locale.JAPAN) ) ; }
265                            else             { rtn =  val1.startsWith( val2 ) ;                              }
266                    }
267                    return rtn ;
268            }
269    
270            /**
271             * nullCheck ã§åˆ¤å®šã™ã‚‹ã¨ãã?ã€åˆ¤å®šãƒ¡ã‚½ãƒ?ƒ‰ã€?
272             *
273             * @param   val1 第?‘引数
274             *
275             * @return  第ä¸?¼•æ•°ã?null/ゼロストリング ã®å ´å?true
276             */
277            private boolean isNullCheck( final String val1 ) {
278                    boolean rtn = true;
279                    if( val1 != null && val1.length() > 0 ) {
280                            rtn = false;
281                    }
282                    return rtn ;
283            }
284    
285            /**
286             * contains ã§æ¯”è¼?™ã‚‹ã¨ãã?ã€æ¯”è¼?ƒ¡ã‚½ãƒ?ƒ‰ã€?
287             *
288             * val1 ãŒã?比è¼??ã®æ–?­—å?ã§ã€val2 ãŒéƒ¨åˆ?–‡å­—å?ã«ãªã‚Šã¾ã™ã?
289             *
290             * @og.rev 3.2.0.0 (2003/05/22) 判定方法ã«,contains,endsWith,matches ã®æ–¹æ³•を追åŠ?
291             *
292             * @param   val1 第?‘引数
293             * @param   val2 第?’引数
294             *
295             * @return  第ä¸?¼•æ•°ã?null ã§ãªãã?且㤠val1.indexOf( val2 ) &gt;= 0 ã®å ´å?true
296             */
297            private boolean contains( final String val1,final String val2 ) {
298                    int rtn = -1;
299                    if( ! isNullCheck( val1 ) && ! isNullCheck( val2 ) ) {
300                            if( ignoreCase ) { rtn = (val1.toUpperCase(Locale.JAPAN)).indexOf( val2.toUpperCase(Locale.JAPAN) ) ; }
301                            else             { rtn =  val1.indexOf( val2 ) ;                              }
302                    }
303                    return ( rtn >= 0 ) ;
304            }
305    
306            /**
307             * endsWith ã§æ¯”è¼?™ã‚‹ã¨ãã?ã€æ¯”è¼?ƒ¡ã‚½ãƒ?ƒ‰ã€?
308             *
309             * val1 ãŒã?比è¼??ã®æ–?­—å?ã§ã€val2 ãŒéƒ¨åˆ?–‡å­—å?ã«ãªã‚Šã¾ã™ã?
310             *
311             * @og.rev 3.2.0.0 (2003/05/22) 判定方法ã«,contains,endsWith,matches ã®æ–¹æ³•を追åŠ?
312             *
313             * @param   val1 第?‘引数
314             * @param   val2 第?’引数
315             *
316             * @return  第ä¸?¼•æ•°ã?null ã§ãªãã?且㤠val1.endsWith( val2 ) ã®å ´å?true
317             */
318            private boolean endsWith( final String val1,final String val2 ) {
319                    boolean rtn = false;
320                    if( ! isNullCheck( val1 ) && ! isNullCheck( val2 ) ) {
321                            if( ignoreCase ) { rtn = (val1.toUpperCase(Locale.JAPAN)).endsWith( val2.toUpperCase(Locale.JAPAN) ) ; }
322                            else             { rtn =  val1.endsWith( val2 ) ;                              }
323                    }
324                    return rtn ;
325            }
326    
327            /**
328             * matches ã§æ¯”è¼?™ã‚‹ã¨ãã?ã€æ¯”è¼?ƒ¡ã‚½ãƒ?ƒ‰ã€?
329             *
330             * val1 ãŒã?比è¼??ã®æ–?­—å?ã§ã€val2 ãŒæ­£è¦è¡¨ç¾ã®æ–?­—å?ã«ãªã‚Šã¾ã™ã?
331             *
332             * @og.rev 3.2.0.0 (2003/05/22) 判定方法ã«,contains,endsWith,matches ã®æ–¹æ³•を追åŠ?
333             *
334             * @param   val1 第?‘引数
335             * @param   val2 第?’引数
336             *
337             * @return  第ä¸?¼•æ•°ã?null ã§ãªãã?且㤠val1.matches( val2 ) ã®å ´å?true
338             */
339            private boolean matches( final String val1,final String val2 ) {
340                    boolean rtn = false;
341                    if( ! isNullCheck( val1 ) && ! isNullCheck( val2 ) ) {
342                            rtn = val1.matches( val2 );
343                    }
344                    return rtn ;
345            }
346    
347            /**
348             * ã€TAG】equals ã§æ¯”è¼?™ã‚‹ã¨ãã?ã€ç¬¬?‘引数(左辺)を指定ã—ã¾ã™ã?
349             *
350             * @og.tag equals ã§æ¯”è¼?™ã‚‹ã¨ãã?ã€ç¬¬?‘引数を指定ã—ã¾ã™ã?
351             * val1 ã?null ã®å ´åˆã?ã€ç„¡æ¡ä»¶ã§éžæ?ç«‹ã«ãªã‚Šã¾ã™ã?
352             *  ( val1 == val2 ) ã¯ãƒã‚§ãƒ?‚¯ã—ãªã?¨ã?†ã‚¤ãƒ¡ãƒ¼ã‚¸ã§ã™ã?
353             * val1 ã?null ã‹ã©ã?‹åˆ¤æ–­ã™ã‚‹å ´åˆã?ã€nullCheck="true" を使用ã—ã¦ãã ã•ã„ã€?
354             *
355             * @param   val 第?‘引数
356             */
357            public void setVal1( final String val ) {
358                    this.value1 = getRequestParameter( val );
359            }
360    
361            /**
362             * ã€TAG】equals ã§æ¯”è¼?™ã‚‹ã¨ãã?ã€ç¬¬?’引数(å³è¾º)を指定ã—ã¾ã™ã?
363             *
364             * @og.tag equals ã§æ¯”è¼?™ã‚‹ã¨ãã?ã€ç¬¬?’引数を指定ã—ã¾ã™ã?
365             *
366             * @param   val 第?’引数
367             */
368            public void setVal2( final String val ) {
369                    this.value2 = getRequestParameter( val );
370            }
371    
372            /**
373             * ã€TAG】大æ–?­?å°æ–‡å­—を区別ã—ãªã?‹ã©ã?‹[true/false]を指定ã—ã¾ã?åˆæœŸå€¤:false(区別ã™ã‚‹))ã€?
374             *
375             * @og.tag
376             * startsWith , contains , endsWith , equalsIgnoreCase ã§ã®æ¯”è¼?™‚ã«ã€æ¯”è¼?¯¾è±¡ã®
377             * 大æ–?­?å°æ–‡å­—を区別ã—ãªã?‹ã©ã?‹ã‚’指定ã—ã¾ã™ã?
378             * 区別ã—ãªã?("true") å ´åˆã?aaa 㨠AAA ã¯ã€ä¸??ã—ãŸã¨ã¿ãªã•れã¾ã™ã?
379             * åˆæœŸå€¤ã¯ã€åŒºåˆ¥ã™ã‚‹ ("false") ã§ã™ã?
380             *
381             * @param   flag 大æ–?­?å°æ–‡å­—を区別ã—ãªã?‹ã©ã?‹ [true:ã—ãªã?ãれ以å¤?ã™ã‚‹]
382             */
383            public void setIgnoreCase( final String flag ) {
384                    ignoreCase = nval( getRequestParameter( flag ),ignoreCase );
385            }
386    
387            /**
388             * ã€TAG】ã“ã®æ–?­—å?ãŒã?æŒ?®šã•ã‚ŒãŸæŽ¥é ­è¾žã§å§‹ã¾ã‚‹ã‹ã©ã?‹[true/false]を判定ã—ã¾ã?åˆæœŸå€¤:false)ã€?
389             *
390             * @og.tag
391             * val1.startsWith( val2 ) ã®æ›¸å¼ã§åˆ¤å®šã•れã¾ã™ã?ã“ã?å ´åˆã?"ABCDEFG".startsWith( "ABC" )
392             * ã®å ´åˆã«ã€æ¡ä»¶æˆç«‹ã—ã¾ã™ã?(ã¤ã¾ã‚Šã?val1 ã«å¯¾ã—ã¦ã€val2 ã§å§‹ã¾ã£ã¦ã?‚‹ã‹ã©ã?‹å•åˆã›ã‚‹)
393             * åˆæœŸå€¤ã¯ã€åˆ¤å®šã—ãªã?("false")
394             *
395             * @param   flag 接頭辞ã§å§‹ã¾ã‚‹ã‹ã©ã?‹ [true:判定ã™ã‚?ãれ以å¤?ã—ãªã„]
396             */
397            public void setStartsWith( final String flag ) {
398                    isStartsWith = nval( getRequestParameter( flag ),isStartsWith );
399            }
400    
401            /**
402             * ã€TAG】null ãƒã‚§ãƒ?‚¯ã‚’行ã†ã‹ã©ã?‹[true/false]を指定ã—ã¾ã?åˆæœŸå€¤:false)ã€?
403             *
404             * @og.tag
405             * ãƒã‚§ãƒ?‚¯ã‚’行ã†ã‚ˆã†ã«æŒ?®?"true")ã—ãŸå ´åˆã«ã€ç¬¬ä¸?¼•æ•°ã?null ã®å ´åˆã?,
406             * æ¡ä»¶æˆç«‹ã—ã¦ã€ã‚¿ã‚°ã®Body ã¯å®Ÿè¡Œã•れã¾ã™ã?
407             * åˆæœŸå€¤ã¯ã€è¡Œã‚ãªã?(true 以å¤?ã§ã™ã?
408             *
409             * @param   flag null ãƒã‚§ãƒ?‚¯ã‚’行ã†ã‹ã©ã?‹ [true:行ã†/ãれ以å¤?行ã‚ãªã„]
410             */
411            public void setNullCheck( final String flag ) {
412                    nullCheck = nval( getRequestParameter( flag ),nullCheck );
413            }
414    
415            /**
416             * ã€TAGã€‘åˆ¤å®šçµæžœã‚’å転ã•ã›ã‚‹ã‹ã©ã?‹[true/false]を指定ã—ã¾ã?åˆæœŸå€¤:false)ã€?
417             *
418             * @og.tag
419             * é€šå¸¸ã®æˆç«‹æ¡ä»¶ã«ãŠã„ã¦ã€ä¸æ?ç«‹ã?å ´åˆã«ã€BODY を実行ã—ã¾ã™ã?
420             * 通常ã®å‡¦ç?µæžœã‚’求ã‚ã¦ã€æœ€å¾Œã«ã€å転処ç?‚’行ã„ã¾ã™ã?
421             * åˆæœŸå€¤ã¯ã€??常 (true 以å¤?ã§ã™ã?
422             *
423             * @param   flag  [true:å転ã™ã‚‹/ãれ以å¤?通常]
424             */
425            public void setNotEquals( final String flag ) {
426                    notEquals = nval( getRequestParameter( flag ),notEquals );
427            }
428    
429            /**
430             * ã€TAG】文字å?ãŒå«ã¾ã‚Œã¦ã?‚‹ã‹ã©ã?‹[true/false]ã®åˆ¤å®šã—ã¾ã?åˆæœŸå€¤:false)ã€?
431             *
432             * @og.tag
433             * val1.indexOf( val2 ) &gt;= 0 ã®æ›¸å¼ã§åˆ¤å®šã•れã¾ã™ã?ã“ã?å ´åˆã?"ABCDEFG".indexOf( "CDE" )
434             * ã®å ´åˆã«ã€æ¡ä»¶æˆç«‹ã—ã¾ã™ã?(ã¤ã¾ã‚Šã?val1 ã«å¯¾ã—ã¦ã€val2 ãŒå«ã¾ã‚Œã¦ã?‚‹ã‹ã©ã?‹å•åˆã›ã‚‹)
435             * åˆæœŸå€¤ã¯ã€åˆ¤å®šã—ãªã?("false")
436             *
437             * @og.rev 3.2.0.0 (2003/05/22) 判定方法ã«,contains,endsWith,matches ã®æ–¹æ³•を追åŠ?
438             *
439             * @param   flag  [true:判定ã™ã‚?ãれ以å¤?ã—ãªã„]
440             */
441            public void setContains( final String flag ) {
442                    isContains = nval( getRequestParameter( flag ),isContains );
443            }
444    
445            /**
446             * ã€TAG】指定ã•ã‚ŒãŸæŽ¥å°¾è¾žã§çµ‚ã‚‹ã‹ã©ã?‹[true/false]を判定ã—ã¾ã?åˆæœŸå€¤:false)ã€?
447             *
448             * @og.tag
449             * val1.endsWith( val2 ) ã®æ›¸å¼ã§åˆ¤å®šã•れã¾ã™ã?ã“ã?å ´åˆã?"ABCDEFG".endsWith( "EFG" )
450             * ã®å ´åˆã«ã€æ¡ä»¶æˆç«‹ã—ã¾ã™ã?(ã¤ã¾ã‚Šã?val1 ã«å¯¾ã—ã¦ã€val2 ã§çµ‚ã‚ã£ã¦ã?‚‹ã‹ã©ã?‹å•åˆã›ã‚‹)
451             * åˆæœŸå€¤ã¯ã€åˆ¤å®šã—ãªã?("false")
452             *
453             * @og.rev 3.2.0.0 (2003/05/22) 判定方法ã«,contains,endsWith,matches ã®æ–¹æ³•を追åŠ?
454             *
455             * @param   flag [true:判定ã™ã‚?ãれ以å¤?ã—ãªã„]
456             */
457            public void setEndsWith( final String flag ) {
458                    isEndsWith = nval( getRequestParameter( flag ),isEndsWith );
459            }
460    
461            /**
462             * ã€TAG】指定ã•ã‚ŒãŸæ­£è¦è¡¨ç¾ã¨ä¸??ã™ã‚‹ã‹ã©ã?‹[true/false]を判定ã—ã¾ã?åˆæœŸå€¤:false)ã€?
463             *
464             * @og.tag
465             * val1.matches( val2 ) ã®æ›¸å¼ã§åˆ¤å®šã•れã¾ã™ã?val2 ã«æŒ?®šã•ã‚ŒãŸæ­£è¦è¡¨ç¾ã§ã€?
466             * ä¸??ã™ã‚‹ã‹ã©ã?‹ã‚’判定ã—ã¾ã™ã?ã“ã“ã§ã®æ­£è¦è¡¨ç¾ã¨ã¯ã€?
467             * java.util.regex.Pattern.matches(val1, val2) ã§ã®åˆ¤å®šçµæžœã¨åŒã˜ã§ã™ã?
468             * åˆæœŸå€¤ã¯ã€åˆ¤å®šã—ãªã?("false")
469             *
470             * @og.rev 3.2.0.0 (2003/05/22) 判定方法ã«,contains,endsWith,matches ã®æ–¹æ³•を追åŠ?
471             *
472             * @param   flag [true:判定ã™ã‚?ãれ以å¤?ã—ãªã„]
473             */
474            public void setMatches( final String flag ) {
475                    isMatches = nval( getRequestParameter( flag ),isMatches );
476            }
477    
478            /**
479             * ã€TAG】BODYã‚’å?ç?¾Œã«åœæ­¢ã™ã‚‹ã‹ã©ã?‹[true/false]を指定ã—ã¾ã?åˆæœŸå€¤:false)ã€?
480             *
481             * @og.tag
482             * 処ç?µæžœãªã©ã«å¿œã˜ã¦ã€ä»¥ä¸‹ã?処ç?‚’åœæ­¢ã—ãŸã??åˆã«ã€ä½¿ç”¨ã—ã¾ã™ã?
483             * ã“ã“ã§ã¯ã€æ¡ä»¶ã‚’判定後ã?true ã®å ´åˆã«ã€BODY部をå?åŠ?処ç?ã—ãŸå¾Œã«ã€?
484             * ã“ã“ã«ã‚»ãƒ?ƒˆã•れãŸå?ã«å¿œã˜ã¦ã€ä»¥ä¸‹ã?ペã?ジ処ç?‚’行ã†ã‹ã©ã?‹ã‚’指定ã—ã¾ã™ã?
485             * true を指定ã™ã‚‹ã¨ã€ä»¥ä¸‹ã?処ç??ã€è¡Œã‚れã¾ã›ã‚“ã€?
486             * åˆæœŸå€¤ã¯ã€åœæ­¢ã—ãªã?("false")
487             *
488             * @og.rev 3.8.1.2 (2005/12/19) æ–°è¦è¿½åŠ?
489             *
490             * @param   flag [true:判定ã™ã‚?ãれ以å¤?ã—ãªã„]
491             */
492            public void setUseStop( final String flag ) {
493                    useStop = nval( getRequestParameter( flag ),useStop );
494            }
495    
496            /**
497             * ã€TAG】比è¼?™ã‚‹æ“作を EQ,LT,LE,GT,GE ã‹ã‚‰æŒ?®šã—ã¾ã?åˆæœŸå€¤:EQ)ã€?
498             *
499             * @og.tag
500             * 比è¼?–¹æ³•ã¨ã—ã¦ã€EQ(==)ã€LT(&lt;)ã€LE(&lt;=)ã€GT(&gt;)ã€GE(&gt;=) ãŒã‚りã¾ã™ã?
501             * åˆæœŸå€¤ã¯ã€EQ(åŒã˜ã‹ã©ã?‹)ã§ã™ã?
502             * 比è¼??ã€val1 ã«å¯¾ã—ã¦è¡Œã‚れã¾ã™ã?val1 ã¾ãŸã? val2 ã?null ã®å ´åˆã?ã€å¸¸ã«falseã?
503             * è¿”ã•れã¾ã™ã?通常㮠A &lt; B ãªã‚‰ã?ã€not( B &gt;= A ) ã®é–¢ä¿‚ã?æˆç«‹ã—ã¾ã›ã‚“ã€?
504             * val1 ã?null ã§ãªã??åˆã?ã€val1(5) LT vla2(8) ã¯ã€true ã‚’è¿”ã—ã¾ã™ã?
505             * ignoreCase属æ?(大æ–?­?å°æ–‡å­—ã?区別)を指定ã™ã‚‹ã“ã¨ã§ã€æ¯”è¼?™ã‚‹æ–‡å­—å?ã®
506             * 大æ–?­—å°æ–‡å­—ã‚’çµ±ä¸?•ã›ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã?
507             * ãªãŠã?比è¼?™‚ã«ã¯ã€compareType 属æ?ã«ã‚‚ã”æ³¨æ„ãã?•ã??ã“れã¯ã€æ–‡å­—å?比è¼?‹
508             * 数字比è¼?‚’æŒ?®šã—ã¾ã™ã?
509             *
510             * @og.rev 3.8.1.3B (2006/01/30) æ–°è¦è¿½åŠ?
511             *
512             * @param       ope     EQ,LT,LE,GT,GE を指�
513             * @see     #setIgnoreCase( String )
514             * @see     #setCompareType( String )
515             */
516            public void setOperator( final String ope ) {
517                    operator = nval( getRequestParameter( ope ),operator );
518    
519                    if( !check( operator, OPERATOR_LIST ) ) {
520                            String errMsg = "æŒ?®šã?オペレーションã¯ã‚µãƒã?トã•れã¦ã?¾ã›ã‚“。オペレーションエラー"
521                                                            + HybsSystem.CR
522                                                            + "operator=[" + ope + "] "
523                                                            + HybsSystem.CR
524                                                            + StringUtil.array2csv( OPERATOR_LIST ) ;
525                            throw new HybsSystemException( errMsg );
526                    }
527            }
528    
529            /**
530             * ã€TAGã€‘å¤§å°æ¯”è¼?™ã‚‹æ–¹æ³?STRING:剿–¹æ¯”è¼?ã€NUMBER:数値比è¼?を指定ã—ã¾ã?åˆæœŸå€¤:STRING)ã€?
531             *
532             * @og.tag
533             * operator 属æ?ã§å¤§å°ã‚’比è¼?™ã‚‹å?åˆã?比è¼?–¹æ³•ã¨ã—ã¦ã€å‰æ–¹æ¯”è¼?¨æ•°å€¤æ¯”è¼?‚’æŒ?®šã§ãã¾ã™ã?
534             * STRING(剿–¹æ¯”è¼?ã¨ã¯ã€ãŠäº’ã„ã®æ–?­—å?ã‚’å‰æ–¹ã‹ã‚‰é ?«æ¯”è¼?—ã¦ã?ã¾ã™ã?例ãˆã°ã€?
535             * ABC 㨠AABBCC ã‚??123 㨠112233 ã§ã¯ã€AABBCC ã‚?112233 ãŒå°ã•ã?¨åˆ¤æ–­ã•れã¾ã™ã?
536             * NUMBER(数値比è¼?ã§ã¯ã€?23 㨠112233 ã§ã¯ã€?23 ãŒå°ã•ã?¨åˆ¤æ–­ã•れã¾ã™ã?
537             * NUMBER ã¯ã€æ•°å­—ã«å¤‰æ›ã§ãる価ã§ã‚ã‚‹å¿?¦ãŒã‚りã¾ã™ã?
538             * STRING ã¯ã€ignoreCase属æ?(大æ–?­?å°æ–‡å­—ã?区別)を指定ã™ã‚‹ã“ã¨ã§ã€æ¯”è¼?™ã‚‹æ–‡å­—å?ã®
539             * 大æ–?­—å°æ–‡å­—ã‚’çµ±ä¸?•ã›ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã?
540             * åˆæœŸå€¤ã¯ã€STRING(剿–¹æ¯”è¼?ã§ã™ã?
541             *
542             * @og.rev 3.8.1.3B (2006/01/30) æ–°è¦è¿½åŠ?
543             *
544             * @param   type STRING(剿–¹æ¯”è¼? ã?NUMBER(数値比è¼?を指å®?
545             * @see     #setIgnoreCase( String )
546             * @see     #setOperator( String )
547             */
548            public void setCompareType( final String type ) {
549                    compareType = nval( getRequestParameter( type ),compareType );
550    
551                    if( !check( compareType, COMP_TYPE_LIST ) ) {
552                            String errMsg = "æŒ?®šã?compareTypeã¯ã‚µãƒã?トã•れã¦ã?¾ã›ã‚“。compareTypeエラー"
553                                                            + HybsSystem.CR
554                                                            + "compareType=[" + type + "] "
555                                                            + HybsSystem.CR
556                                                            + StringUtil.array2csv( COMP_TYPE_LIST ) ;
557                            throw new HybsSystemException( errMsg );
558                    }
559            }
560    
561            /**
562             * ã“ã?オブジェクトã?æ–?­—å?表ç¾ã‚’è¿”ã—ã¾ã™ã?
563             * 基本çš?«ãƒ?ƒãƒ?‚°ç›®çš?«ä½¿ç”¨ã—ã¾ã™ã?
564             *
565             * @og.rev 3.2.0.0 (2003/05/22) 判定方法ã«,contains,endsWith,matches ã®æ–¹æ³•を追åŠ?
566             *
567             * @return ã“ã?ã‚¯ãƒ©ã‚¹ã®æ–?­—å?表ç¾
568             */
569            @Override
570            public String toString() {
571                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
572                                    .println( "VERSION"             ,VERSION        )
573                                    .println( "value1"              ,value1         )
574                                    .println( "value2"              ,value2         )
575                                    .println( "ignoreCase"  ,ignoreCase     )
576                                    .println( "startsWith"  ,isStartsWith   )
577                                    .println( "nullCheck"   ,nullCheck      )
578                                    .println( "notEquals"   ,notEquals      )
579                                    .println( "contains"    ,isContains     )
580                                    .println( "endsWith"    ,isEndsWith     )
581                                    .println( "matches"             ,isMatches      )
582                                    .println( "useStop"             ,useStop        )
583                                    .println( "Other..."    ,getAttributes().getAttribute() )
584                                    .fixForm().toString() ;
585            }
586    }