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 = "6.4.2.0 (2016/01/29)" ; 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 * 127 * @param value 入力値 128 * @param isView データ表示用かどうか(true:表示用/false:出力用) 129 * 130 * @return データ表示用/出力用の文字列 131 * @og.rtnNotNull 132 * @see #getValue( String ) 133 */ 134 private String getValue( final String value , final boolean isView ) { 135 if( value == null || value.isEmpty() ) { return ""; } 136 137 String rtn = value; // 初期値:isView = false の時の値 138 139 if( rtn.length() != 8 && rtn.length() != 14 ) { 140 rtn = HybsDateUtil.parseNumber( value ); 141 } 142 143 char[] ch1 = new char[19]; 144 if( rtn.length() == 8 || rtn.length() == 14 ) { 145 ch1[0] = rtn.charAt(0); 146 ch1[1] = rtn.charAt(1); 147 ch1[2] = rtn.charAt(2); 148 ch1[3] = rtn.charAt(3); 149 ch1[4] = '/' ; 150 ch1[5] = rtn.charAt(4); 151 ch1[6] = rtn.charAt(5); 152 ch1[7] = '/' ; 153 ch1[8] = rtn.charAt(6); 154 ch1[9] = rtn.charAt(7); 155 156 // 6.3.9.0 (2015/11/06) 条件は効果がない(findbugs)。rtn.length() == 14 は確定している。 157 if( rtn.length() == 8 || rtn.endsWith( "000000" ) ) { 158 rtn = new String( ch1 , 0 , 10 ); // YYYY/MM/DD 形式を返す。 159 } 160 else { 161 ch1[10] = ' '; 162 ch1[11] = rtn.charAt(8); 163 ch1[12] = rtn.charAt(9); 164 ch1[13] = ':'; 165 ch1[14] = rtn.charAt(10); 166 ch1[15] = rtn.charAt(11); 167 ch1[16] = ':'; 168 ch1[17] = rtn.charAt(12); 169 ch1[18] = rtn.charAt(13); 170 rtn = new String( ch1 ); // YYYY/MM/DD HH:MM:SS 形式を返す。 171 } 172 } 173 else { 174 if( isView ) { 175 rtn = "<span class=\"error\">" + value + "</span>"; 176 } 177 } 178 179 return rtn ; 180 } 181}