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}