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の<og:column>タグを作成します。 031 * column タグは、部分置換ではなく、table 部分からの全面置換です。(部分置換は難しかったので) 032 * table には、tr を配置し、column タグを、TD_COUNT(初期値=3)の繰り返し数だけ配置します。 033 * それを超えると、新しい tr に書き出していきます。 034 * TR_COUNT(初期値=2)を超える検索条件は、og:hideMenu として、作成します。 035 * 036 * ●使用例 037 * <table summary = "layout" > 038 * <tr> 039 * <og:column 040 * name = column.getColumnName() 041 * defaultVal = column.getDefaultValue() 042 * must = "true" ("1".equals( column.getMust() )) 043 * clazz = "aimai" (ope.startsWith( "lk" )) 044 * /> 045 * <og:column 046 * ・・・・ 047 * /> 048 * </tr> 049 * <tr> 050 * ・・・・ 051 * </tr> 052 * </table> 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 = "6.3.9.1 (2015/11/27)" ; 063 064 public static final int TD_COUNT = 3 ; // tdタグを繰り返す数 065 public static final int TR_COUNT = 2 ; // trタグを繰り返す数 066 067 // 6.3.9.1 (2015/11/27) Variables should start with a lowercase character(PMD) 068 private List<JspConvertEntity> queryROWS ; 069 private boolean isNULL ; 070 071 /** 072 * コンストラクター 073 * 074 * インスタンス構築時に、タグ名(key)とファイル名(names)を指定します。 075 * 076 * @og.rev 6.3.9.1 (2015/11/27) コンストラクタを用意して、KEY,NAME をセットするように変更します。 077 */ 078 public JspCreate_COLUMN() { 079 super( "table" , "query" ); 080 } 081 082 /** 083 * タグ名とファイル名を指定するコンストラクター 084 * 085 * インスタンス構築時に、タグ名(key)とファイル名(names)を指定します。 086 * これは、JspCreate_HIDEMENU が、このクラスを継承しているため、用意しました。 087 * 088 * @og.rev 6.3.9.1 (2015/11/27) コンストラクタを用意して、KEY,NAME をセットするように変更します。 089 * 090 * @param key タグ名の指定(og:XXXX , :XXX , XXX いづれの形式でも可) 091 * @param names 処理対象のファイル名(複数のファイル名をCSV形式で指定可能) 092 */ 093 protected JspCreate_COLUMN( final String key , final String names ) { 094 super( key , names ); 095 } 096 097 /** 098 * 初期化メソッド 099 * 100 * 内部で使用する JspConvertEntity の リスト のマップを受け取り、初期化を行います。 101 * 102 * @og.rev 5.6.4.4 (2013/05/31) 検索カラムは、名称で重複している場合は、片方だけでよい。 103 * 104 * @param master JspConvertEntityのリストのマップ 105 */ 106 @Override 107 protected void init( final Map<String,List<JspConvertEntity>> master ) { 108 queryROWS = master.get("QUERY"); // 6.3.9.1 (2015/11/27) 109 isNULL = !isNotEmpty( queryROWS ); // 6.3.9.1 (2015/11/27) 110 111 // 検索カラムは、名称で重複している場合は、片方だけでよい。 112 if( !isNULL ) { // 6.3.9.1 (2015/11/27) 113 final Set<String> keys = new HashSet<>(); 114 int size = queryROWS.size(); 115 int idx = 0; 116 while( idx < size ) { 117 final String key = queryROWS.get(idx).getColumnName(); // 6.3.9.1 (2015/11/27) 118 if( keys.add( key ) ) { // 正常にセットできれば、true 119 idx++ ; 120 } 121 else { // すでに同じキーが存在する場合 122 queryROWS.remove(idx); // 6.3.9.1 (2015/11/27) 123 size-- ; 124 } 125 } 126 } 127 } 128 129 /** 130 * JSPに出力するタグの内容を作成します。 131 * 引数より作成前のタグの属性内容を確認するする事が出来ます。 132 * 133 * @og.rev 5.2.1.0 (2010/10/01) メソッドの引数を、OGAttributes から OGElement に変更します。 134 * @og.rev 5.2.1.0 (2010/10/01) 名前空間を、og 決め打ちから、引数を使用するように変更します。 135 * @og.rev 5.6.1.2 (2013/02/22) XML処理するように変更します。 136 * @og.rev 5.6.4.4 (2013/05/31) hideMenu の対応 137 * 138 * @param ele OGElementエレメントオブジェクト 139 * @param nameSpace このドキュメントのnameSpace( og とか mis とか ) 140 * 141 * @return 変換された文字列 142 * @og.rtnNotNull 143 * @throws Throwable 変換時のエラー 144 */ 145 @Override 146 protected String execute( final OGElement ele , final String nameSpace ) throws Throwable { 147 if( isNULL ) { return ""; } 148 149 // table タグの親タグが、hideMenu の場合は、処理しません。 150 final OGNode paraNode = ele.getParentNode() ; 151 // 6.0.2.5 (2014/10/31) refactoring: getNodeType でチェックしているので間違いはないが、findBugs対応 152 if( paraNode != null && paraNode.getNodeType() == OGNodeType.Element && 153 paraNode instanceof OGElement && 154 "og:hideMenu".equals( ((OGElement)paraNode).getTagName() ) ) { 155 return ""; 156 } 157 158 // 既存の設定値をすべて削除します。ホントは自動登録した分だけを削除すべき。 159 final OGElement tblEle = new OGElement( "table" ); 160 tblEle.addAttr( "summary","layout" ); 161 162 OGElement tr = null; 163 for( int i=0; i<queryROWS.size() && i<(TD_COUNT*TR_COUNT); i++ ) { 164 final JspConvertEntity column = queryROWS.get(i); 165 if( i%TD_COUNT == 0 ) { 166 tr = new OGElement( "tr" ); 167 tblEle.addNode( tr ); 168 } 169 170 tr = trElement( tr,column ); 171 } 172 173 return tblEle.getText( 0 ); 174 } 175 176 /** 177 * TRエレメントにカラムタグを追加していきます。 178 * 行列の判定処理を上位で行い、ここでは、カラムタグを追加する処理に専念します。 179 * 180 * @og.rev 5.6.4.4 (2013/05/31) hideMenu の対応 181 * 182 * @param tr OGElementエレメントオブジェクト 183 * @param column カラムタグの元情報 184 * 185 * @return カラムタグが追加されたTRエレメント 186 * @og.rtnNotNull 187 */ 188 protected OGElement trElement( final OGElement tr , final JspConvertEntity column ) { 189 final OGElement clm = new OGElement( "og:column" ); 190 clm.addAttr( "name",column.getColumnName() ); 191 192 if( column.getDefaultValue() != null && column.getDefaultValue().trim().length() > 0) { 193 clm.addAttr( "defaultVal",column.getDefaultValue() ); 194 } 195 if( "1".equals( column.getMust() )){ 196 clm.addAttr( "must","true" ); 197 } 198 final String ope = column.getRemarks(); 199 if( ope != null && ope.startsWith( "lk" ) ) { 200 clm.addAttr( "clazz","aimai" ); 201 } 202 203 tr.addNode( clm ); 204 205 return tr ; 206 } 207}