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 */
016 package org.opengion.hayabusa.html;
017
018 import org.opengion.hayabusa.common.HybsSystem;
019 import org.opengion.hayabusa.db.DBTableModel;
020 import org.opengion.fukurou.security.URLHashMap;
021 import org.opengion.fukurou.util.StringUtil;
022 import org.opengion.fukurou.util.Attributes;
023 import org.opengion.fukurou.util.XHTMLTag;
024 import org.opengion.fukurou.model.Formatter;
025
026 import java.util.Map;
027 import java.util.HashMap;
028 import java.util.List;
029 import java.util.ArrayList;
030 import java.util.Arrays ;
031
032 /**
033 * ViewLink インターフェース の実?ブジェクトです?
034 * これ?共通?スーパ?クラスとして ?表示フォー?例:HTML表示?に使?す?
035 *
036 * こ?クラスは、setter/getterメソ?の?ォルト実?提供して?す?
037 * ?表示フォー?対応したサブクラス上で, create() をオーバ?ライドして下さ??
038 *
039 * @og.rev 2.1.0.3 (2002/11/08) エンコード?開?終?ドレスを求める???修正
040 * @og.rev 4.0.0.0 (2005/08/31) 同?ラ???登録を許可します?
041 * @og.group 画面表示
042 *
043 * @version 4.0
044 * @author Kazuhiko Hasegawa
045 * @since JDK5.0,
046 */
047 public class ViewLink_LINK implements ViewMarker {
048 private static final String REQ_KEY = HybsSystem.URL_HASH_REQ_KEY ;
049
050 private static final int ACCS_LVL = HybsSystem.sysInt( "URL_ACCESS_SECURITY_LEVEL" );
051
052 private List<Attributes> markData = null; // 4.0.0 (2005/08/31)
053 // private Map<Integer,int[]> formMap_c = new HashMap<Integer,int[]>(); // 3.5.6.1 (2004/06/25)
054 // private Map<Integer,String[]> formMap_f = new HashMap<Integer,String[]>(); // 3.5.6.1 (2004/06/25)
055 private Map<Integer,Formatter> formMap = new HashMap<Integer,Formatter>();
056 private DBTableModel table = null;
057 private int[] markCmlNo = null;
058 private int[] isMark = null;
059 // 2.1.0.3 (2002/11/08) エンコード?開?終?ドレスを求める???修正
060 private int[] encodeIn = null; // 初期値:??
061 private int[] encodeOut = null; // 初期値:??
062 private static final int MARK_NULL = -1; // リンク未設?
063 private static final int MARK_TRUE = 1; // リンク作?
064 private static final int MARK_FALSE = 0; // リンク作?せず
065 // 3.5.2.0 (2003/10/20)
066 private String[] markKey = null;
067 private String[] markLists = null;
068 private int[] markListNo = null;
069
070 private boolean[] useURLCheck = null; // 4.3.7.1 (2009/06/08)
071 private String[] urlCheckUser= null; // 4.3.7.1 (2009/06/08)
072 private long[] urlCheckTime= null; // 4.3.7.1 (2009/06/08)
073
074 private Map<Integer,List<Integer>> clmMap = new HashMap<Integer,List<Integer>>(); // 4.0.0 (2005/08/31)
075
076 /**
077 * ?をクリア(初期?します?
078 *
079 * @og.rev 3.1.1.0 (2003/03/28) 同期メソ?(synchronized付き)を非同期に変更する?
080 * @og.rev 3.5.2.0 (2003/10/20) markLists,markListNo,markKey属?を追?
081 * @og.rev 3.5.6.1 (2004/06/25) formMap属?を追?
082 * @og.rev 4.3.7.1 (2009/06/08) URLチェ?属?追?
083 */
084 public void clear() {
085 markData = null; // 4.0.0 (2005/08/31)
086 // formMap_c = new HashMap<Integer,int[]>(); // 3.5.6.1 (2004/06/25)
087 // formMap_f = new HashMap<Integer,String[]>(); // 3.5.6.1 (2004/06/25)
088 formMap = new HashMap<Integer,Formatter>();
089 table = null;
090 isMark = null;
091 encodeIn = null;
092 encodeOut = null;
093 markKey = null;
094 markLists = null;
095 markListNo = null;
096 clmMap = new HashMap<Integer,List<Integer>>(); // 4.0.0 (2005/08/31)
097 useURLCheck = null; // 4.3.7.1 (2009/06/08)
098 urlCheckUser= null; // 4.3.7.1 (2009/06/08)
099 urlCheckTime= null; // 4.3.7.1 (2009/06/08)
100 }
101
102 /**
103 * カラ?対するリンクアトリビュートをセ?します?
104 *
105 * @og.rev 3.1.0.0 (2003/03/20) Hashtable を使用して??で?同期でも構わな??を?HashMap に置換え?
106 * @og.rev 3.1.1.0 (2003/03/28) 同期メソ?(synchronized付き)を非同期に変更する?
107 * @og.rev 4.0.0.0 (2005/08/31) 同?ラ???登録を許可します?
108 *
109 * @param attri リンクアトリビュー?
110 */
111 public void addAttribute( final Attributes attri ) {
112 if( markData == null ) { markData = new ArrayList<Attributes>(); }
113 markData.add( attri );
114 }
115
116 /**
117 * ?に DBTableModel をセ?します?
118 *
119 * @og.rev 2.1.0.3 (2002/11/08) エンコード?開?終?ドレスを求める???修正
120 * @og.rev 3.1.1.0 (2003/03/28) 同期メソ?(synchronized付き)を非同期に変更する?
121 * @og.rev 3.5.2.0 (2003/10/20) markLists,markListNo,markKey属?を追?
122 * @og.rev 3.5.5.0 (2004/03/12) xlink 属?によるリンク??作?方法??を追?
123 * @og.rev 3.5.6.1 (2004/06/25) DBTableModel の再設定に対応?
124 * @og.rev 3.5.6.2 (2004/07/05) linkFormat をパラメータで取得するよ?変更?
125 * @og.rev 3.8.1.1 (2005/11/21) linkFormat ?"[","]" をエンコードしてしまった?合に?戻します?
126 * @og.rev 4.0.0.0 (2005/08/31) 同?ラ???登録を許可します?
127 * @og.rev 4.3.7.1 (2009/06/08) URLチェ?機?追?
128 *
129 * @param tbl DBTableModelオブジェク?
130 */
131 public void setDBTableModel( final DBTableModel tbl ) {
132 table = tbl;
133 // String linkFormat = null;
134 int count = markData.size(); // 4.0.0 (2005/08/31)
135
136 isMark = new int[ count ];
137 markKey = new String[ count ];
138 markCmlNo = new int[ count ];
139 markLists = new String[ count ];
140 markListNo = new int[ count ];
141 encodeIn = new int[ count ];
142 encodeOut = new int[ count ];
143 useURLCheck = new boolean[ count ]; // 4.3.7.1 (2009/06/08)
144 urlCheckUser= new String[ count ]; // 4.3.7.1 (2009/06/08)
145 urlCheckTime= new long[ count ]; // 4.3.7.1 (2009/06/08)
146
147 Arrays.fill( isMark,MARK_FALSE ); // リンクの表示可否
148 Arrays.fill( markCmlNo,-1 ); // リンクの可否を判断するカラ?号
149 Arrays.fill( encodeIn ,10000 ); // 初期値:??
150 Arrays.fill( encodeOut,-1 ); // 初期値:??
151 Arrays.fill( useURLCheck, false ); // 4.3.7.1 (2009/06/08)
152 Arrays.fill( urlCheckTime, 0L ); // 4.3.7.1 (2009/06/08)
153
154 // 4.0.0 (2005/08/31) 同?ラ???登録を許可します?
155 for( int intKey=0; intKey<count; intKey++ ) {
156 Attributes attri = markData.get( intKey );
157
158 String column = attri.get( "column" );
159 int clm = table.getColumnNo( column );
160 List<Integer> list = clmMap.get( clm );
161 if( list == null ) { list = new ArrayList<Integer>(); }
162 list.add( intKey );
163 clmMap.put( clm,list );
164
165 String linkFormat = attri.get( "linkFormat" );
166 linkFormat = StringUtil.replace( linkFormat,"%5B","[" ); // 3.8.1.1 (2005/11/21)
167 linkFormat = StringUtil.replace( linkFormat,"%5D","]" ); // 3.8.1.1 (2005/11/21)
168
169 // makeFormat( intKey,linkFormat );
170 Formatter formatter = new Formatter( table );
171 formatter.setFormat( linkFormat );
172 formMap.put( intKey, formatter );
173
174 // URLエンコード用の?設定?こ??????タをURLエンコードする?
175 String[] format = formatter.getFormat();
176 boolean findHref = false;
177 for( int j=0; j<format.length; j++ ) {
178 if( format[j] != null && format[j].indexOf( "href" ) >= 0 ) { findHref = true; }
179 if( findHref && format[j].indexOf( '?' ) >= 0 ) { encodeIn[intKey] = j; }
180 if( findHref && format[j].indexOf( "\" " ) >= 0 ) { encodeOut[intKey] = j; findHref = false; }
181 }
182
183 // 4.3.7.1 (2009/06/08)
184 useURLCheck[intKey] = StringUtil.nval( attri.get( "useURLCheck" ), false );
185 urlCheckUser[intKey] = StringUtil.nval( attri.get( "urlCheckUser" ), null );
186 urlCheckTime[intKey] = StringUtil.nval( attri.get( "urlCheckTime" ), 0L );
187
188 makeOnLinkFormat( intKey,attri );
189 }
190 }
191
192 /**
193 * ??行?に対するマ?カー??を返します?
194 * こ?値は,すでにマ?カー??処?れて?為, RendererValue で
195 * 変換する??ありません?
196 * 引数の value はそ?カラ??値として利用されます?こ?値は、修飾済みの
197 * 値を与えることが可能です?
198 *
199 * @og.rev 2.1.0.3 (2002/11/08) エンコード?開?終?ドレスを求める???修正
200 * @og.rev 3.0.0.0 (2002/12/25) URLEncoder.encode ?StringUtil#urlEncode に置換え
201 * @og.rev 3.0.0.1 (2003/02/14) リンクの引数部?、RendererValue が適用される?を修正
202 * @og.rev 3.0.0.1 (2003/02/14) リンクの引数部?、RendererValue が適用される?を修正
203 * @og.rev 3.5.6.1 (2004/06/25) formMap属?を使用します?
204 * @og.rev 3.7.0.3 (2005/03/01) "{I}" ??に、行番号(row)を割り当てます?
205 * @og.rev 3.8.5.0 (2006/03/20) "{I}" ?"%7BI%7D" として、行番号(row)を割り当てます?
206 * @og.rev 4.3.7.1 (2009/06/08) URLチェ?機?追?
207 * @og.rev 4.3.7.4 (2009/07/01) 循環参?を解?
208 * @og.rev 5.2.3.0 (2010/12/01) URLのハッシュ?暗号化を行います?
209 *
210 * @param row ???
211 * @param clm ???
212 * @param value カラ??値
213 *
214 * @return row行,colum?のマ?カー??
215 */
216 public String getMarkerString( final int row,final int clm,final String value ) {
217 int intKey = isOnLink(row,clm) ;
218 if( intKey < 0 ) { return value; }
219
220 Formatter formatter = formMap.get( intKey );
221 int[] clmNo = formatter.getClmNos();
222 String[] format = formatter.getFormat();
223
224 // int[] clmNo = formMap_c.get( intKey );
225 // String[] format = formMap_f.get( intKey );
226
227 StringBuilder strLink = new StringBuilder( HybsSystem.BUFFER_LARGE );
228 int j=0;
229 String val ;
230 for( ; j<clmNo.length; j++ ) {
231 strLink.append( format[j] );
232 if( encodeIn[intKey] <= j && j < encodeOut[intKey] ) {
233 // val = table.getValue(row,clmNo[j]);
234 val = formatter.getValue(row,clmNo[j]);
235 strLink.append( StringUtil.urlEncode( val ) );
236 }
237 else if( clm == clmNo[j] ) {
238 strLink.append( value );
239 }
240 else {
241 // val = table.getValue(row,clmNo[j]);
242 val = formatter.getValue(row,clmNo[j]);
243 strLink.append( val );
244 }
245 }
246 strLink.append( format[j] );
247
248 // 3.8.5.0 (2006/03/27) "{I}" と そ?エンコード文?"%7BI%7D" に、行番号(row)を割り当てます?
249 String rtn = strLink.toString();
250 String sRow = String.valueOf( row );
251 rtn = StringUtil.replace( rtn,"{I}",sRow );
252 rtn = StringUtil.replace( rtn,"%7BI%7D",sRow );
253
254 // 4.3.7.1 (2009/06/08)
255 if( useURLCheck[intKey] ) {
256 // 4.3.7.4 (2009/07/01)
257 rtn = XHTMLTag.embedURLCheckKey( rtn, HybsSystem.URL_CHECK_KEY, urlCheckUser[intKey], urlCheckTime[intKey] );
258 }
259
260 // 5.2.3.0 (2010/12/01) URLのハッシュ?暗号?
261 if( ACCS_LVL == 2 ) {
262 // ACCS_LVL == 2 の場合?、外部のみ処?る?で、extOnly=true をセ?する?
263 rtn = URLHashMap.makeUrlChange( rtn,REQ_KEY,true );
264 }
265 else if( ACCS_LVL == 3 ) {
266 rtn = URLHashMap.makeUrlChange( rtn,REQ_KEY,false );
267 }
268
269 return rtn ;
270 }
271
272 /**
273 * リンクフォーマットを作?します?
274 *
275 * @og.rev 2.1.0.3 (2002/11/08) エンコード?開?終?ドレスを求める???修正
276 * @og.rev 3.5.6.1 (2004/06/25) formMap属?を使用します?
277 *
278 * @param intKey カラ?ーの番号
279 * @param fmt フォーマット文字?
280 */
281 // private void makeFormat( final int intKey,final String fmt ) {
282 // boolean findHref = false;
283 //
284 // StringTokenizer token = new StringTokenizer( fmt,"[]" );
285 // int count = token.countTokens() / 2 ;
286 // int[] clmNo = new int[ count ];
287 // String[] format = new String[ count+1 ];
288 // for( int j=0; j<count; j++ ) {
289 // format[j] = token.nextToken();
290 // clmNo[j] = table.getColumnNo( token.nextToken() );
291 //
292 // // URLエンコード用の?設定?こ??????タをURLエンコードする?
293 // if( format[j] != null && format[j].indexOf( "href" ) >= 0 ) { findHref = true; }
294 // if( findHref && format[j].indexOf( '?' ) >= 0 ) { encodeIn[intKey] = j; }
295 // if( findHref && format[j].indexOf( "\" " ) >= 0 ) { encodeOut[intKey] = j; findHref = false; }
296 // }
297 // format[count] = token.nextToken();
298 // formMap_c.put( intKey, clmNo );
299 // formMap_f.put( intKey, format );
300 //
301 // if( format[count] != null && format[count].indexOf( "href" ) >= 0 ) { findHref = true; }
302 // if( findHref && format[count].indexOf( '?' ) >= 0 ) { encodeIn[intKey] = count; }
303 // if( findHref && format[count].indexOf( "\" " ) >= 0 ) { encodeOut[intKey] = count; }
304 // }
305
306 /**
307 * リンクを張?張らな???カラ?号を求めます?
308 * また?int[列番号] isMark を?期化します?
309 *
310 * @og.rev 3.5.2.0 (2003/10/20) markLists,markListNo,markKey属?を追?
311 *
312 * @param intKey カラ?ーの番号
313 * @param attri アトリビュー?
314 */
315 private void makeOnLinkFormat( final int intKey,final Attributes attri ) {
316 String onMark = attri.get( "onLink" );
317 String markList = attri.get( "markList" );
318
319 // 3.5.6.0 (2004/06/18) nullポインタの参?外しバグの対?
320 // こ?ロジ?で値が設定済みであれば、以下?処??不要である?
321 isMark[intKey] = MARK_NULL;
322 if( onMark == null || onMark.length() == 0 ||
323 markList == null || markList.length() == 0 ) {
324 isMark[intKey] = MARK_FALSE;
325 return ; // 3.5.6.0 (2004/06/18)
326 }
327 else if( onMark.charAt( 0 ) != '[' && markList.charAt( 0 ) != '[' ) {
328 isMark[intKey] = ( markList.indexOf( onMark ) >= 0 ) ? MARK_TRUE : MARK_FALSE;
329 return ; // 3.5.6.0 (2004/06/18)
330 }
331
332 if( onMark.charAt( 0 ) == '[' ) {
333 markCmlNo[intKey] = table.getColumnNo( onMark.substring( 1,onMark.length()-1 ));
334 }
335 else {
336 markCmlNo[intKey] = -1;
337 markKey[intKey] = onMark ;
338 }
339
340 if( markList.charAt( 0 ) == '[' ) {
341 markListNo[intKey] = table.getColumnNo( markList.substring( 1,markList.length()-1 ));
342 }
343 else {
344 markListNo[intKey] = -1;
345 markLists[intKey] = markList;
346 }
347 }
348
349 /**
350 * リンクを張るかど?を判断します?
351 * int[列番号] isMark には?未設?FALSE TRUE の状態を持っており?
352 * 列でリンクを張る状態が固定?場?例えば,onLink属?がデフォル?"true" の場?
353 * カラ?関係なく?同じ値を返すときに、使用します?
354 *
355 * @og.rev 3.5.2.0 (2003/10/20) markLists,markListNo,markKey属?を追?
356 * @og.rev 3.5.4.0 (2003/11/25) onMark ,markList ?null(また?ゼロストリング)の場合?、false とする?
357 * @og.rev 4.0.0.0 (2005/08/31) 同?ラ???登録を許可します?
358 *
359 * @param row 列番号
360 * @param clm カラ?ーの名称
361 *
362 * @return 処?るリスト番号?1 の場合?、該当な?
363 */
364 private int isOnLink( final int row,final int clm ) {
365
366 List<Integer> list = clmMap.get( clm );
367 if( list == null ) { return -1; }
368
369 for( int i=0; i<list.size(); i++ ) {
370 int intKey = list.get( i );
371 if( isMark[intKey] != MARK_NULL ) {
372 if( isMark[intKey] == MARK_TRUE ) { return intKey; }
373 else { continue; }
374 }
375
376 String onMark ;
377 if( markCmlNo[intKey] < 0 ) { onMark = markKey[intKey] ; }
378 else { onMark = table.getValue( row,markCmlNo[intKey] ); }
379
380 // 3.5.4.0 (2003/11/25) 追?
381 if( onMark == null || onMark.length() == 0 ) { continue; }
382
383 String markList ;
384 if( markListNo[intKey] < 0 ) { markList = markLists[intKey] ; }
385 else { markList = table.getValue( row,markListNo[intKey] ); }
386
387 // 3.5.4.0 (2003/11/25) 修正
388 if( markList == null || markList.length() == 0 ) { continue; }
389
390 if( markList.indexOf( onMark ) >= 0 ) { return intKey; }
391 }
392 return -1;
393 }
394 }