    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.develop;
    017
    018import java.util.List;
    019import java.util.Map;
    020import java.util.Set;
    021import java.util.HashSet;
    022
    023import org.opengion.hayabusa.develop.AbstractJspCreate;
    024import org.opengion.hayabusa.develop.JspConvertEntity;
    025import org.opengion.fukurou.xml.OGElement;
    026import org.opengion.fukurou.xml.OGNode;
    027import org.opengion.fukurou.xml.OGNodeType;
    028
    029/**
    030 * query.jspの&lt;og:column&gt;タグを作成します。
    031 * column タグは、部分置換ではなく、table 部分からの全面置換です。（部分置換は難しかったので）
    032 * table には、tr を配置し、column タグを、TD_COUNT（初期値=3）の繰り返し数だけ配置します。
    033 * それを超えると、新しい tr に書き出していきます。
    034 * TR_COUNT（初期値=2）を超える検索条件は、og:hideMenu として、作成します。
    035 *
    036 * ●使用例
    037 *      &lt;table summary = "layout" &gt;
    038 *          &lt;tr&gt;
    039 *              &lt;og:column
    040 *                  name       = column.getColumnName()
    041 *                  defaultVal = column.getDefaultValue()
    042 *                  must       = "true"         ("1".equals( column.getMust() ))
    043 *                  clazz      = "aimai"        (ope.startsWith( "lk" ))
    044 *              /&gt;
    045 *              &lt;og:column
    046 *                  ・・・・
    047 *              /&gt;
    048 *          &lt;/tr&gt;
    049 *          &lt;tr&gt;
    050 *                  ・・・・
    051 *          &lt;/tr&gt;
    052 *      &lt;/table&gt;
    053 *
    054 * @og.rev 5.6.1.2 (2013/02/22) 文字列連結から、XML処理するように変更します。
    055 *
    056 * @version  5.0
    057 * @author       Kazuhiko Hasegawa
    058 * @since    JDK7.0,
    059 */
    060public class JspCreate_COLUMN extends AbstractJspCreate {
    061        //* このプログラムのVERSION文字列を設定します。   {@value} */
    062        private static final String VERSION = "5.6.4.4 (2013/05/31)" ;
    063
    064        public static final int TD_COUNT = 3 ;          // tdタグを繰り返す数
    065        public static final int TR_COUNT = 2 ;          // trタグを繰り返す数
    066
    067        private List<JspConvertEntity> QUERY_ROWS ;
    068        private boolean IS_NULL ;
    069
    070        /**
    071         * 初期化メソッド
    072         *
    073         * 内部で使用する JspConvertEntity の リスト のマップを受け取り、初期化を行います。
    074         *
    075         * @og.rev 5.6.4.4 (2013/05/31) 検索カラムは、名称で重複している場合は、片方だけでよい。
    076         *
    077         * @param       master  JspConvertEntityのリストのマップ
    078         */
    079        @Override
    080        protected void init( final Map<String,List<JspConvertEntity>> master ) {
    081                QUERY_ROWS = master.get("QUERY");
    082                IS_NULL = !isNotEmpty( QUERY_ROWS );
    083                KEY  = "table";
    084                NAME = "query";
    085
    086                // 検索カラムは、名称で重複している場合は、片方だけでよい。
    087                if( !IS_NULL ) {
    088                        Set<String> keys = new HashSet<String>();
    089                        int size = QUERY_ROWS.size();
    090                        int idx  = 0;
    091                        while( idx < size ) {
    092                                String key = QUERY_ROWS.get(idx).getColumnName();
    093                                if( keys.add( key ) ) {                         // 正常にセットできれば、true
    094                                        idx++ ;
    095                                }
    096                                else {                                                          // すでに同じキーが存在する場合
    097                                        QUERY_ROWS.remove(idx);
    098                                        size-- ;
    099                                }
    100                        }
    101                }
    102        }
    103
    104        /**
    105         * JSPに出力するタグの内容を作成します。
    106         * 引数より作成前のタグの属性内容を確認するする事が出来ます。
    107         *
    108         * @og.rev 5.2.1.0 (2010/10/01) メソッドの引数を、OGAttributes から OGElement に変更します。
    109         * @og.rev 5.2.1.0 (2010/10/01) 名前空間を、og 決め打ちから、引数を使用するように変更します。
    110         * @og.rev 5.6.1.2 (2013/02/22) XML処理するように変更します。
    111         * @og.rev 5.6.4.4 (2013/05/31) hideMenu の対応
    112         *
    113         * @param ele OGElementエレメントオブジェクト
    114         * @param       nameSpace       このドキュメントのnameSpace( og とか mis とか )
    115         *
    116         * @return      変換された文字列
    117         * @throws Throwable 変換時のエラー
    118         */
    119        @Override
    120        protected String execute( final OGElement ele , final String nameSpace )  throws Throwable {
    121                if( IS_NULL ) { return ""; }
    122
    123                // table タグの親タグが、hideMenu の場合は、処理しません。
    124                OGNode paraNode = ele.getParentNode() ;
    125                if( paraNode != null && paraNode.getNodeType() == OGNodeType.Element && "og:hideMenu".equals( ((OGElement)paraNode).getTagName() ) ) {
    126                        return "";
    127                }
    128
    129                // 既存の設定値をすべて削除します。ホントは自動登録した分だけを削除すべき。
    130                OGElement tblEle  = new OGElement( "table" );
    131                tblEle.addAttr( "summary","layout" );
    132
    133                OGElement tr = null;
    134                for( int i=0; i<QUERY_ROWS.size() && i<(TD_COUNT*TR_COUNT); i++ ) {
    135                        JspConvertEntity column = QUERY_ROWS.get(i);
    136                        if( i%TD_COUNT == 0 ) {
    137                                tr = new OGElement( "tr" );
    138                                tblEle.addNode( tr );
    139                        }
    140
    141                        tr = trElement( tr,column );
    142                }
    143
    144                return tblEle.getText( 0 );
    145        }
    146
    147        /**
    148         * TRエレメントにカラムタグを追加していきます。
    149         * 行列の判定処理を上位で行い、ここでは、カラムタグを追加する処理に専念します。
    150         *
    151         * @og.rev 5.6.4.4 (2013/05/31) hideMenu の対応
    152         *
    153         * @param       tr              OGElementエレメントオブジェクト
    154         * @param       column  カラムタグの元情報
    155         *
    156         * @return      カラムタグが追加されたTRエレメント
    157         */
    158        protected OGElement trElement( final OGElement tr , final JspConvertEntity column ) {
    159                OGElement clm  = new OGElement( "og:column" );
    160                clm.addAttr( "name",column.getColumnName() );
    161
    162                if ( column.getDefaultValue() != null && column.getDefaultValue().trim().length() > 0) {
    163                        clm.addAttr( "defaultVal",column.getDefaultValue() );
    164                }
    165                if ( "1".equals( column.getMust() )){
    166                        clm.addAttr( "must","true" );
    167                }
    168                String ope = column.getRemarks();
    169                if( ope != null && ope.startsWith( "lk" ) ) {
    170                        clm.addAttr( "clazz","aimai" );
    171                }
    172
    173                tr.addNode( clm );
    174
    175                return tr ;
    176        }
    177}