    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.json;
    017
    018
    019import java.util.ArrayList;
    020import java.util.Map;
    021
    022import org.opengion.fukurou.util.StringUtil;
    023import org.opengion.hayabusa.common.HybsSystemException;
    024import org.opengion.hayabusa.db.DBTableModelUtil;
    025import org.opengion.hayabusa.html.AbstractJsonReader;
    026
    027
    028/**
    029 * JSONからテーブルモデルへの変換を行う標準クラスです。
    030 * エンジンのVIEWタイプJSONから出力したデータ形式を入力とします。
    031 *
    032 * http://qiita.com/kenichi_nakamura/items/be73e37ec870e5845ed9
    033 * https://www.mkyong.com/java/how-to-convert-java-map-to-from-json-jackson/
    034 *
    035 * @og.group 画面表示
    036 * @og.rev 5.9.21.0 (2017/06/02)
    037 *
    038 * @version  5.0
    039 * @author       Takahashi Masakazu
    040 * @since    JDK7.0,
    041 */
    042public class JsonReader_Default extends AbstractJsonReader {
    043        //* このプログラムのVERSION文字列を設定します。   {@value} */
    044        private static final String VERSION = "5.9.21.0 (2017/06/02)" ;
    045
    046        private String datakey = "DATA"; // データ部分を示すキー名
    047
    048        /**
    049         * デフォルトコンストラクター
    050         *
    051         */
    052        public JsonReader_Default() {
    053        }
    054
    055        /**
    056         * JSONデータをDBTableModelに変換します。
    057         *
    058         * このdefaultクラスではエンジンのViewForm_JSON形式に対応します。
    059         * エンジンでの出力は以下のような形となっていますが、汎用性を上げるためにHEAD,INFOは利用せずにDATAだけを見るようにします。
    060         *
    061         * { "DATA":[{"カラム名":"値(1行目)",...},{"カラム名":"値(2行目)",...}]
    062         *       ,"HEAD":{"カラム名":"ラベル",...}
    063         *       ,"INFO":{{"COUNT":"件数","COLUMN":"出力カラム名（カンマ区切り）"} }
    064         *      }
    065         *
    066         *
    067         * @param   json JSON
    068         */
    069        @Override
    070        public void readDBTable( final String json ) {
    071                String[] names = null;
    072                String[] readData = null;
    073                int numberOfRows = 0;
    074
    075                table = DBTableModelUtil.newDBTable();
    076
    077                int skip = getSkipRowCount();
    078
    079                Map<String,Object> jsonmap = parse( json );
    080
    081                // datakeyで名称を変更できるようにしておく。
    082                // DATAは配列なのでListで返ってくる
    083                // これが行となる。
    084                ArrayList<Map<String,Object>> dataList = (ArrayList<Map<String,Object>>)jsonmap.get( datakey );
    085
    086                for(Map<String,Object> mp : dataList){
    087            // 最初にカラム名をセットする
    088                        if( names == null){
    089                                names = mp.keySet().toArray( new String[mp.size()] );
    090                                setTableDBColumn( names ) ;
    091            }
    092
    093                        if( skip > 0 ) { skip--; continue; }
    094
    095                        // 行データを追加
    096                        if( numberOfRows < getMaxRowCount() ) {
    097                                readData = readData( mp, names );
    098                                setTableColumnValues( readData );
    099                                numberOfRows ++ ;
    100                        }
    101                        else {
    102                                table.setOverflow( true );
    103                        }
    104        }
    105
    106                if( names == null ) {
    107                        String errMsg = "有効なデータが見つかりませんでした。";
    108                        throw new HybsSystemException( errMsg );
    109                }
    110        }
    111
    112
    113        /**
    114         * テーブルに登録する配列のJSONキー値を設定します。
    115         *
    116         * { "DATA":[{"カラム名":"値(1行目)", ...},{"カラム名":"値(2行目)",...}] }
    117         * 通常、上記のDATAをキー値としてテーブルに変換します。（エンジン標準出力）
    118         * エンジン以外が同じ用な形式の場合に、クラスを新規作成しなくても取り込めるようにするためキー値を外から設定可能にしておきます。
    119         *
    120         * @param strings dataKey設定
    121         */
    122        public void setOptions ( String... strings ){
    123                datakey = StringUtil.nval(strings[0],datakey);
    124        }
    125}