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 ); 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 */ 141 private void paramInit() { 142 useHead = StringUtil.nval( getParam( ViewJsonParam.JSON_HEAD_KEY , ViewJsonParam.USE_JSON_HEAD ), true); 143 useInfo = StringUtil.nval( getParam( ViewJsonParam.JSON_INFO_KEY , ViewJsonParam.USE_JSON_INFO ), true); 144 useRenderer = StringUtil.nval( getParam( ViewJsonParam.JSON_RENDERER_KEY , ViewJsonParam.USE_JSON_RENDERER ), false); 145 useUtfEncode= StringUtil.nval( getParam( ViewJsonParam.JSON_UTF_ENCODE , ViewJsonParam.USE_JSON_UTFENC ), false); 146 dataName = getParam( ViewJsonParam.JSON_DATANAME_KEY , ViewJsonParam.JSON_DATANAME ); 147 148 rendererCols= StringUtil.nval( getParam( ViewJsonParam.JSON_RENDERER_COLS_KEY , ViewJsonParam.JSON_RENDERER_COLS ), ""); 149 150 clmCnt = getColumnCount(); 151 } 152 153 /** 154 * DBTableModel から テーブルのヘッダータグ文字列を作成して返します。 155 * 156 * 157 * @return テーブルのヘッダータグ文字列 158 */ 159 protected String getHeader() { 160 return "\"HEAD\":{" + getTableHead() + "}"; 161 } 162 163 /** 164 * DBTableModel から テーブルのタグ文字列を作成して返します。 165 * 166 * 167 * @return テーブルのタグ文字列 168 */ 169 protected String getTableHead() { 170 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 171 172 buf.append( getHeadLine() ); 173 174 return buf.toString(); 175 } 176 177 /** 178 * ヘッダー繰り返し部を、getTableHead()メソッドから分離。 179 * 180 * 181 * @return テーブルのタグ文字列 182 */ 183 protected String getHeadLine() { 184 if( headerLine != null ) { return headerLine; } // キャッシュを返す。 185 186 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 187 188 for(int clm = 0; clm < clmCnt; clm++) { 189 if( isColumnDisplay( clm ) ) { 190 if( buf.length() > 0 ){ buf.append(","); } 191 buf.append( "\"" + getColumnName( clm ) + "\"" ); 192 buf.append(":"); 193 buf.append( "\"" + StringUtil.jsonFilter( getColumnLabel( clm ) ) + "\"" ); 194 } 195 } 196 197 headerLine = buf.toString(); 198 return headerLine; 199 } 200 201 /** 202 * DBTableModelの情報を出力します。 203 * 204 * @og.rev 5.9.21.0 (2017/06/02) COLUMN追加 205 * 206 * @return テーブルのヘッダータグ文字列 207 */ 208 protected String getInfo( final int rowcount) { 209 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 210 211 buf.append( "\"INFO\":{" ) 212 .append( "\"COUNT\":").append( "\"" + rowcount + "\"" ) 213 .append( ",\"COLUMN\":" ).append( "\"" + getViewClms() + "\"") // 5.9.21.0 (2017/06/02) 214 .append( "}"); 215 return buf.toString(); 216 } 217 218 219 220 /** 221 * ビューで表示したカラムの一覧をカンマ区切りで返します。 222 * 223 * @og.rev 5.1.6.0 (2010/05/01) 新規追加 224 * @og.rev 5.8.6.0 (2015/04/03) オリジナルカラム対応 225 * 226 * @return ビューで表示したカラムの一覧 227 */ 228 @Override 229 public String getViewClms() { 230 if( viewClms == null ) { return super.getViewClms(); } 231 return viewClms; 232 } 233 234 /** 235 * フォーマットメソッドを使用できるかどうかを問い合わせます。 236 * 237 * @return 使用可能(true)/ 使用不可能(false) 238 */ 239 public boolean canUseFormat() { 240 return false; 241 } 242}