    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 = "5.5.7.2 (2012/10/09)" ;
    049
    050        private static final CellRenderer dbCell = new Renderer_TMSTMP() ;
    051
    052        /**
    053         * 各オブジェクトから自分のインスタンスを返します。
    054         * 自分自身をキャッシュするのか、新たに作成するのかは、各サブクラスの実装に
    055         * まかされます。
    056         *
    057         * @param       clm     DBColumnオブジェクト
    058         *
    059         * @return      CellRendererオブジェクト
    060         */
    061        public CellRenderer newInstance( final DBColumn clm ) {
    062                return dbCell;
    063        }
    064
    065        /**
    066         * データの表示用文字列を返します。
    067         * 日時(年/月/日 時:分:秒)または、日付(年/月/日)表示する場合に使用するクラスです。
    068         * 数字以外は、各データベースによって、まちまちなので、'/',':','-',' ' を削除します。
    069         * なお、並び順は、必須に、YYYYMMDDHHMISS の順番とし、January 8 などの形式や、
    070         * 04:05 AM 、1/8/1999 などの形式は受け付けることは出来ません。
    071         * あくまで、先頭から 数字を順次取得し、YYYYMMDDHHMISS 形式に当てはめていきます。
    072         * また、時刻部分 HHMISS が 000000 の場合は、日付のみに自動的にします。
    073         * これは、日付ネイティブでは、時刻情報も持っているため、使っているのかどうかの
    074         * 判定は、実際のデータが、000000 に設定されているかどうかでしか判断できないためです。
    075         * 自動判定がまずい場合は、通常のレンデラーで、表示桁数制限しても構いません。
    076         *
    077         * ここでは、規定のフォーマット(８ケタ OR １４ケタ)でない場合は、エラー表示を行います。
    078         *
    079         * @og.rev 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正します。
    080         *
    081         * @param   value 入力値
    082         *
    083         * @return  データの表示用文字列
    084         */
    085        @Override
    086        public String getValue( final String value ) {
    087                if( value == null || value.length() == 0 ) { return ""; }
    088
    089                String rtn = value;
    090
    091                if( rtn.length() != 8 && rtn.length() != 14 ) {
    092                        rtn = HybsDateUtil.parseNumber( value );
    093                }
    094
    095                char[] ch1 = new char[19];
    096                if( rtn.length() == 8 || rtn.length() == 14 ) {
    097                        ch1[0] = rtn.charAt(0);
    098                        ch1[1] = rtn.charAt(1);
    099                        ch1[2] = rtn.charAt(2);
    100                        ch1[3] = rtn.charAt(3);
    101                        ch1[4] = '/' ;
    102                        ch1[5] = rtn.charAt(4);
    103                        ch1[6] = rtn.charAt(5);
    104                        ch1[7] = '/' ;
    105                        ch1[8] = rtn.charAt(6);
    106                        ch1[9] = rtn.charAt(7);
    107
    108                        if( rtn.length() == 8 || ( rtn.length() == 14 && rtn.endsWith( "000000" ) ) ) {
    109                                rtn = new String( ch1 , 0 , 10 );       // YYYY/MM/DD 形式を返す。
    110                        }
    111                        else {
    112                                ch1[10] = ' ';
    113                                ch1[11] = rtn.charAt(8);
    114                                ch1[12] = rtn.charAt(9);
    115                                ch1[13] = ':';
    116                                ch1[14] = rtn.charAt(10);
    117                                ch1[15] = rtn.charAt(11);
    118                                ch1[16] = ':';
    119                                ch1[17] = rtn.charAt(12);
    120                                ch1[18] = rtn.charAt(13);
    121                                rtn = new String( ch1 );                        // YYYY/MM/DD HH:MM:SS 形式を返す。
    122                        }
    123                }
    124                else {
    125                        rtn = "<span class=\"error\">" + value + "</span>";
    126                }
    127
    128                return rtn ;
    129
    130
    131//              final String rtn;
    132//
    133//              if( value == null || value.length() == 0 ) {
    134//                      rtn = "";
    135//              }
    136//              else {
    137//                      StringBuilder buf = new StringBuilder();
    138//                      int cnt = 0;
    139//                      for( int i=0; i<value.length(); i++ ) {
    140//                              char ch = value.charAt(i);
    141//                              if( ch >= '0' && ch <= '9' ) {
    142//                                      buf.append( ch );
    143//                                      cnt++;
    144//                                      if( cnt == 4 || cnt == 6 ) {
    145//                                              buf.append( '/' );
    146//                                      }
    147//                                      if( cnt == 8 ) {
    148//                                              buf.append( ' ' );
    149//                                      }
    150//                                      if( cnt == 10 || cnt == 12 ) {
    151//                                              buf.append( ':' );
    152//                                      }
    153//                                      if( cnt == 14 ) { break; }
    154//                              }
    155//                      }
    156//                      rtn = buf.toString();
    157//              }
    158//
    159//              return rtn;
    160        }
    161}