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