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}