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.io;
017
018import java.io.PrintWriter;
019
020import org.opengion.fukurou.util.StringUtil;
021import org.opengion.hayabusa.db.DBTableModel;
022
023/**
024 * TableWriter をJSON形式で出力する為の実装クラスです。
025 * DefaultTableWriter を継承していますので、ラベル、名前、データの出力部のみ
026 * オーバーライドして、JSON形式ファイルの出力機能を実現しています。
027 *
028 * 出力のJSON形式(JavaScript Object Notation)は、通常版ではなく IOr形式のJSONです。
029 *
030 * {
031 *   "status": 200,
032 *   "message": "OK",
033 *   "sessionInfo": "",
034 *   "information": "",
035 *   "data": {
036 *     "headers": [
037 *       { "display_label": "品目番号","display": "PN"     },
038 *       { "display_label": "入出庫数","display": "SUNYSY" },
039 *     ],
040 *     "rows": [
041 *       {"cols": [ "100-1A100-01", "T", 1,00+00"  ]},
042 *       {"cols": [ "200-2A125-01", "T", 500,00+00"]},
043 *       {"cols": [ "100-1A100-01", "T", 100,00+00"]},
044 *       {"cols": [ "200-2A125-01", "T", 200,00+00"]}
045 *     ]
046 *   }
047 * }
048 *
049 *
050 * @og.rev 8.1.1.0 (2022/02/04) 新規作成
051 * @og.group ファイル出力
052 *
053 * @version  8.1
054 * @author   Kazuhiko Hasegawa
055 * @since    JDK17,
056 */
057public class TableWriter_JSON2 extends TableWriter_Default {
058        /** このプログラムのVERSION文字列を設定します。 {@value} */
059        private static final String VERSION = "8.5.6.1 (2024/03/29)" ;
060
061        private static final String INFO = " \"status\":200,\"message\":\"OK\",\"sessionInfo\":\"\",\"information\":\"\"," ;
062
063        /**
064         * デフォルトコンストラクター
065         */
066        public TableWriter_JSON2() { super(); }         // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
067
068        /**
069         * DBTableModel から データを作成して、PrintWriter に書き出します。
070         *
071         * @param       writer PrintWriterオブジェクト
072         */
073        @Override
074        public void writeDBTable( final PrintWriter writer )  {
075                writer.println( "{" );
076                writer.println( INFO );
077                writer.println( " \"data\":{\"" );
078
079                super.setHeaderSequence( "LD" );
080                super.writeDBTable( writer );
081
082                writer.println( " }" );
083                writer.println( "}" );
084        }
085
086        /**
087         * PrintWriter に DBTableModelのラベル情報を書き込みます。
088         *
089         * IORのヘッダー情報は、
090         *   "headers":[{"display_label":"≪カラムラベル≫","display":"≪カラム≫",},…,],
091         * 形式です。
092         *
093         * @param       table DBTableModelオブジェクト
094         * @param       writer PrintWriterオブジェクト
095         */
096        @Override
097        protected void writeLabel( final DBTableModel table,final PrintWriter writer ) {
098                writer.println( "  \"headers\":[" );
099
100                for( int i=0; i<numberOfColumns; i++ ) {
101                        final int clm = clmNo[i];
102                        if( clm < 0 ) { continue; }                     // カラム飛ばし
103                        final String val = StringUtil.tagCut( dbColumn[clm].getLabel() );
104                        writer.print( "   {\"display_label\":\"" );
105                        writer.print( val );
106                        writer.print( "\",\"display\":\"" );
107                        writer.print( dbColumn[clm].getName() );
108                        writer.println( "\"}," );
109                }
110                writer.println( "  ]," );
111        }
112
113        /**
114         * PrintWriter に DBTableModelのテーブル情報を書き込みます。
115         *
116         * IORのデータ情報は、
117         *   "rows": [
118         *     {"cols": [ "≪データ1≫", "≪データ2≫",…]},
119         *     {"cols": [ "≪データ1≫", "≪データ2≫",…]},
120         *   ]
121         * 形式です。
122         *
123         * @og.rev 8.5.6.1 (2024/03/29) PMD 7.0.0 Finding duplicated code with CPD
124         *
125         * @param       table  DBTableModelオブジェクト
126         * @param       writer PrintWriterオブジェクト
127         */
128        @Override
129        protected void writeData( final DBTableModel table,final PrintWriter writer ) {
130                final int numberOfRows =  table.getRowCount();
131
132                writer.println( "  \"rows\":[" );
133
134//              final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE );   // \(バックスラッシュ) と "(ダブルクオート)のエスケープ 処理用
135                for( int row=0; row<numberOfRows; row++ ) {
136                        writer.print( "   {\"cols\":[" );
137                        for( int i=0; i<numberOfColumns; i++ ) {
138                                final int clm = clmNo[i];
139                                if( clm < 0 ) { continue; }                     // カラム飛ばし
140
141                                // 8.5.6.1 (2024/03/29) PMD 7.0.0 Finding duplicated code with CPD
142                                // 注意:jsonFilter では、\(バックスラッシュ) と "(ダブルクオート) 以外もエスケープしています。
143                                final String val = StringUtil.jsonFilter( table.getValue(row,clm) );
144//                              String val = table.getValue(row,clm);
145//                              // \(バックスラッシュ) と "(ダブルクオート)のエスケープ
146//                              if( val.contains( "\\" ) || val.contains( "\"" ) ) {
147//                                      buf.setLength(0);
148//                                      for( int j=0; j<val.length(); j++ ) {
149//                                              final char ch = val.charAt( j );
150//                                              if( ch == '\\' || ch == '\"' ) { buf.append( '\\' ); }
151//                                              buf.append( ch );
152//                                      }
153//                                      val = buf.toString();
154//                              }
155
156                                writer.print( '"' );
157                                writer.print( val );
158                                writer.print( "\"," );
159                        }
160                        writer.println( "]}," );
161                }
162
163                writer.println( "  ]" );
164        }
165}