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 */
016package org.opengion.fukurou.util;
017
018/**
019 * DBCell で共通的に使用される フォーマッタークラスです。
020 * フォーマットは、$1,$2,$3,$4・・・$9という文字列を含んだ入力テキストです。
021 * これに、AAA:BBB:CCC:DDD という値(value)を、コロン(:)で分割し、
022 * おのおのの、$1,$2,$3,$4 に割り当てなおして、文字列を合成します。
023 * また、$1 は、本来の値として使用しますので、getValut()メソッドで、
024 * 取り出せるようになっています。
025 * さらに、元の文字列"AAA:BBB:CCC:DDD"は、$0 に割り当てられます。割り当てが
026 * ない変数は、""(ゼロ文字列)として、扱われます。
027 *
028 * @og.rev 3.4.0.2 (2003/09/05) 新規作成
029 * @og.rev 5.2.2.0 (2010/11/01) パッケージ移動(hayabusa.html ⇒ fukurou.util)
030 * @og.group データ表示
031 * @og.group データ編集
032 *
033 * @version  4.0
034 * @author       Kazuhiko Hasegawa
035 * @since    JDK5.0,
036 */
037public class StringFormat {
038        private static final String[] FROM = { "$1","$2","$3","$4","$5","$6","$7","$8","$9" } ;
039        /** 初期セパレータ {@value} */
040        public static final char SEPARATOR = ':' ;
041        private final String inText     ;
042        private final String inValue;
043        private final String inName     ;       // 4.3.4.0 (2008/12/01) $Cの置換え追加
044        private String outText  ;
045        private String outValue ;
046
047        /**
048         * コンストラクター
049         * テキストとコロン(:)で区切られた引数を指定してオブジェクトを構築します。
050         * テキストには、$1,$2,$3,$4・・・$9という文字列を含んだ入力テキストです。
051         * 値は、コロン(:)で区切られて、$1,$2等に順番に割り当てられます。
052         * nameは$Cで置き換える文字列です。
053         *
054         * @og.rev 4.3.4.0 (2008/12/01) $C対応追加
055         * @og.rev 8.5.6.1 (2024/03/29) valueが null の場合は、""(ゼロ文字列)を設定する。
056         *
057         * @param text  $1,$2,$3,$4・・・$9という文字列を含んだ入力テキスト
058         * @param value コロン(:)で区切られた引数(AAA:BBB:CCC:DDD)
059         * @param name  $Cと置き換える文字列
060         */
061        public StringFormat( final String text, final String value, final String name ) {
062                inText  = text;
063//              inValue = value;
064                inValue = value == null ? "" : value;                   // 8.5.6.1 (2024/03/29)
065                inName  = name;
066        }
067
068        /**
069         * フォーマット変換を行い結果を返します。
070         * 変換時に、$1,$2・・・等に割り当てられない変数には、ゼロ文字列("")が割り当てられます。
071         *
072         * @og.rev 3.8.8.2 (2007/01/26) 自分自身を、$0 に割り当てる。
073         * @og.rev 4.3.4.0 (2008/12/01) $Cの置換え追加
074         * @og.rev 6.8.2.4 (2017/11/20) FROM配列($1~$9)の制約で、イベント名が9個しか使えなかったのを修正します。
075         *
076         * @return フォーマット変換結果
077         */
078        public String format() {
079
080                final String[] to;
081//              if( inValue != null && inValue.indexOf( SEPARATOR ) >= 0 ) {
082                if( inValue.indexOf( SEPARATOR ) >= 0 ) {                                       // 8.5.6.1 (2024/03/29) コンストラクタで null が来ない事を保証
083                        to = StringUtil.csv2Array( inValue, SEPARATOR );
084                }
085                else {
086                        to = new String[] { inValue };
087                }
088
089                String newText = inText;
090                final int toLen = Math.min( FROM.length , to.length );          // 6.8.2.4 (2017/11/20) ループを回す際に、少ないほうで回します。
091                // 8.5.4.2 (2024/01/12) PMD 7.0.0 ShortVariable i ⇒ ii に変更
092                int ii = 0;
093                for( ; ii<toLen; ii++ ) {
094                        newText = StringUtil.replace( newText, FROM[ii], to[ii] );
095                }
096                for( ; ii<FROM.length; ii++ ) {
097                        newText = StringUtil.replace( newText, FROM[ii], "" );
098                }
099
100                // 3.8.8.2 (2007/01/26) 自分自身を、$0 に割り当てる。
101                newText = StringUtil.replace( newText, "$0", inValue );
102
103                // 4.3.4.0 (2008/12/01) $Cの置換え
104                newText = StringUtil.replace( newText, "$C", inName );
105
106                outValue = to[0];
107                outText = newText;
108                return outText;
109        }
110
111        /**
112         * 第一引数($1に相当)を返します。
113         * 引数はコロン(:)で区切られて渡されています。内部で使用する本当の引数は
114         * 第一引数です。これは、フォーマット時の$1に割り当てられます。
115         * フォーマット変換前に取得すると、null が返ります。
116         *
117         * @return 第一引数($1に相当)
118         */
119        public String getValue() {
120                return outValue;
121        }
122
123        /**
124         * フォーマット変換結果を返します。
125         * これは、#format() 処理を実行した結果を内部でキャッシュしています。
126         * 何度も結果だけを取得したい場合に使用します。(変換処理は実行しません)
127         * フォーマット変換前に取得すると、null が返ります。
128         *
129         * @return フォーマット変換結果
130         */
131        public String getText() {
132                return outText;
133        }
134
135        /**
136         * 第一引数($1に相当)を返します。
137         * 引数はコロン(:)で区切られて渡されています。内部で使用する本当の引数は
138         * 第一引数です。これは、フォーマット時の$1に割り当てられます。
139         * <del>フォーマット変換前に取得すると、null が返ります。</del>
140         * 引数が null の場合は、""(ゼロ文字列)を返します。
141         *
142         * @og.rev 6.4.5.3 (2016/05/13) 簡易処理用の static メソッド作成
143         * @og.rev 8.5.6.1 (2024/03/29) 引数が null の場合は、""(ゼロ文字列)を返す。
144         *
145         * @param  oldVal 元の値
146         * @return 第一引数($1に相当)
147         */
148        public static String getValue( final String oldVal ) {
149                // 8.5.5.1 (2024/02/29) PMD 7.0.0 OnlyOneReturn メソッドには終了ポイントが 1 つだけ必要
150//              return oldVal == null ? null : oldVal.split(":")[0];    // ":" がなければ自身を、あれば、分割して最初の文字列を返す。
151                // 8.5.6.1 (2024/03/29) 引数が null の場合は、""(ゼロ文字列)を返す。
152                return oldVal == null ? "" : oldVal.split(":")[0];              // ":" がなければ自身を、あれば、分割して最初の文字列を返す。
153
154//              if( oldVal != null ) {
155//                      final int ad = oldVal.indexOf( ':' );
156//                      return ad < 0 ? oldVal : oldVal.substring( 0,ad );
157//              }
158//              return oldVal;
159        }
160}