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.plugin.column; 017 018import org.opengion.fukurou.util.HybsDateUtil; 019 020import org.opengion.hayabusa.db.AbstractRenderer; 021import org.opengion.hayabusa.db.CellRenderer; 022import org.opengion.hayabusa.db.DBColumn; 023 024/** 025 * TMSTMP レンデラーは、日付ネイティブのカラムのデータから、数字部分だけをピックアップし、 026 * 日時(年/月/日 時:分:秒)または、日付(年/月/日)表示する場合に使用するクラスです。 027 * 数字以外は、各データベースによって、まちまちなので、'/',':','-',' ' を削除します。 028 * なお、並び順は、必須に、YYYYMMDDHHMISS の順番とし、January 8 などの形式や、 029 * 04:05 AM、1/8/1999 などの形式は受け付けることは出来ません。 030 * あくまで、先頭から 数字を順次取得し、YYYYMMDDHHMISS 形式に当てはめていきます。 031 * また、時刻部分 HHMISS が 000000 の場合は、日付のみに自動的にします。 032 * これは、日付ネイティブでは、時刻情報も持っているため、使っているのかどうかの 033 * 判定は、実際のデータが、000000 に設定されているかどうかでしか判断できないためです。 034 * 自動判定がまずい場合は、通常のレンデラーで、表示桁数制限しても構いません。 035 * 036 * このクラスは、不変オブジェクトとして、共有されます。 037 * 038 * @og.group データ表示 039 * 040 * @og.rev 5.3.10.0 (2011/10/01) synchronized を、削除します。 041 * 042 * @version 4.0 043 * @author Kazuhiko Hasegawa 044 * @since JDK5.0, 045 */ 046public class Renderer_TMSTMP extends AbstractRenderer { 047 /** このプログラムのVERSION文字列を設定します。 {@value} */ 048 private static final String VERSION = "8.5.4.2 (2024/01/12)" ; 049 050 private static final CellRenderer DB_CELL = new Renderer_TMSTMP() ; 051 052 /** 053 * デフォルトコンストラクター 054 * 055 * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor. 056 */ 057 public Renderer_TMSTMP() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 058 059 /** 060 * 各オブジェクトから自分のインスタンスを返します。 061 * 自分自身をキャッシュするのか、新たに作成するのかは、各サブクラスの実装に 062 * まかされます。 063 * 064 * @param clm DBColumnオブジェクト 065 * 066 * @return CellRendererオブジェクト 067 * @og.rtnNotNull 068 */ 069 public CellRenderer newInstance( final DBColumn clm ) { 070 return DB_CELL; 071 } 072 073 /** 074 * データの表示用文字列を返します。 075 * 日時(年/月/日 時:分:秒)または、日付(年/月/日)表示する場合に使用するクラスです。 076 * 数字以外は、各データベースによって、まちまちなので、'/',':','-',' ' を削除します。 077 * なお、並び順は、必須に、YYYYMMDDHHMISS の順番とし、January 8 などの形式や、 078 * 04:05 AM、1/8/1999 などの形式は受け付けることは出来ません。 079 * あくまで、先頭から 数字を順次取得し、YYYYMMDDHHMISS 形式に当てはめていきます。 080 * また、時刻部分 HHMISS が 000000 の場合は、日付のみに自動的にします。 081 * これは、日付ネイティブでは、時刻情報も持っているため、使っているのかどうかの 082 * 判定は、実際のデータが、000000 に設定されているかどうかでしか判断できないためです。 083 * 自動判定がまずい場合は、通常のレンデラーで、表示桁数制限しても構いません。 084 * 085 * ここでは、規定のフォーマット(8ケタ OR 14ケタ)でない場合は、エラー表示を行います。 086 * 087 * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正します。 088 * @og.rev 6.0.4.0 (2014/11/28) ロジックの共通化 089 * 090 * @param value 入力値 091 * 092 * @return データの表示用文字列 093 * @og.rtnNotNull 094 */ 095 @Override 096 public String getValue( final String value ) { 097 return getValue( value , true ); 098 } 099 100 /** 101 * データ出力用の文字列を作成します。 102 * ファイル等に出力する形式を想定しますので、HTMLタグを含まない 103 * データを返します。 104 * 基本は、#getValue( String ) をそのまま返します。 105 * 106 * @og.rev 6.0.4.0 (2014/11/28) データ出力用のレンデラー 107 * 108 * @param value 入力値 109 * 110 * @return データ出力用の文字列 111 * @og.rtnNotNull 112 * @see #getValue( String ) 113 */ 114 @Override 115 public String getWriteValue( final String value ) { 116 return getValue( value , false ); 117 } 118 119 /** 120 * データ表示用/出力用の文字列を作成します。 121 * 第二引数の isView == true で、データ表示用文字列を、false で 122 * データ出力用の文字列を作成します。 123 * 処理の共通化を行うためのメソッドです。 124 * 125 * @og.rev 6.0.4.0 (2014/11/28) ロジックの共通化 126 * @og.rev 8.5.4.2 (2024/01/12) 処理の方法を見直します。 127 * 128 * @param value 入力値 129 * @param isView データ表示用かどうか(true:表示用/false:出力用) 130 * 131 * @return データ表示用/出力用の文字列 132 * @og.rtnNotNull 133 * @see #getValue( String ) 134 */ 135 private String getValue( final String value , final boolean isView ) { 136 if( value == null || value.isEmpty() ) { return ""; } 137 138 String rtn = value; // 初期値:isView = false の時の値 139 140 if( rtn.length() != 8 && rtn.length() != 14 ) { 141 rtn = HybsDateUtil.parseNumber( value ); 142 } 143 144 // 8.5.4.2 (2024/01/12) 処理の方法を見直します。 145 if( rtn.length() == 8 || rtn.endsWith( "000000" ) ) { // YYYY/MM/DD 形式を返す。 146 rtn = rtn.substring(0,4) + '/' + rtn.substring(4,6) + '/' + rtn.substring(6,8) ; 147 } 148 else if( rtn.length() == 14 ) { // YYYY/MM/DD HH:MM:SS 形式を返す。 149 rtn = rtn.substring(0,4) + '/' + rtn.substring(4,6) + '/' + rtn.substring(6,8) + ' ' 150 + rtn.substring(8,10) + ':' + rtn.substring(10,12) + ':' + rtn.substring(12); 151 } 152 else if( isView ) { 153 rtn = "<span class=\"error\">" + value + "</span>"; 154 } 155 return rtn; 156 157// final char[] ch1 = new char[19]; // 8.5.4.2 (2024/01/12) PMD 7.0.0 LocalVariableCouldBeFinal 158// if( rtn.length() == 8 || rtn.length() == 14 ) { 159// ch1[0] = rtn.charAt(0); 160// ch1[1] = rtn.charAt(1); 161// ch1[2] = rtn.charAt(2); 162// ch1[3] = rtn.charAt(3); 163// ch1[4] = '/' ; 164// ch1[5] = rtn.charAt(4); 165// ch1[6] = rtn.charAt(5); 166// ch1[7] = '/' ; 167// ch1[8] = rtn.charAt(6); 168// ch1[9] = rtn.charAt(7); 169// 170// // 6.3.9.0 (2015/11/06) 条件は効果がない(findbugs)。rtn.length() == 14 は確定している。 171// if( rtn.length() == 8 || rtn.endsWith( "000000" ) ) { 172// rtn = new String( ch1 , 0 , 10 ); // YYYY/MM/DD 形式を返す。 173// } 174// else { 175// ch1[10] = ' '; 176// ch1[11] = rtn.charAt(8); 177// ch1[12] = rtn.charAt(9); 178// ch1[13] = ':'; 179// ch1[14] = rtn.charAt(10); 180// ch1[15] = rtn.charAt(11); 181// ch1[16] = ':'; 182// ch1[17] = rtn.charAt(12); 183// ch1[18] = rtn.charAt(13); 184// rtn = new String( ch1 ); // YYYY/MM/DD HH:MM:SS 形式を返す。 185// } 186// } 187// else { 188// if( isView ) { 189// rtn = "<span class=\"error\">" + value + "</span>"; 190// } 191// } 192// 193// return rtn ; 194 } 195}