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.view; 017 018import java.util.Arrays; 019 020import org.opengion.fukurou.util.StringUtil; 021import org.opengion.hayabusa.common.HybsSystem; 022import org.opengion.hayabusa.html.AbstractViewForm; 023import org.opengion.hayabusa.html.ViewJsonParam; 024 025/** 026 * 検索結果をJSON形式で出力します。 027 * 以下の形式で出力されます 028 * { "DATA":[{"カラム名":"値(1行目)",...},{"カラム名":"値(2行目)",...}] 029 * ,"HEAD":{"カラム名":"ラベル",...} 030 * ,"INFO":{{"COUNT":"件数","COLUMN":"出力カラム名(カンマ区切り)"} } 031 * } 032 * 033 * AbstractViewForm を継承している為,ロケールに応じたラベルを出力させる事が出来ます。 034 * 035 * @og.group 画面表示 036 * @og.rev 5.1.7.0 (2016/04/01) 新規作成 037 * 038 * @version 5.0 039 * @author Takahashi Masakazu 040 * @since JDK5.0, 041 */ 042public class ViewForm_JSON extends AbstractViewForm { 043 //* このプログラムのVERSION文字列を設定します。 {@value} */ 044 private static final String VERSION = "5.5.4.2 (2012/07/13)" ; 045 046 private int clmCnt = -1; 047 048 private String viewClms = null; 049 050 private String dataName; 051 private boolean useHead; 052 private boolean useInfo; 053 private boolean useRenderer; 054 private boolean useUtfEncode; // '\u0000'形式への変換は仕様上必須ではないので現時点では実装しない 055 056 private String rendererCols; // 5.9.27.0 (2017/12/01) 057 058 /** ヘッダー部分のキャッシュ変数 */ 059 protected String headerLine = null; 060 061 /** 062 * DBTableModel から HTML文字列を作成して返します。 063 * startNo(表示開始位置)から、pageSize(表示件数)までのView文字列を作成します。 064 * 表示残りデータが pageSize 以下の場合は,残りのデータをすべて出力します。 065 * 066 * @og.rev 5.5.4.2 (2012/07/13) editName指定時の編集対応 067 * @og.rev 5.9.17.0 (2017/12/01) レンデラー利用カラム追加 068 * 069 * @param startNo 表示開始位置 070 * @param pageSize 表示件数 071 * 072 * @return DBTableModelから作成された HTML文字列 073 */ 074 @Override 075 public String create( final int startNo, final int pageSize ) { 076 //if( getRowCount() == 0 ) { return ""; } // 暫定処置 077 078 paramInit(); 079 080 // 5.9.27.0 (2017/12/01) レンデラー利用カラムの指定(JSONのみの特殊判定) 081 boolean[] rendCols = new boolean[clmCnt]; 082 // Arrays.fill( rendCols ,false ); // falseの場合は不要なので削除しておく 083 setBooleanArray( rendererCols,true,rendCols ); 084 085 headerLine = null; 086 int lastNo = getLastNo( startNo, pageSize ); 087 088 StringBuilder out = new StringBuilder( HybsSystem.BUFFER_LARGE ); 089 090 //JSON開始 091 out.append("{").append( HybsSystem.CR ); 092 093 094 int rowcnt = 0; 095 out.append( "\"" + dataName + "\"" ).append(":["); 096 for( int row=startNo; row<lastNo; row++ ) { 097 if( isSkip( row ) || isSkipNoEdit( row ) ) { continue; } 098 if(rowcnt > 0 ){ out.append(","); } 099 rowcnt++; 100 out.append( "{" ); 101 102 int clmcount = 0; 103 for(int clm = 0; clm < clmCnt; clm++) { 104 if( isColumnDisplay( clm ) ) { 105 if( clmcount > 0 ){ out.append( "," );} 106 clmcount++; 107 108 out.append("\"" + getColumnName( clm ) + "\":") 109 .append( "\"" ); 110 if( useRenderer || rendCols[clm] ){ 111 out.append( StringUtil.jsonFilter( getValueLabel(row,clm) ) ); 112 } 113 else{ 114 out.append( StringUtil.jsonFilter( getValue(row,clm)) ); 115 } 116 out.append( "\"" ); 117 } 118 } 119 out.append( "}" ); 120 } 121 out.append("]").append( HybsSystem.CR ); 122 123 124 if( useHead ){ 125 out.append(",").append( getHeader() ).append( HybsSystem.CR ); 126 } 127 if( useInfo ){ 128 out.append(",").append( getInfo(rowcnt) ).append( HybsSystem.CR ); 129 } 130 131 //JSON終わり 132 out.append("}").append( HybsSystem.CR ); 133 134 return out.toString(); 135 } 136 137 /** 138 * パラメータ内容を初期化します。 139 * 140 * @og.rev 5.9.27.0 (2017/12/01) レンデラー利用カラム追加 141 */ 142 private void paramInit() { 143 useHead = StringUtil.nval( getParam( ViewJsonParam.JSON_HEAD_KEY , ViewJsonParam.USE_JSON_HEAD ), true); 144 useInfo = StringUtil.nval( getParam( ViewJsonParam.JSON_INFO_KEY , ViewJsonParam.USE_JSON_INFO ), true); 145 useRenderer = StringUtil.nval( getParam( ViewJsonParam.JSON_RENDERER_KEY , ViewJsonParam.USE_JSON_RENDERER ), false); 146 useUtfEncode= StringUtil.nval( getParam( ViewJsonParam.JSON_UTF_ENCODE , ViewJsonParam.USE_JSON_UTFENC ), false); 147 dataName = getParam( ViewJsonParam.JSON_DATANAME_KEY , ViewJsonParam.JSON_DATANAME ); 148 149 rendererCols= StringUtil.nval( getParam( ViewJsonParam.JSON_RENDERER_COLS_KEY , ViewJsonParam.JSON_RENDERER_COLS ), ""); // 5.9.27.0 (2017/12/01) 150 151 clmCnt = getColumnCount(); 152 } 153 154 /** 155 * DBTableModel から テーブルのヘッダータグ文字列を作成して返します。 156 * 157 * 158 * @return テーブルのヘッダータグ文字列 159 */ 160 protected String getHeader() { 161 return "\"HEAD\":{" + getTableHead() + "}"; 162 } 163 164 /** 165 * DBTableModel から テーブルのタグ文字列を作成して返します。 166 * 167 * 168 * @return テーブルのタグ文字列 169 */ 170 protected String getTableHead() { 171 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 172 173 buf.append( getHeadLine() ); 174 175 return buf.toString(); 176 } 177 178 /** 179 * ヘッダー繰り返し部を、getTableHead()メソッドから分離。 180 * 181 * 182 * @return テーブルのタグ文字列 183 */ 184 protected String getHeadLine() { 185 if( headerLine != null ) { return headerLine; } // キャッシュを返す。 186 187 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 188 189 for(int clm = 0; clm < clmCnt; clm++) { 190 if( isColumnDisplay( clm ) ) { 191 if( buf.length() > 0 ){ buf.append(","); } 192 buf.append( "\"" + getColumnName( clm ) + "\"" ); 193 buf.append(":"); 194 buf.append( "\"" + StringUtil.jsonFilter( getColumnLabel( clm ) ) + "\"" ); 195 } 196 } 197 198 headerLine = buf.toString(); 199 return headerLine; 200 } 201 202 /** 203 * DBTableModelの情報を出力します。 204 * 205 * @og.rev 5.9.21.0 (2017/06/02) COLUMN追加 206 * 207 * @return テーブルのヘッダータグ文字列 208 */ 209 protected String getInfo( final int rowcount) { 210 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 211 212 buf.append( "\"INFO\":{" ) 213 .append( "\"COUNT\":").append( "\"" + rowcount + "\"" ) 214 .append( ",\"COLUMN\":" ).append( "\"" + getViewClms() + "\"") // 5.9.21.0 (2017/06/02) 215 .append( "}"); 216 return buf.toString(); 217 } 218 219 220 221 /** 222 * ビューで表示したカラムの一覧をカンマ区切りで返します。 223 * 224 * @og.rev 5.1.6.0 (2010/05/01) 新規追加 225 * @og.rev 5.8.6.0 (2015/04/03) オリジナルカラム対応 226 * 227 * @return ビューで表示したカラムの一覧 228 */ 229 @Override 230 public String getViewClms() { 231 if( viewClms == null ) { return super.getViewClms(); } 232 return viewClms; 233 } 234 235 /** 236 * フォーマットメソッドを使用できるかどうかを問い合わせます。 237 * 238 * @return 使用可能(true)/ 使用不可能(false) 239 */ 240 public boolean canUseFormat() { 241 return false; 242 } 243}