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.hayabusa.db; 017 018import java.util.HashMap; 019import java.util.HashSet; 020import java.util.Map; 021import java.util.Set; 022 023import org.opengion.fukurou.util.StringUtil; 024 025/** 026 * エディット設定情報を管理するためのデータ管理クラスです。 027 * ここで管理される各パラメーターの意味は以下の通りです。 028 * (各インデックス番号は、内部的に管理されているインデックス番号を意味します) 029 * 030 * ・0:エディット名 031 * このエディット設定オブジェクトの名称です。 032 * ・1:表示カラム 033 * 表示対象となるカラム一覧です。カンマ区切りで指定します。 034 * この一覧には、非表示のカラムも合わせて管理され、非表示カラムについては、 035 * カラム名の先頭に"!"をつけます。 036 * 例) AAA,!BBB,CCC ⇒ AAA,CCCの順に表示(BBBは非表示) 037 * ・2:集計カラム 038 * 各値をSUMする対象となるカラムです。(カンマ区切りで複数指定が可能) 039 * ここで指定されたカラムは数値型である必要があります。 040 * SQL構文における、SUM関数の引数として指定するカラムに相当します。 041 * ・3:グループカラム 042 * 集計カラムの各値をグルーピングするためのカラムです。(カンマ区切りで複数指定が可能) 043 * SQL構文における、GROUP BYに指定するカラムに相当します。 044 * ・4:小計カラム 045 * 集計カラムの各値に対し、小計行を付加するためのブレイクキーを指定します。(カンマ区切りで複数指定が可能) 046 * ・5:合計カラム 047 * 集計カラムの各値に対し、合計行を付加するためのブレイクキーを指定します。(カンマ区切りで複数指定が可能) 048 * ・6:総合計フラグ 049 * 集計カラムの各値に対し、総合計行を付加するかどうかを指定します。(0以外:追加する 0:追加しない) 050 * ・7:表示順カラム 051 * データの表示順をその順番にカンマ区切りで指定します。 052 * カラム名の先頭に"!"をつけた場合は、そのカラムは降順で表示されます。 053 * SQL構文における、orderby句に相当します。 054 * ・8:共通フラグ 055 * このエディット設定オブジェクトが、共通(全ユーザー公開)エディットかどうかを 056 * 指定します。(0以外:共通 0:個人のみ) 057 * 058 * @og.rev 5.3.6.0 (2011/06/01) 新規追加 059 * 060 * @version 5.0 061 * @author Hiroki Nakamura 062 * @since JDK6.0, 063 */ 064public class DBEditConfig { 065 066 private static final int EDIT_KEY_NAME = 0; 067 private static final int EDIT_KEY_VIEW = 1; 068 private static final int EDIT_KEY_SUM = 2; 069 private static final int EDIT_KEY_GROUP = 3; 070 private static final int EDIT_KEY_SUBTOTAL = 4; 071 private static final int EDIT_KEY_TOTAL = 5; 072 private static final int EDIT_KEY_GRANDTOTAL= 6; 073 private static final int EDIT_KEY_ORDERBY = 7; 074 private static final int EDIT_KEY_COMMON = 8; 075 076 private static final String[] EDIT_KEYS 077 = { "NAME", "VIEW", "SUM", "GROUP", "SUBTOTAL", "TOTAL", "GRANDTOTAL", "ORDERBY", "COMMON" }; 078 079 private static final int EDIT_KEYS_LENGTH = EDIT_KEYS.length; 080 081 private final String[] editVals = new String[EDIT_KEYS_LENGTH]; 082 083 private int sumClmCount; 084 private int groupClmCount; 085 private int subTotalClmCount; 086 private int totalClmCount; 087 private final Map<String,String> orderMap = new HashMap<String,String>(); 088 private String orderByDescClms; 089 090 /** 091 * コンストラクタ 092 * 093 * 空のエディット設定オブジェクトを構築します。 094 */ 095 public DBEditConfig() {} 096 097 /** 098 * コンストラクタ 099 * 100 * 各種パラメーターを指定してエディット設定オブジェクトを構築します。 101 * 102 * @param editName エディット名称 103 * @param viewClms 画面表示カラム 104 * @param sumClms 集計カラム 105 * @param groupClms グループカラム 106 * @param subTotalClms 小計カラム 107 * @param totalClms 合計カラム 108 * @param useGrandTotal 総合計行を追加するか(1:追加する 1以外:追加しない) 109 * @param orderByClms 表示順 110 * @param isCommon 共通エディットかどうか(1:共通 1以外:個人のみ) 111 */ 112 public DBEditConfig( final String editName, final String viewClms 113 , final String sumClms, final String groupClms 114 , final String subTotalClms, final String totalClms 115 , final String useGrandTotal, final String orderByClms 116 , final String isCommon ) { 117 118 editVals[EDIT_KEY_NAME] = editName; 119 editVals[EDIT_KEY_VIEW] = viewClms; 120 editVals[EDIT_KEY_SUM] = sumClms; 121 editVals[EDIT_KEY_GROUP] = groupClms; 122 editVals[EDIT_KEY_SUBTOTAL] = subTotalClms; 123 editVals[EDIT_KEY_TOTAL] = totalClms; 124 editVals[EDIT_KEY_GRANDTOTAL] = useGrandTotal; 125 editVals[EDIT_KEY_ORDERBY] = orderByClms; 126 editVals[EDIT_KEY_COMMON] = isCommon; 127 128 init(); 129 } 130 131 /** 132 * コンストラクタ 133 * 134 * 各種パラメーターを配列で指定してエディット設定オブジェクトを構築します。 135 * 各パラメータの配列インデックスは、{@link #getEditKeys(String,String)}で返される 136 * キー一覧の配列インデックスと一致します。 137 * 各パラメーターの意味については、クラスのJavadoc{@link DBEditConfig}を参照して下さい。 138 * 139 * @param editVals 設定値(配列) 140 * @see DBEditConfig 141 * @see #getEditKeys(String,String) 142 **/ 143 public DBEditConfig( final String[] editVals ) { 144 System.arraycopy( editVals, 0, this.editVals, 0, editVals.length ); 145 init(); 146 } 147 148 /** 149 * エディット設定オブジェクト作成時の初期化処理です。 150 * コンストラクタの引数に基づき内部変数の初期設定を行います。 151 */ 152 private void init() { 153 sumClmCount = StringUtil.csv2Array( editVals[EDIT_KEY_SUM] ).length; 154 groupClmCount = StringUtil.csv2Array( editVals[EDIT_KEY_GROUP] ).length; 155 subTotalClmCount = StringUtil.csv2Array( editVals[EDIT_KEY_SUBTOTAL] ).length; 156 totalClmCount = StringUtil.csv2Array( editVals[EDIT_KEY_TOTAL] ).length; 157 158 if( editVals[EDIT_KEY_ORDERBY] != null ) { 159 StringBuilder buf = new StringBuilder(); 160 String[] ary = StringUtil.csv2Array( editVals[EDIT_KEY_ORDERBY] ); 161 for( int i=0; i<ary.length ;i++ ) { 162 String str = ary[i]; 163 if( str.startsWith( "!" ) ) { 164 str = str.substring( 1 ); 165 if( buf.length() > 0 ) { buf.append( "," ); } 166 buf.append( str ); 167 } 168 orderMap.put( str, String.valueOf( i+1 ) ); 169 } 170 orderByDescClms = buf.toString(); 171 } 172 else { 173 orderByDescClms = null; 174 } 175 } 176 177 /** 178 * キー配列から画面IDとエディット名称のペアの一覧を取り出します。 179 * 180 * キー配列から"EDIT_NAME_"で始まるキーを検索し、"EDIT_NAME_(画面ID)_(エディット名)" 181 * と言う形式に基づき、画面IDとエディット名称のペアを取り出します。 182 * 183 * 画面IDとエディット名称は配列として保存され(インデックス番号は 0:画面ID、1:エディット名) 184 * その一覧がされらに配列に格納されて返されます。 185 * 186 * @param keys キー配列 187 * 188 * @return 画面IDとエディット名称のペアの一覧 189 */ 190 public static String[][] getKeySet( final String[] keys ) { 191 if( keys == null || keys.length == 0 ) { return null; } 192 193 Set<String[]> keySet = new HashSet<String[]>(); 194 for( String key : keys ) { 195 if ( key != null && key.startsWith( "EDIT_NAME_" ) ) { 196 String guikeyEditName = key.substring( "EDIT_NAME_".length() ); 197 if( guikeyEditName.indexOf( '_' ) >= 0 ) { 198 String guikey = guikeyEditName.substring( 0, guikeyEditName.indexOf( '_' ) ); 199 String editName = guikeyEditName.substring( ( guikey + "_" ).length() ); 200 if( guikey != null && guikey.length() > 0 && editName != null && editName.length() > 0 ) { 201 String[] set = { guikey, editName }; 202 keySet.add( set ); 203 } 204 } 205 } 206 } 207 return keySet.toArray( new String[keySet.size()][] ); 208 } 209 210 /** 211 * 画面ID、エディット名をキーに、エディット設定オブジェクトの各設定値の 212 * 管理キーを指定します。 213 * 214 * エディット設定オブジェクトで管理される各キーに対して、 215 * "EDIT_[KEY]_(画面ID)_(エディット名)"というキーを生成し、これを配列にして返します。 216 * 217 * @param guikey 画面ID 218 * @param editName エディット名 219 * 220 * @return エディット設定を管理するためのキー一覧 221 */ 222 public static String[] getEditKeys( final String guikey, final String editName ) { 223 String[] rtn = new String[EDIT_KEYS_LENGTH]; 224 for( int i=0; i<EDIT_KEYS_LENGTH; i++ ) { 225 rtn[i] = "EDIT_" + EDIT_KEYS[i] + "_" + guikey + "_" + editName; 226 } 227 return rtn; 228 } 229 230 /** 231 * エディット設定オブジェクトの各設定値を配列にして返します。 232 * 233 * 配列のインデックス番号は、{@link #getEditKeys(String,String)}で生成されるキーの 234 * インデックス番号と一致します。 235 * 236 * @return エディット設定オブジェクトの設定値一覧(配列) 237 * @see #getEditKeys(String,String) 238 */ 239 public String[] getEditVals() { 240 String[] rtn = new String[editVals.length]; 241 System.arraycopy( editVals, 0, rtn, 0, editVals.length ); 242 return rtn; 243 } 244 245 /** 246 * エディット名を返します。 247 * 248 * @return エディット名 249 */ 250 public String getEditName() { 251 return editVals[EDIT_KEY_NAME]; 252 } 253 254 /** 255 * 表示カラム名の一覧をカンマ区切りで返します。 256 * 非表示カラムについては、カラム名の先頭に"!"をつけて返されます。 257 * 例) AAA,!BBB,CCC ⇒ AAA,CCCの順に表示(BBBは非表示) 258 * 259 * @return 表示カラム名一覧(カンマ区切り) 260 */ 261 public String getViewClms() { 262 return editVals[EDIT_KEY_VIEW]; 263 } 264 265 /** 266 * 集計カラムの一覧をカンマ区切りで返します。 267 * 268 * @return 集計カラムの一覧(カンマ区切) 269 */ 270 public String getSumClms() { 271 return editVals[EDIT_KEY_SUM]; 272 } 273 274 /** 275 * 集計処理を行うかどうかを返します。 276 * これは、集計カラムが指定されているか、と同じ意味です。 277 * 278 * @return true:対象 false:非対象 279 */ 280 public boolean useSum() { 281 return editVals[EDIT_KEY_SUM] != null && editVals[EDIT_KEY_SUM].length() > 0 ; 282 } 283 284 /** 285 * 指定されたカラムが集計対象のカラムかどうかを返します。 286 * 287 * @param clm カラム 288 * 289 * @return true:対象 false:非対象 290 */ 291 public boolean isSumClm( final String clm ) { 292 if( clm == null || editVals[EDIT_KEY_SUM] == null ) { return false; } 293 return ( ","+editVals[EDIT_KEY_SUM]+"," ).indexOf( ","+clm+"," ) >= 0 ; 294 } 295 296 /** 297 * 集計カラムのカラム数を返します。 298 * 299 * @return 集計カラムのカラム数 300 */ 301 public int getSumClmCount() { 302 return sumClmCount; 303 } 304 305 /** 306 * グループカラムの一覧をカンマ区切りで返します。 307 * 308 * @return グループカラムの一覧(カンマ区切) 309 */ 310 public String getGroupClms() { 311 return editVals[EDIT_KEY_GROUP]; 312 } 313 314 /** 315 * グループ処理を行うかどうかを返します。 316 * これは、グループカラムが指定されているか、と同じ意味です。 317 * 318 * @return true:対象 false:非対象 319 */ 320 public boolean useGroup() { 321 return editVals[EDIT_KEY_GROUP] != null && editVals[EDIT_KEY_GROUP].length() > 0 ; 322 } 323 324 /** 325 * 指定されたカラムがグループ対象のカラムかどうかを返します。 326 * 327 * @param clm カラム 328 * 329 * @return true:対象 false:非対象 330 */ 331 public boolean isGroupClm( final String clm ) { 332 if( clm == null || editVals[EDIT_KEY_GROUP] == null ) { return false; } 333 return ( ","+editVals[EDIT_KEY_GROUP]+"," ).indexOf( ","+clm+"," ) >= 0 ; 334 } 335 336 /** 337 * グループカラムのカラム数を返します。 338 * 339 * @return グループカラムのカラム数 340 */ 341 public int getGroupClmCount() { 342 return groupClmCount; 343 } 344 345 /** 346 * 小計カラムの一覧をカンマ区切りで返します。 347 * 348 * @return 小計カラムの一覧(カンマ区切) 349 */ 350 public String getSubTotalClms() { 351 return editVals[EDIT_KEY_SUBTOTAL]; 352 } 353 354 /** 355 * 小計処理を行うかどうかを返します。 356 * これは、小計カラムが指定されているか、と同じ意味です。 357 * 358 * @return true:対象 false:非対象 359 */ 360 public boolean useSubTotal() { 361 return editVals[EDIT_KEY_SUBTOTAL] != null && editVals[EDIT_KEY_SUBTOTAL].length() > 0 ; 362 } 363 364 /** 365 * 指定されたカラムが小計対象のカラムかどうかを返します。 366 * 367 * @param clm カラム 368 * 369 * @return true:対象 false:非対象 370 */ 371 public boolean isSubTotalClm( final String clm ) { 372 if( clm == null || editVals[EDIT_KEY_SUBTOTAL] == null ) { return false; } 373 return ( ","+editVals[EDIT_KEY_SUBTOTAL]+"," ).indexOf( ","+clm+"," ) >= 0 ; 374 } 375 376 /** 377 * 小計カラムのカラム数を返します。 378 * 379 * @return グループカラムのカラム数 380 */ 381 public int getSubTotalClmCount() { 382 return subTotalClmCount; 383 } 384 385 /** 386 * 合計カラムの一覧をカンマ区切りで返します。 387 * 388 * @return 合計カラムの一覧(カンマ区切) 389 */ 390 public String getTotalClms() { 391 return editVals[EDIT_KEY_TOTAL]; 392 } 393 394 /** 395 * 合計処理を行うかどうかを返します。 396 * これは、合計カラムが指定されているか、と同じ意味です。 397 * 398 * @return true:対象 false:非対象 399 */ 400 public boolean useTotal() { 401 return editVals[EDIT_KEY_TOTAL] != null && editVals[EDIT_KEY_TOTAL].length() > 0 ; 402 } 403 404 /** 405 * 指定されたカラムが合計対象のカラムかどうかを返します。 406 * 407 * @param clm カラム 408 * 409 * @return true:対象 false:非対象 410 */ 411 public boolean isTotalClm( final String clm ) { 412 if( clm == null || editVals[EDIT_KEY_TOTAL] == null ) { return false; } 413 return ( ","+editVals[EDIT_KEY_TOTAL]+"," ).indexOf( ","+clm+"," ) >= 0 ; 414 } 415 416 /** 417 * 合計カラムのカラム数を返します。 418 * 419 * @return グループカラムのカラム数 420 */ 421 public int getTotalClmCount() { 422 return totalClmCount; 423 } 424 425 /** 426 * 総合計行を付加するかどうかを返します。 427 * 428 * @return true:対象 false:非対象 429 */ 430 public boolean useGrandTotal() { 431 return StringUtil.nval( editVals[EDIT_KEY_GRANDTOTAL], false ); 432 } 433 434 /** 435 * 表示順カラムをカンマ区切りで返します。 436 * カラムの並び順が表示順としての優先順になります。 437 * また、降順で表示するカラムについては、カラム名の先頭に"!"が付加されます。 438 * 439 * @return 標準順カラムの一覧(カンマ区切) 440 */ 441 public String getOrderByClms() { 442 return editVals[EDIT_KEY_ORDERBY]; 443 } 444 445 /** 446 * 指定されたカラムの表示順の優先番号を返します。 447 * 指定カラムが標準として指定されていない場合は、""(ゼロストリング)を返します。 448 * 449 * @param clm カラム 450 * 451 * @return 表示順の優先番号 452 */ 453 public String getOrder( final String clm ) { 454 if( clm == null || editVals[EDIT_KEY_ORDERBY] == null ) { return ""; } 455 456 String rtn = orderMap.get( clm ); 457 return rtn == null ? "" : rtn ; 458 } 459 460 /** 461 * 指定されたカラムの表示順指定が降順であるかどうかを返します。 462 * 標準と指定されていない場合は、falseを返します。 463 * 464 * @param clm カラム 465 * 466 * @return true:降順 false:昇順 467 */ 468 public boolean isOrderByDesc( final String clm ) { 469 if( clm == null || orderByDescClms == null ) { return false; } 470 return ( ","+orderByDescClms+"," ).indexOf( ","+clm+"," ) >= 0 ; 471 } 472 473 /** 474 * 並び替え処理を行うかどうかを返します。 475 * これは、表示順カラムが指定されているか、と同じ意味です。 476 * 477 * @return true:対象 false:非対象 478 */ 479 public boolean useOrderBy() { 480 return editVals[EDIT_KEY_ORDERBY] != null && editVals[EDIT_KEY_ORDERBY].length() > 0 ; 481 } 482 483 /** 484 * このエディット設定オブジェクトが、共通(全ユーザー公開)エディットか 485 * どうかを返します。 486 * 487 * @return 0以外:共通 0:個人のみ 488 */ 489 public boolean isCommon() { 490 return StringUtil.nval( editVals[EDIT_KEY_COMMON], false ); 491 } 492}