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