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.hayabusa.taglib; 017 018import static org.opengion.fukurou.util.StringUtil.nval ; 019import org.opengion.hayabusa.common.HybsSystem; 020import org.opengion.hayabusa.common.HybsSystemException; 021import org.opengion.hayabusa.io.ChartCreate; 022import org.opengion.hayabusa.io.ChartDataset; 023import org.opengion.hayabusa.io.HybsURLTagFragmentGenerator; 024 025import java.io.File; 026import java.io.IOException; 027import java.io.ObjectOutputStream; 028import java.io.ObjectInputStream; 029import java.util.List; 030import java.util.ArrayList; 031import java.util.Map ; 032import java.util.HashMap ; 033 034import org.jfree.chart.JFreeChart; 035import org.jfree.chart.ChartUtilities; 036 037import org.jfree.chart.ChartRenderingInfo; 038import org.jfree.chart.entity.StandardEntityCollection; 039import org.jfree.chart.imagemap.ImageMapUtilities; 040import org.jfree.chart.imagemap.StandardToolTipTagFragmentGenerator; 041import org.jfree.chart.imagemap.ToolTipTagFragmentGenerator; 042import org.jfree.chart.imagemap.URLTagFragmentGenerator; 043 044/** 045 * BODY部に指定のSQLの検索結果をチャート(円、棒、線)で表示するタグです。 046 * 047 * チャート化には、JFreeChart (http://www.jfree.org/jfreechart/) を使用しています。 048 * チャートの種類は、chartDataset タグで指定します。これは、複数の異なるチャートを 049 * 合成表示する機能が、JFreeChart にある為です。ただし、専門的には、CategoryDataset のみ 050 * いまは、合成が可能です。 051 * 処理の実行にあたり、キャッシュが有効(useCache="true")であれば、キャッシュデータを 052 * 使用します。キャッシュは、masterKey 属性で指定されたキーワード毎に、JFreeChart 053 * オブジェクトをキャッシュします。また、seriesPikup 違いの場合は、再検索せずに、 054 * キャッシュが使用できます。さらに、seriesPikup が同じ場合(masterKey も同じ)は、 055 * すでに画像ファイルが作成済みなので、画像ファイルのみを返します。 056 * 057 * 各属性は、{@XXXX} 変数が使用できます。 058 * これは、ServletRequest から、XXXX をキーに値を取り出し,この変数に割り当てます。 059 * つまり、このXXXXをキーにリクエストすれば、この変数に値をセットすることができます。 060 * 061 * @og.formSample 062 * ●形式:<og:chartCreate title="…" … /> 063 * ●body:あり(EVAL_BODY_BUFFERED:BODYを評価し、{@XXXX} を解析します) 064 * 065 * ●Tag定義: 066 * <og:chartCreate 067 * title 【TAG】チャートのタイトルをセットします 068 * width 【TAG】チャートの横幅をセットします(初期値:200) 069 * height 【TAG】チャートの縦幅をセットします(初期値:200) 070 * domainLabel 【TAG】チャートのドメインラベルを指定します 071 * showLegend 【TAG】チャートの凡例の表示可否[true/false]をセットします(初期値:true[表示する]) 072 * rectangleEdge 【TAG】チャートの表示箇所を、[TOP/BOTTOM/RIGHT/LEFT]で指定します(初期値:BOTTOM) 073 * plotOrientation 【TAG】チャートのプロット(Plot)表示方向を、[VERTICAL(or V),HORIZONTAL(or H)]で指定します 074 * chartBackColor 【TAG】チャートの背景色を指定します 075 * plotBackColor 【TAG】チャートの描画領域の色を指定します 076 * rotationLabel 【TAG】チャートのカテゴリーラベルの方向を指定します[1:180度 、2:90度 、3:60度 、4:45度 、6:30度 ・・・ ](初期値:3:60度) 077 * useVerticalLabels 【TAG】横軸ラベルの表示向きを縦にするかどうか[false/true]を指定します(初期値:false) 078 * domainMarker 【TAG】チャートの横軸の値(ドメイン)に合致する位置にマーカーラインを設定します 079 * useDomainLabel 【TAG】横軸ラベルのラベルを表示するかどうか[true/false]を指定します(初期値:true) 080 * useMarkerLabel 【TAG】マーカーラインに、その設定値を表示するかどうか[true/false]を指定します(初期値:true) 081 * useCache 【TAG】JFreeChart オブジェクトをキャッシュするかどうか[true/false]を指定します(初期値:false) 082 * masterKey 【TAG】キャッシュ用マスタキーを指定します 083 * seriesPikup 【TAG】複数シリーズのピックアップを行う場合のシリーズ番号を指定します 084 * imageMapUrl 【TAG】クリッカブル・マップ用URLを指定します 085 * imageMapTarget 【TAG】クリッカブル・マップ用TARGETを指定します 086 * categoryMargin 【TAG】カテゴリマージン(0.0〜1.0)を指定します 087 * lowerMargin 【TAG】下方マージン(0.0〜1.0)を指定します 088 * upperMargin 【TAG】上方マージン(0.0〜1.0)を指定します 089 * useDomainLine 【TAG】横軸のグリッド表示有無(垂直線)を指定します(初期値:false) 090 * domainLineColor 【TAG】横軸のグリッド線の色を指定します 091 * categorySkip 【TAG】横軸ラベルをスキップする間隔を指定します 092 * categoryCutNo 【TAG】横軸ラベルの文字位置指定のキーブレイクを指定します 093 * categoryAnchor 【TAG】横軸のグリッド(垂直線)の書き出し位置(START,MIDDLE,END)を指定します 094 * useRangeLine 【TAG】縦軸のグリッド表示有無(水平線)を指定します(初期値:true) 095 * useToolTip 【TAG】ツールチップスの使用可否[true:利用する/false:利用しない]を指定します(初期値:false) 096 * rangeLineColor 【TAG】縦軸のグリッド線の色を指定します 097 * rangeSkip 【TAG】縦軸のグリッド線(水平線)をスキップする間隔を指定します 098 * dateAxisFormat 【TAG】Time,XYTime Polt関係の時間軸を表す場合のフォーマットを指定します(初期値:MM/dd) 099 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 100 * > ... Body ... 101 * </og:chartCreate> 102 * 103 * ●使用例 104 * <og:chartCreate 105 * title = "JFreeChart Test" チャートタイトル 106 * domainLabel = "ドメインラベル" 横軸ラベル 107 * width = "200" チャート表示幅 108 * height = "200" チャート表示高さ 109 * showLegend = "[true/false]" 凡例の表示可否[true/false] 110 * rectangleEdge = "[TOP|BOTTOM|RIGHT|LEFT]" 凡例の表示箇所 111 * plotOrientation = "[VERTICAL|HORIZONTAL]" チャートの軸表示方向 112 * chartBackColor = "WHITE" 背景色 113 * plotBackColor = "LIGHT_GRAY" 描画領域色 114 * rotationLabel = "3" 横軸ラベルの傾き 115 * useVerticalLabels = "false" 横軸ラベルの向き(true:縦/false:横) 116 * domainMarker = "KING" 横軸のマーカーライン(縦棒) 117 * useMarkerLabel = "[true/false]" マーカーラインの文字有無 118 * useDomainLabel = "[true/false]" 横軸ラベルの表示有無 119 * categorySkip = "3" 横軸ラベルをスキップする間隔 120 * categoryCutNo = "6" 横軸ラベルの文字位置指定のキーブレイク 121 * categoryAnchor = "[START|MIDDLE|END]" 横軸のグリッド(垂直線)の書き出し位置 122 * useDomainLine = "[false/true]" 横軸のグリッド表示有無(垂直線) 123 * domainLineColor = "LIGHT_GRAY" 横軸のグリッド線の色 124 * useRangeLine = "[true/false]" 縦軸のグリッド表示有無(水平線) 125 * rangeLineColor = "LIGHT_GRAY" 縦軸のグリッド線の色 126 * rangeSkip = "-5" 縦軸のグリッド(水平線)をスキップする間隔 127 * useCache = "[false|true]" キャッシュの有無 128 * masterKey = "{@XXXX}" キャッシュ用マスタキー 129 * seriesPikup = "2" ピックアップするシリーズNo 130 * imageMapUrl = "link.jsp,BLOCK" クリッカブル・マップ用URL 131 * imageMapTarget = "CONTENTS" クリッカブル・マップ用TARGET 132 * categoryMargin = "[0.0〜1.0]" カテゴリマージン(0.0〜1.0) 133 * lowerMargin = "[0.0〜1.0]" 下方マージン(0.0〜1.0) 134 * upperMargin = "[0.0〜1.0]" 上方マージン(0.0〜1.0) 135 * > 136 * <og:chartDataset 137 * chartType = "{@chartType}" 138 * valueLabel = "{@valueLabel}" 139 * lowerBound = "{@lowerBound}" 140 * upperBound = "{@upperBound}" 141 * markValues = "{@markValues}" 142 * markColors = "{@markColors}" 143 * useGradient = "{@useGradient}" 144 * shapesVisible = "{@shapesVisible}" 145 * useDottedLine = "{@useDottedLine}" 146 * seriesColors = "{@seriesColors}" 147 * valueLabelsVisible = "[true|false]" 148 * valueMarksVisible = "[true|false]" 149 * > 150 * {@SQL} 151 * </og:chartDataset> 152 * </og:chartCreate> 153 * 154 * 複数のグラフを重ね合わせる場合は、chartDataset タグを chartCreate のBODY部に 155 * 複数記述します。 156 * <og:chartCreate 157 * title = "{@title}" 158 * domainLabel = "{@domainLabel}" 159 * width = "{@width}" 160 * height = "{@height}" > 161 * <og:chartDataset 162 * chartType = "{@chartType1}" 163 * valueLabel = "{@valueLabel1}" 164 * lowerBound = "{@lowerBound1}" 165 * upperBound = "{@upperBound1}" 166 * markValues = "{@markValues1}" 167 * markColors = "{@markColors1}" 168 * > 169 * {@SQL1} 170 * </og:chartDataset> 171 * <og:chartDataset 172 * chartType = "{@chartType2}" 173 * valueLabel = "{@valueLabel2}" 174 * lowerBound = "{@lowerBound2}" 175 * upperBound = "{@upperBound2}" 176 * markValues = "{@markValues2}" 177 * markColors = "{@markColors2}" 178 * > 179 * {@SQL2} 180 * </og:chartDataset> 181 * </og:chartCreate> 182 * 183 * rectangleEdge属性 は、凡例の表示箇所を示す、RectangleEdge クラスの値を設定します。 184 * [rectangleEdge属性] 185 * TOP 上側 186 * BOTTOM 下側 187 * RIGHT 右側 188 * LEFT 左側 189 * 190 * plotOrientation属性 は、チャートの軸表示方向を設定します。 191 * [renderer属性] 192 * VERTICAL 縦方向 193 * HORIZONTAL 横方向 194 * 195 * @og.group 画面表示 196 * 197 * @version 0.9.0 2007/06/19 198 * @author Nakamura 199 * @since JDK1.4, 200 */ 201public class ChartCreateTag extends CommonTagSupport { 202 //* このプログラムのVERSION文字列を設定します。 {@value} */ 203 private static final String VERSION = "5.6.4.3 (2013/05/24)" ; 204 205 private static final long serialVersionUID = 564320130524L ; // 5.6.4.3 (2013/05/24) 206 207 private static final String FILE_URL = HybsSystem.sys( "CHART_TEMP_DIR" ); 208 209 private List<ChartDataset> chartDataset = null; 210 211 private static final String CHART_CACHE_KEY = HybsSystem.JF_CHART_CACHE_KEY; 212 213 private String title = null; 214 private int width = 200; 215 private int height = 200; 216 private String domainLabel = null; 217 private boolean showLegend = true; 218 private String rectangleEdge = "BOTTOM"; 219 private String plotOrientation = "VERTICAL"; 220 private String chartBackColor = null; // 背景色の設定 221 private String plotBackColor = null; // 描画領域の設定 222 private int rotationLabel = 3; // 横軸ラベルの傾き(1:180度 、2:90度 、3:60度 、4:45度 、6:30度 ・・・ ) 223 private boolean useVerticalLabels = false; // 5.6.4.3 (2013/05/24) 横軸ラベルの表示向き(横書き:false/縦書き:true) 224 private String domainMarker = null; // 横軸のマーカーライン 225 private boolean useDomainLabel = true; // 横軸ラベルの表示有無 226 private boolean useMarkerLabel = true; // マーカーライン時の文字有無 227 private boolean useCache = false; // JFreeChart オブジェクトをキャッシュするかどうか 228 private int seriesPikup = -1; // ピックアップするシリーズ番号 229 private String masterKey = null; // キャッシュ用マスタキー 230 private transient Map<String,ChartCache> map = null; // キャッシュ用マップ 231 private transient ChartCache cache = null; // キャッシュ 232 private String imgTag = null; // キャッシュ用画像ファイル 233 private String imageMapUrl = null; // クリッカブル・マップ用URL 234 private String imageMapTarget = null; // クリッカブル・マップ用TARGET 235 // 3.5.4.7 (2004/02/06) 実行時間測定用のDIV要素を出力します。 236 private long dyStart = 0; 237 238 // 4.0.2.0 (2007/12/20) 239 private String categoryMargin = null; // カテゴリマージン(0.0〜1.0) 240 private String lowerMargin = null; // 下方マージン(0.0〜1.0) 241 private String upperMargin = null; // 上方マージン(0.0〜1.0) 242// private String[] shapeColors = null; // 4.0.3.0 (2008/01/07) データ毎にShapeを切り替える時の色指定 243 244 private boolean useDomainLine = false; // 4.0.3.0 (2008/01/07) 横軸のグリッド表示有無(垂直線) 245 private String domainLineColor = null; // 4.0.3.0 (2008/01/07) 横軸のグリッド線の色 246 private boolean useRangeLine = true; // 4.0.3.0 (2008/01/07) 縦軸のグリッド表示有無(水平線) 247 private String rangeLineColor = null; // 4.0.3.0 (2008/01/07) 縦軸のグリッド線の色 248 private int categorySkip = 1; // 4.0.3.0 (2008/01/07) 横軸ラベルをスキップする間隔 249 private int categoryCutNo = -1; // 4.1.1.0 (2008/02/04) 横軸ラベルの文字位置指定のキーブレイク 250 private String categoryAnchor = null; // 4.1.1.0 (2008/02/14) 横軸のグリッド(垂直線)の書き出し位置(START,MIDDLE,END) 251// private double lineOffset = 0.0; // 4.1.1.0 (2008/02/04) DomainLineの書き出し位置 252 private int rangeSkip = 1; // 4.1.1.0 (2008/02/04) 縦軸のグリッドをスキップする間隔 253 private boolean useToolTip = false; // 4.3.1.0 (2008/08/09) ツールチップスを利用するか 254 255 private String dateAxisFormat = "MM/dd"; // 5.6.1.0 (2013/02/01) Time,XYTime Polt関係の時間軸を表す場合のフォーマット 256 257 /** 258 * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。 259 * 260 * @return 後続処理の指示 261 */ 262 @SuppressWarnings(value={"unchecked"}) 263 @Override 264 public int doStartTag() { 265 dyStart = System.currentTimeMillis(); 266 267 if( useCache ) { 268 // キャッシュから、取り出す。 269 map = (Map<String,ChartCache>)getSessionAttribute( CHART_CACHE_KEY ); 270 if( map != null ) { 271 cache = map.get( masterKey ); 272 if( cache != null && cache.isAvailable() ) { // キャッシュ有効 273 String subKey = String.valueOf( seriesPikup ); 274 // キャッシュから、イメージを取り出す。存在しなければ、null 275 imgTag = cache.getFileAddress( subKey ); 276 return(SKIP_BODY); // キャッシュ使用 277 } 278 } 279 } 280 281 return EVAL_BODY_BUFFERED; 282 } 283 284 /** 285 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 286 * 287 * @og.rev 5.2.1.0 (2010/10/01) debugPrint() メソッドの処理条件見直し 288 * 289 * @return 後続処理の指示 290 */ 291 @Override 292 public int doEndTag() { 293// if( isDebug() ) { debugPrint(); } 294 debugPrint(); // 5.2.1.0 (2010/10/01) debugPrint() メソッド自体に、isDebug() が組み込まれている。 295 296 long queryEnd = System.currentTimeMillis(); 297 jspPrint( "<div id=\"queryTime\" value=\"" + (queryEnd-dyStart) + "\"></div>" ); // 3.5.6.3 (2004/07/12) 298 299 // 画像ファイルのキャッシュがあれば、それを返す。 300 if( imgTag != null ) { 301 jspPrint( imgTag ); 302 } 303 else { 304 JFreeChart chart ; 305 if( cache != null ) { 306 // キャッシュがあれば、チャートを取り出す。 307 chart = cache.getJFreeChart() ; 308 // チャートは、変更(modifying)のみ行う。 309 chart = ChartCreate.modifying( chart,seriesPikup ); 310 } 311 else { 312 // チャートがない、または、無効になっている場合は、新規作成する。 313 ChartCreate chartCreate = create(); 314 chart = chartCreate.getChart(); 315 } 316 317 File file = getTempFile( FILE_URL ); 318 try { 319 // クリッカブル・マップ 320 String fname = file.getName(); 321 String filename = getContextPath() + "/" + FILE_URL + fname; 322 String keyword = fname.substring( 0, fname.length() - 4 ); // ".png" 分を削除 323 ToolTipTagFragmentGenerator toolTipGen = null; 324 URLTagFragmentGenerator urlGen = null; 325 // 4.3.1.0 (2008/08/09) ツールチップスのマップ情報取得 326 if( useToolTip ) { 327 toolTipGen = new StandardToolTipTagFragmentGenerator(); 328 } 329 if( imageMapUrl != null ) { 330 urlGen = new HybsURLTagFragmentGenerator( imageMapTarget ); 331 } 332 if( ( imageMapUrl != null ) || ( useToolTip ) ) { 333 ChartRenderingInfo objCri = new ChartRenderingInfo( new StandardEntityCollection() ); 334 ChartUtilities.saveChartAsPNG( file, chart, width, height, objCri ); 335 imgTag = ImageMapUtilities.getImageMap( keyword, objCri, toolTipGen, urlGen ) + makeTag2( filename, keyword ); 336 } 337 else { 338 ChartUtilities.saveChartAsPNG( file, chart, width, height ); 339 imgTag = makeTag2( filename, null ); 340 } 341 } 342 catch(IOException ex) { 343 String errMsg = "ファイル I/O が実行できませんでした。" 344 + HybsSystem.CR + file + HybsSystem.CR 345 + ex.getMessage(); 346 throw new HybsSystemException( errMsg,ex ); 347 } 348 349 jspPrint( imgTag ); 350 351 // キャッシュ時にセーブする。 352 if( useCache ) { 353 if( cache == null ) { 354 cache = new ChartCache( masterKey ); 355 cache.setJFreeChart( chart ); 356 } 357 String subKey = String.valueOf( seriesPikup ); 358 cache.putFileAddress( subKey,imgTag ); 359 if( map == null ) { 360 map = new HashMap<String,ChartCache>(); 361 } 362 map.put( masterKey,cache ); 363 setSessionAttribute( CHART_CACHE_KEY,map ); 364 } 365 else { 366 // map = (Map<String,ChartCache>)getSessionAttribute( CHART_CACHE_KEY ); 367 // if( map != null ) { map.clear() ; } 368 removeSessionAttribute( CHART_CACHE_KEY ); 369 } 370 } 371 372 // 3.5.4.7 (2004/02/06) 373 long dyEnd = System.currentTimeMillis(); 374 jspPrint( "<div id=\"viewTime\" value=\"" + (dyEnd-dyStart) + "\"></div>" ); // 3.5.6.3 (2004/07/12) 375 return EVAL_PAGE; 376 } 377 378 /** 379 * タグリブオブジェクトをリリースします。 380 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 381 * 382 * @og.rev 4.0.1.0 (2007/12/13) categoryMargin、lowerMargin、upperMargin 属性を追加 383 * @og.rev 4.1.1.0 (2008/02/04) categoryCutNo , categoryAnchor , rangeSkip 属性を追加 384 * @og.rev 5.6.1.0 (2013/02/01) dateAxisFormat 属性を追加 385 * @og.rev 5.6.4.3 (2013/05/24) useVerticalLabels 属性を追加 386 */ 387 @Override 388 protected void release2() { 389 super.release2(); 390 chartDataset = null; 391 title = null; 392 width = 200; 393 height = 200; 394 domainLabel = null; 395 showLegend = true; 396 rectangleEdge = "BOTTOM"; 397 plotOrientation = "VERTICAL"; 398 chartBackColor = null; // 背景色の設定 399 plotBackColor = null; // 描画領域の設定 400 rotationLabel = 3; // 横軸ラベルの傾き(1:180度 、2:90度 、3:60度 、4:45度 、6:30度 ・・・ ) 401 useVerticalLabels = false; // 5.6.4.3 (2013/05/24) 横軸ラベルの表示向き(横書き:false/縦書き:true) 402 domainMarker = null; // 横軸のマーカーライン 403 useDomainLabel = true; // 横軸ラベルの表示有無 404 useMarkerLabel = true; // マーカーライン時の文字有無 405 useCache = false; // キャッシュするかどうか 406 seriesPikup = -1; // ピックアップするシリーズ番号 407 masterKey = null; // キャッシュ用マスタキー 408 map = null; // キャッシュ用マップ 409 cache = null; // キャッシュ 410 imgTag = null; // キャッシュ用画像ファイル 411 imageMapUrl = null; // クリッカブル・マップ 412 imageMapTarget = null; // クリッカブル・マップ用TARGET 413 categoryMargin = null; // 4.0.2.0 (2007/12/20) カテゴリマージン(0.0〜1.0) 414 lowerMargin = null; // 4.0.2.0 (2007/12/20) 下方マージン(0.0〜1.0) 415 upperMargin = null; // 4.0.2.0 (2007/12/20) 上方マージン(0.0〜1.0) 416// shapeColors = null; // 4.0.3.0 (2008/01/07) データ毎にShapeを切り替える時の色指定 417 useDomainLine = false; // 4.0.3.0 (2008/01/07) 横軸のグリッド表示有無(垂直線) 418 domainLineColor = null; // 4.0.3.0 (2008/01/07) 横軸のグリッド線の色 419 useRangeLine = true; // 4.0.3.0 (2008/01/07) 縦軸のグリッド表示有無(水平線) 420 rangeLineColor = null; // 4.0.3.0 (2008/01/07) 縦軸のグリッド線の色 421 categorySkip = 1; // 4.0.3.0 (2008/01/07) 横軸ラベルをスキップする間隔 422 categoryCutNo = -1; // 4.1.1.0 (2008/02/04) 横軸ラベルの文字位置指定のキーブレイク 423 categoryAnchor = null; // 4.1.1.0 (2008/02/14) 横軸のグリッド(垂直線)の書き出し位置(START,MIDDLE,END) 424// lineOffset = 0.0; // 4.1.1.0 (2008/02/04) DomainLineの書き出し位置 425 rangeSkip = 1; // 4.1.1.0 (2008/02/04) 縦軸のグリッドをスキップする間隔 426 dateAxisFormat = "MM/dd"; // 5.6.1.0 (2013/02/01) Time,XYTime Polt関係の時間軸を表す場合のフォーマット 427 } 428 429 /** 430 * チャートを表示するためのタグを作成します。 431 * 432 * @param filename 画像ファイル 433 * @param keyword クリッカブル・マップの対応づける為のキーワード 434 * 435 * @return タグ文字列 436 */ 437 private String makeTag2( final String filename,final String keyword ) { 438 StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 439 440 rtn.append( "<img" ); 441 if( keyword != null ) { 442 rtn.append( " usemap=\"#").append( keyword ).append( "\""); 443 } 444 rtn.append( " width=\"" ).append( width ).append( "px\""); 445 rtn.append( " height=\"" ).append( height ).append( "px\""); 446 rtn.append( " src=\"" ).append( filename ).append( "\" /> "); 447 448 return rtn.toString(); 449 } 450 451 /** 452 * ChartCreate のオブジェクトを生成します。 453 * 454 * @og.rev 4.1.1.0 (2008/02/04) categoryCutNo , categoryAnchor 属性を追加 455 * @og.rev 5.6.1.0 (2013/02/01) dateAxisFormat 属性を追加 456 * @og.rev 5.6.1.0 (2013/02/01) useVerticalLabels 属性を追加 457 * 458 * @return ChartCreateオブジェクト 459 */ 460 private ChartCreate create() { 461 ChartCreate tempCreate = new ChartCreate(); 462 463 tempCreate.setTitle( title ); 464 tempCreate.setDomainLabel( domainLabel ); 465 tempCreate.setShowLegend( showLegend ); 466 tempCreate.setRectangleEdge( rectangleEdge ); 467 tempCreate.setPlotOrientation( plotOrientation ); 468 tempCreate.setChartBackColor( chartBackColor ); // 背景色の設定 469 tempCreate.setPlotBackColor( plotBackColor ); // 描画領域の設定 470 tempCreate.setRotationLabel( rotationLabel ); // 横軸ラベルの傾き 471 tempCreate.setUseVerticalLabels( useVerticalLabels ); // 5.6.4.3 (2013/05/24)) ラベルの表示向き 472 tempCreate.setDomainMarker( domainMarker ); // ドメインマーカー 473 tempCreate.setUseDomainLabel( useDomainLabel ); // 横軸ラベルの表示有無 474 tempCreate.setUseMarkerLabel( useMarkerLabel ); // マーカーの設定値表示 475 tempCreate.setSeriesPikup( seriesPikup ); // ピックアップするシリーズ番号 476 tempCreate.setImageMapUrl( imageMapUrl ); // クリッカブル・マップ用URL 477 tempCreate.setCategoryMargin( categoryMargin ); // 4.0.2.0 (2007/12/20) カテゴリマージン(0.0〜1.0) 478 tempCreate.setLowerMargin( lowerMargin ); // 4.0.2.0 (2007/12/20) 下方マージン(0.0〜1.0) 479 tempCreate.setUpperMargin( upperMargin ); // 4.0.2.0 (2007/12/20) 上方マージン(0.0〜1.0) 480// tempCreate.setShapeColors( shapeColors ); // 4.0.2.0 (2007/12/20) 上方マージン(0.0〜1.0) 481 tempCreate.setUseDomainLine( useDomainLine ); // 4.0.3.0 (2008/01/07) 横軸のグリッド表示有無(垂直線) 482 tempCreate.setDomainLineColor( domainLineColor ); // 4.0.3.0 (2008/01/07) 横軸のグリッド線の色 483 tempCreate.setUseRangeLine( useRangeLine ); // 4.0.3.0 (2008/01/07) 縦軸のグリッド表示有無(水平線) 484 tempCreate.setRangeLineColor( rangeLineColor ); // 4.0.3.0 (2008/01/07) 縦軸のグリッド線の色 485 tempCreate.setCategorySkip( categorySkip ); // 4.0.3.0 (2008/01/07) 横軸ラベルをスキップする間隔 486 tempCreate.setCategoryCutNo( categoryCutNo ); // 4.1.1.0 (2008/02/04) 横軸ラベルの文字位置指定のキーブレイク 487 tempCreate.setCategoryAnchor( categoryAnchor ); // 4.1.1.0 (2008/02/04) 横軸ラベルの文字位置指定のキーブレイク 488// tempCreate.setDomainLineOffset( lineOffset ); // 4.1.1.0 (2008/02/14) 横軸のグリッド(垂直線)の書き出し位置(START,MIDDLE,END) 489 tempCreate.setRangeSkip( rangeSkip ); // 4.1.1.0 (2008/02/04) 縦軸のグリッド線(水平線)をスキップする間隔 490 tempCreate.setUseToolTip( useToolTip ); // 4.3.1.0 (2008/08/09) ツールチップスの利用 491 tempCreate.setDateAxisFormat( dateAxisFormat ); // 5.6.1.0 (2013/02/01) Time,XYTime Polt関係の時間軸を表す場合のフォーマット指定 492 493 if( isDebug() ) { tempCreate.setDebug( true ); } // 4.0.2.0 (2007/12/20) 494 495 tempCreate.setDatasetList( chartDataset ); 496 497 return tempCreate ; 498 } 499 500 /** 501 * テンポラリFile を取得します。 502 * 503 * ここでは、一般的なファイル出力を考慮した テンポラリFile を作成します。 504 * 505 * @param fileURL ファイルを作成するディレクトリ 506 * 507 * @return テンポラリFile 508 */ 509 private File getTempFile( final String fileURL ) { 510 final File file ; 511 512 String directory = HybsSystem.url2dir( fileURL ); 513 File dir = new File( directory ); 514 if( ! dir.exists() && ! dir.mkdirs() ) { 515 String errMsg = "ディレクトリの作成に失敗しました。[" + directory + "]"; 516 throw new HybsSystemException( errMsg ); 517 } 518 519 try { 520 file = File.createTempFile( "JFree",".png",dir ); 521 file.deleteOnExit(); 522 } 523 catch( IOException ex ) { 524 String errMsg = "ファイル名がオープン出来ませんでした。" 525 + HybsSystem.CR 526 + "Url:" + fileURL ; 527 throw new HybsSystemException( errMsg,ex ); 528 } 529 530 return file ; 531 } 532 533 /** 534 * 【TAG】コマンド[NEW/RENEW]をセットします(初期値:NEW)。 535 * 536 * @og.tag 537 * コマンドは,HTMLから(get/post)指定されますので,CMD_xxx で設定される 538 * フィールド定数値のいづれかを、指定できます。 539 * command が、NEW または、RENEW の場合のみ、新規にオブジェクトの構築を行います。 540 * 541 * @param cmd コマンド(public static final 宣言されている文字列) 542 * @see <a href="../../../../constant-values.html#org.opengion.hayabusa.taglib.ChartCreateTag.CMD_NEW">コマンド定数</a> 543 */ 544// public void setCommand( String cmd ) { 545// String cmd2 = getRequestParameter( cmd ); 546// if( cmd2 != null && cmd2.length() != 0 ) { command = cmd2.toUpperCase(Locale.JAPAN); } 547// } 548 549 /** 550 * 【TAG】チャートのタイトルをセットします。 551 * 552 * @og.tag チャートのタイトルをセットします。 553 * 554 * @param ttl タイトル 555 */ 556 public void setTitle( final String ttl ) { 557 title = nval( getRequestParameter( ttl ),title ); 558 } 559 560 /** 561 * 【TAG】チャートの横幅をセットします(初期値:200)。 562 * 563 * @og.tag 564 * タイトルや凡例も含んだ大きさです。データ領域は自動計算されます。 565 * 566 * @og.rev 4.0.1.0 (2007/12/13) 引数に "px" を使用できるようにする。 567 * 568 * @param wd 横幅 569 */ 570 public void setWidth( final String wd ) { 571 // 引数に、"px" が使用されていた場合は、それを取り除く。 572 if( wd != null && wd.length() >= 3 && wd.endsWith( "px" ) ) { 573 width = Integer.valueOf( wd.substring( 0,wd.length()-2 ) ); 574 } 575 else { 576 width = nval( getRequestParameter( wd ),width ); 577 } 578 } 579 580 /** 581 * 【TAG】チャートの縦幅をセットします(初期値:200)。 582 * 583 * @og.tag 584 * タイトルや凡例も含んだ大きさです。データ領域は自動計算されます。 585 * 586 * @og.rev 4.0.1.0 (2007/12/13) 引数に "px" を使用できるようにする。 587 * 588 * @param ht 縦幅 589 */ 590 public void setHeight( final String ht ) { 591 // 引数に、"px" が使用されていた場合は、それを取り除く。 592 if( ht != null && ht.length() >= 3 && ht.endsWith( "px" ) ) { 593 height = Integer.valueOf( ht.substring( 0,ht.length()-2 ) ); 594 } 595 else { 596 height = nval( getRequestParameter( ht ),height ); 597 } 598 } 599 600 /** 601 * 【TAG】チャートのドメインラベルを指定します。 602 * 603 * @og.tag 604 * チャートのドメインラベルを指定します。 605 * 606 * @param dmLbl チャートのドメインラベル 607 */ 608 public void setDomainLabel( final String dmLbl ) { 609 domainLabel = nval( getRequestParameter( dmLbl ),domainLabel ); 610 } 611 612 /** 613 * 【TAG】チャートの凡例の表示可否[true/false]をセットします(初期値:true[表示する])。 614 * 615 * @og.tag 616 * 初期値は、表示する(true) です。 617 * 618 * @param swLegend 凡例の表示可否 [true:表示する/それ以外:しない] 619 */ 620 public void setShowLegend( final String swLegend ) { 621 showLegend = nval( getRequestParameter( swLegend ),showLegend ); 622 } 623 624 /** 625 * 【TAG】チャートの表示箇所を、[TOP/BOTTOM/RIGHT/LEFT]で指定します(初期値:BOTTOM)。 626 * 627 * @og.tag 628 * 表示箇所は、org.jfree.ui.RectangleEdge クラスの設定値を使用します。 629 * 指定できるのは、TOP、BOTTOM、RIGHT、LEFT で、各文字の頭一文字で 630 * 判定してます。つまり、T,B,R,L で、判定を行い、それ以外はエラーになります。 631 * 初期値は、BOTTOM です。 632 * 633 * @param rectEdge 凡例表示方向 : (TOP、BOTTOM、RIGHT、LEFT) 634 */ 635 public void setRectangleEdge( final String rectEdge ) { 636 rectangleEdge = nval( getRequestParameter( rectEdge ),rectangleEdge ); 637 } 638 639 /** 640 * 【TAG】チャートのプロット(Plot)表示方向を、[VERTICAL(or V),HORIZONTAL(or H)]で指定します(初期値:VERTICAL)。 641 * 642 * @og.tag 643 * 軸表示方向は、org.jfree.chart.plot.PlotOrientation クラスの設定値を使用します。 644 * 指定できるのは、VERTICAL、HORIZONTALで、各文字の頭一文字で 645 * 判定してます。つまり、V,H で、判定を行い、それ以外はエラーになります。 646 * 初期値は、VERTICAL です。 647 * 648 * @param orientation プロット表示方向 : VERTICAL(or V) , HORIZONTAL(or H) 649 */ 650 public void setPlotOrientation( final String orientation ) { 651 plotOrientation = nval( getRequestParameter( orientation ),plotOrientation ); 652 } 653 654 /** 655 * 【TAG】チャートの背景色を指定します。 656 * 657 * @og.tag 658 * 指定文字列は、java.awt.Color クラスのstatic フィールド名で指定します。 659 * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY , 660 * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , (PURPLE) が指定できます。 661 * また、#XXXXXX形式の16bitRGB表記 でも指定可能です。 662 * 663 * @param chBackClr チャートの背景色 664 * @see java.awt.Color#BLACK 665 */ 666 public void setChartBackColor( final String chBackClr ) { 667 chartBackColor = nval( getRequestParameter( chBackClr ),chartBackColor ); 668 } 669 670 /** 671 * 【TAG】チャートの描画領域の色を指定します。 672 * 673 * @og.tag 674 * 指定文字列は、java.awt.Color クラスのstatic フィールド名で指定します。 675 * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY , 676 * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , (PURPLE) が指定できます。 677 * また、#XXXXXX形式の16bitRGB表記 でも指定可能です。 678 * 679 * @param plBackClr チャートの描画領域色 680 * @see java.awt.Color#BLACK 681 */ 682 public void setPlotBackColor( final String plBackClr ) { 683 plotBackColor = nval( getRequestParameter( plBackClr ),plotBackColor ); 684 } 685 686 /** 687 * 【TAG】チャートのカテゴリーラベルの方向を指定します(3:60度)。 688 * 689 * @og.tag 690 * 方向は、上方向に対して、(PI / 指示数) で求まる値に設定します。 691 * この指示数に相当する値を設定します。 692 * 1:180度 、2:90度 、3:60度 、4:45度 、6:30度 ・・・ 693 * マイナスは、した方向に回転させます。 694 * 0 を指定した場合は、何も設定しません。 695 * 初期値は、3:60度です。 696 * 697 * @param rttLabel カテゴリーラベルの方向 698 */ 699 public void setRotationLabel( final String rttLabel ) { 700 rotationLabel = nval( getRequestParameter( rttLabel ),rotationLabel ); 701 } 702 703 /** 704 * 【TAG】ラベルの表示向きを縦にするかどうか[false/true]を指定します(初期値:false)。 705 * 706 * @og.tag 707 * ChartCreate の rotationLabel は、角度を指定できましたが、NumberAxis,DateAxis では、 708 * 縦にするかどうかの指定しかできません。 709 * ここでは、true を指定するとラベルは、縦書きになります。 710 * 初期値は、false(横書き)です。 711 * 712 * @og.rev 5.6.4.3 (2013/05/24)) 新規追加 713 * 714 * @param useVLavels ラベルの表示向き [false:横書き/true:縦書き] 715 */ 716 public void setUseVerticalLabels( final String useVLavels ) { 717 useVerticalLabels = nval( getRequestParameter( useVLavels ),useVerticalLabels ); 718 } 719 720 /** 721 * 【TAG】チャートの横軸の値(ドメイン)に合致する位置にマーカーラインを設定します。 722 * 723 * @og.tag 724 * この属性には、マーカーラインを設定する値を記述します。 725 * 726 * @param marker ドメインのマーカーライン 727 */ 728 public void setDomainMarker( final String marker ) { 729 domainMarker = nval( getRequestParameter( marker ),domainMarker ); 730 } 731 732 /** 733 * 【TAG】横軸ラベルのラベルを表示するかどうか[true/false]を指定します(初期値:true)。 734 * 735 * @og.tag 736 * ドメイン(横軸)が、多数存在する場合、ドメインラベルが見えにくくなります。 737 * そのようなケースで、横軸のラベルそのものを表示しない場合に、false を 738 * 設定します。 739 * 初期値は、表示する(true)です。 740 * 741 * @param flag 横軸ラベルの表示有無 [true:表示する/false:表示しない] 742 */ 743 public void setUseDomainLabel( final String flag ) { 744 useDomainLabel = nval( getRequestParameter( flag ),useDomainLabel ); 745 } 746 747 /** 748 * 【TAG】マーカーラインに、その設定値を表示するかどうか[true/false]を指定します(初期値:true)。 749 * 750 * @og.tag 751 * ドメイン(横軸)が、多数存在する場合、ドメインラベルが見えない場合があります。 752 * そのようなケースで、見たい値にマーカーラインを設定し、その横に、ドメインラベル 753 * を表示する事で、ピックアップしている軸の値を容易に知ることが可能です。 754 * 初期値は、表示する(true)です。 755 * 756 * @param flag マーカーラインの設定値表示 true:表示する/false:表示しない] 757 */ 758 public void setUseMarkerLabel( final String flag ) { 759 useMarkerLabel = nval( getRequestParameter( flag ),useMarkerLabel ); 760 } 761 762 /** 763 * 【TAG】JFreeChart オブジェクトをキャッシュするかどうか[true/false]を指定します(初期値:false)。 764 * 765 * @og.tag 766 * useCache="true" を設定すると、session に、HybsSystem.JF_CHART_CACHE_KEY 767 * キーで、キャッシュされます。 768 * そのときに、domainMarker 属性と、seriesPikup 属性だけ、再設定可能になっています。 769 * 770 * 初期値は、キャッシュしない(false)です。 771 * 772 * @param flag JFreeChartをキャッシュするかどうか true:キャッシュする/false:キャッシュしない] 773 * @see #setDomainMarker( String ) 774 * @see #setSeriesPikup( String ) 775 */ 776 public void setUseCache( final String flag ) { 777 useCache = nval( getRequestParameter( flag ),useCache ); 778 } 779 780 /** 781 * 【TAG】複数シリーズのピックアップを行う場合のシリーズ番号を指定します。 782 * 783 * @og.tag 784 * 複数シリーズ(検索時に複数項目を同時に検索する場合)では、チャート上に 785 * 複数のグラフが表示されますが、その中の一つをピックアップする場合に、 786 * シリーズ番号を指定します。 787 * シリーズ番号は、0 から始まる数字です。 788 * ここでは、ピックアップされたシリーズは、赤色で表示されます。 789 * それ以外は、グレー色での表示になります。 790 * seriesPikup を使用すると、chartDataset タグの useValueVisible 属性が 791 * 影響を受けます。この属性は、データの値(itemText)を表示しますが、 792 * seriesPikup が指定された場合は、そのシリーズのみにラベル表示します。 793 * 794 * @param pikup シリーズ番号 795 */ 796 public void setSeriesPikup( final String pikup ) { 797 seriesPikup = nval( getRequestParameter( pikup ),seriesPikup ); 798 } 799 800 /** 801 * 【TAG】キャッシュ用マスタキーを指定します。 802 * 803 * @og.tag 804 * useCache="true" に設定した場合、キャッシュを使用できるか確認します。 805 * この場合、seriesPikup 違いの場合は、JFreeChart オブジェクトそのものを 806 * キャッシュしておけば、データベースアクセスなしで、グラフを再描画 807 * させることが可能です。 808 * この、同一 JFreeChart を指定するためのキーを、ここで設定します。 809 * このキーの個数だけ、JFreeChart がキャッシュされます。 810 * なお、キャッシュ保持時間は、5分固定です。 811 * 812 * @param mkey キャッシュ用マスタキー 813 */ 814 public void setMasterKey( final String mkey ) { 815 masterKey = nval( getRequestParameter( mkey ),masterKey ); 816 } 817 818 /** 819 * 【TAG】クリッカブル・マップ用URLを指定します。 820 * 821 * @og.tag 822 * 画像に、クリッカブル・マップを作成する場合の、URL を指定します。 823 * これは、画像上にエリア指定でリンク引数を作成することが可能です。 824 * URL 自身は、? 付きで固定値の引数を連結することが可能です。 825 * クリックしたエリアのカテゴリやインデックスの値(引数)は、自動的に 826 * 設定されます。(指定しない場合はチャートによって異なります) 827 * <pre> 828 * ・Pie :category、pieIndex 829 * ・XY :series、item 830 * ・Category :series、category 831 * </pre> 832 * この引数の URL の名称を変更したい場合は、URL に続けて、カンマ(,) で、 833 * 名称を記述してください。 834 * 例:link.jsp,BLOCK 835 * 836 * @param imap クリッカブル・マップ用URL 837 * @see #setImageMapTarget( String ) 838 */ 839 public void setImageMapUrl( final String imap ) { 840 imageMapUrl = nval( getRequestParameter( imap ),imageMapUrl ); 841 } 842 843 /** 844 * 【TAG】クリッカブル・マップ用TARGETを指定します。 845 * 846 * @og.tag 847 * 画像に、クリッカブル・マップを作成する場合の、TARGET を指定します。 848 * これは、画像上にエリア指定でリンクを作成する場合のフレーム指定です。 849 * 850 * @param target クリッカブル・マップ用TARGET 851 * @see #setImageMapUrl( String ) 852 */ 853 public void setImageMapTarget( final String target ) { 854 imageMapTarget = nval( getRequestParameter( target ),imageMapTarget ); 855 } 856 857 /** 858 * 【TAG】カテゴリマージン(0.0〜1.0)を指定します。 859 * 860 * @og.tag 861 * カテゴリ(グラフの横軸に相当)の表示間隔(マージン)の比率を指定します。 862 * この比率は、% ではなく、数字(double)での設定になります。 863 * 何も指定しない場合は、デフォルトで自動調整されます。 864 * 865 * @og.rev 4.0.2.0 (2007/12/20) 新規追加 866 * 867 * @param margin カテゴリマージン(0.0〜1.0) 868 */ 869 public void setCategoryMargin( final String margin ) { 870 categoryMargin = nval( getRequestParameter( margin ),categoryMargin ); 871 } 872 873 /** 874 * 【TAG】下方マージン(0.0〜1.0)を指定します。 875 * 876 * @og.tag 877 * カテゴリ(グラフの横軸に相当)の下方側(左側)のマージンの比率を指定します。 878 * この比率は、% ではなく、数字(double)での設定になります。 879 * 何も指定しない場合は、デフォルトで自動調整されます。 880 * 881 * @og.rev 4.0.2.0 (2007/12/20) 新規追加 882 * 883 * @param margin 下方マージン(0.0〜1.0) 884 */ 885 public void setLowerMargin( final String margin ) { 886 lowerMargin = nval( getRequestParameter( margin ),lowerMargin ); 887 } 888 889 /** 890 * 【TAG】上方マージン(0.0〜1.0)を指定します。 891 * 892 * @og.tag 893 * カテゴリ(グラフの横軸に相当)の上方側(右側)のマージンの比率を指定します。 894 * この比率は、% ではなく、数字(double)での設定になります。 895 * 何も指定しない場合は、デフォルトで自動調整されます。 896 * 897 * @og.rev 4.0.2.0 (2007/12/20) 新規追加 898 * 899 * @param margin 上方マージン(0.0〜1.0) 900 */ 901 public void setUpperMargin( final String margin ) { 902 upperMargin = nval( getRequestParameter( margin ),upperMargin ); 903 } 904 905 /** 906 * 【TAG】横軸のグリッド表示有無(垂直線)を指定します(初期値:false)。 907 * 908 * @og.tag 909 * ドメイン(横軸)に対する、グリッドラインを表示するかどうか指定します。 910 * 911 * 何も指定しない場合は、表示しません。(false) 912 * 913 * @og.rev 4.0.3.0 (2008/01/07) 新規追加 914 * 915 * @param useLine 横軸のグリッド表示有無(垂直線) 916 */ 917 public void setUseDomainLine( final String useLine ) { 918 useDomainLine = nval( getRequestParameter( useLine ),useDomainLine ); 919 } 920 921 /** 922 * 【TAG】横軸のグリッド線の色を指定します。 923 * 924 * @og.tag 925 * ドメイン(横軸)に対する、グリッドラインの表示色を指定します。 926 * 何も指定しない場合は、デフォルトで自動設定されます。 927 * 928 * @og.rev 4.0.3.0 (2008/01/07) 新規追加 929 * 930 * @param color 横軸のグリッド線の色 931 */ 932 public void setDomainLineColor( final String color ) { 933 domainLineColor = nval( getRequestParameter( color ),domainLineColor ); 934 } 935 936 /** 937 * 【TAG】横軸ラベルをスキップする間隔を指定します。 938 * 939 * @og.tag 940 * 横軸ラベル(カテゴリラベル表示)する際に、スキップする間隔を指定します。 941 * "1" (初期値)では、1つづつ表示(つまり、すべて表示する)します。 942 * "2" とすると、1つおきに、"3" とすると、2つおきに表示します。 943 * 初期値は、"1" (すべて表示)です。 944 * なお、先頭から表示を開始します。 945 * 946 * 注意:これとは別に、ラベル先頭に "_" を付けた場合は、ラベルを表示しません。 947 * また、categoryCutNo が指定された場合は、categorySkip は使用されません。 948 * 949 * @param step スキップする間隔 950 * @see #setCategoryCutNo( String ) 951 */ 952 public void setCategorySkip( final String step ) { 953 categorySkip = nval( getRequestParameter( step ),categorySkip ); 954 } 955 956 /** 957 * 【TAG】横軸ラベルの文字位置指定のキーブレイクを指定します。 958 * 959 * @og.tag 960 * 横軸ラベル(カテゴリラベル表示)する際に、ラベルの先頭から、この指定文字数だけ 961 * カットして、表示します。 962 * その際、前回作成したカットラベルと、同一ラベルの場合は、表示しません。 963 * 例えば、データは、年月日で、年と月のみ(先頭6文字)を指定すると、 964 * 日のデータは、ラベルが表示されません。 965 * 指定される数字は、1以上の整数としてください。 966 * 初期値は、すべて表示です。 967 * 968 * 注意:これとは別に、ラベル先頭に "_" を付けた場合は、ラベルを表示しません。 969 * 970 * @og.rev 4.1.1.0 (2008/02/04) 新規追加 971 * 972 * @param cutNo キーブレイク位置 973 * @see #setCategorySkip( String ) 974 */ 975 public void setCategoryCutNo( final String cutNo ) { 976 categoryCutNo = nval( getRequestParameter( cutNo ),categoryCutNo ); 977 } 978 979 /** 980 * 【TAG】横軸のグリッド(垂直線)の書き出し位置(START,MIDDLE,END)を指定します。 981 * 982 * @og.tag 983 * 横軸のグリッド(垂直線)を、グラフのどの位置に記述するかを指定します。 984 * 具体的な値は、CategoryAnchor オブジェクトの値になります。 985 * ここでは、文字列で(START,MIDDLE,END)を指定します。(先頭一文字で判定) 986 * 何も指定しない場合は、デフォルト(MIDDLE)です。 987 * 988 * @og.rev 4.1.1.0 (2008/02/14) 新規追加 989 * 990 * @param anchor 横軸のグリッド(垂直線)の書き出し位置(START,MIDDLE,END) 991 */ 992 public void setCategoryAnchor( final String anchor ) { 993 categoryAnchor = nval( getRequestParameter( anchor ),categoryAnchor ); 994 995 if( categoryAnchor != null && categoryAnchor.length() > 0 ) { 996 if( ! "START".equals( categoryAnchor ) && 997 ! "MIDDLE".equals( categoryAnchor ) && 998 ! "END".equals( categoryAnchor ) ) { 999 String errMsg = "指定のAnchorは適用できません。[" + anchor + "]" 1000 + HybsSystem.CR 1001 + "START,MIDDLE,END の中から、指定してください。" ; 1002 throw new HybsSystemException( errMsg ); 1003 } 1004 } 1005 } 1006 1007 /** 1008 * 【TAG】DomainLineの書き出し位置Offsetを指定します。 1009 * 1010 * @og.tag 1011 * 横軸ライン(カテゴリライン表示)する際に、ラインの描画位置を、 1012 * 先頭から、この指定数だけずらします。 1013 * プラスの場合は、右へ、マイナスの場合は、左へずらします。 1014 * 1015 * これにより、ライン(縦線)の位置を、グラフの中心から、ずらす事が 1016 * 可能になります。 1017 * 1018 * @og.rev 4.1.1.0 (2008/02/04) 新規追加 1019 * 1020 * @param domainLineOffset DomainLineの書き出し位置Offset 1021 */ 1022// public void setDomainLineOffset( final String domainLineOffset ) { 1023// String offset = StringUtil.nval( getRequestParameter( domainLineOffset ),null ); 1024// if( offset != null ) { 1025// lineOffset = Double.parseDouble( offset ); 1026// } 1027// } 1028 1029 /** 1030 * 【TAG】縦軸のグリッド表示有無(水平線)を指定します(初期値:true)。 1031 * 1032 * @og.tag 1033 * レンジ(縦軸)に対する、グリッドラインを表示するかどうか指定します。 1034 * 1035 * 何も指定しない場合は、表示しません。(false) 1036 * 1037 * @og.rev 4.0.3.0 (2008/01/07) 新規追加 1038 * 1039 * @param useLine 横軸のグリッド表示有無(垂直線) 1040 */ 1041 public void setUseRangeLine( final String useLine ) { 1042 useRangeLine = nval( getRequestParameter( useLine ),useRangeLine ); 1043 } 1044 1045 /** 1046 * 【TAG】縦軸のグリッド線の色を指定します。 1047 * 1048 * @og.tag 1049 * レンジ(縦軸)に対する、グリッドラインの表示色を指定します。 1050 * 何も指定しない場合は、デフォルトで自動設定されます。 1051 * 1052 * @og.rev 4.0.3.0 (2008/01/07) 新規追加 1053 * 1054 * @param color 縦軸のグリッド線の色 1055 */ 1056 public void setRangeLineColor( final String color ) { 1057 rangeLineColor = nval( getRequestParameter( color ),rangeLineColor ); 1058 } 1059 1060 /** 1061 * 【TAG】縦軸のグリッド線(水平線)をスキップする間隔を指定します。 1062 * 1063 * @og.tag 1064 * 縦軸のグリッド線(水平線)を表示する際に、スキップする間隔を指定します。 1065 * 通常は、ラベルと同じだけのグリッド線が掛かれますが、ラベルよりも 1066 * 少ない数のグリッド線(例えば、2つおき)を出す場合に、値を設定します。 1067 * "1" (初期値)では、1つづつ表示(つまり、すべて表示する)します。 1068 * "2" とすると、1つおきに、"3" とすると、2つおきに表示します。 1069 * 初期値は、"1" (すべて表示)です。 1070 * なお、先頭から表示を開始します。 1071 * 1072 * @og.rev 4.1.1.0 (2008/02/04) 新規追加 1073 * 1074 * @param rngSkip 縦軸のグリッド線(水平線)をスキップする間隔 1075 */ 1076 public void setRangeSkip( final String rngSkip ) { 1077 rangeSkip = nval( getRequestParameter( rngSkip ),rangeSkip ); 1078 } 1079 1080 /** 1081 * 【TAG】ツールチップスの使用可否[true:利用する/false:利用しない]を指定します(初期値:false)。 1082 * 1083 * @og.tag 1084 * ラベルを利用する際に、ラベルと図面、隣のラベル同士が重なることがあります。 1085 * この場合、ツールチップスの利用をお勧めします。 1086 * 初期値は'false'です。 1087 * 1088 * @og.rev 4.3.1.0 (2008/08/09) 新規追加 1089 * 1090 * @param toolTip ツールチップス [true:利用/false:利用しない] 1091 */ 1092 public void setUseToolTip( final String toolTip ) { 1093 useToolTip = nval( getRequestParameter( toolTip ), useToolTip ); 1094 } 1095 1096 /** 1097 * 【TAG】Time,XYTime Polt関係の時間軸を表す場合のフォーマットを指定します(初期値:MM/dd)。 1098 * 1099 * @og.tag 1100 * TimeSeries 関連のデータを扱う場合の横軸の日付フォーマットを指定します。 1101 * 日付フォーマットは、java.text.SimpleDateFormat で使われる yyyy/MM/dd HH:mm:ss 表記です。 1102 * 1103 * 初期値は、"MM/dd" です。 1104 * 1105 * @og.rev 5.6.1.0 (2013/02/01) 新規追加 1106 * @og.rev 5.6.1.0 (2013/02/01) 新規追加 1107 * 1108 * @param dtFormat Time,XYTime Polt関係の時間軸を表す場合のフォーマット 1109 */ 1110 public void setDateAxisFormat( final String dtFormat ) { 1111 dateAxisFormat = nval( getRequestParameter( dtFormat ), dateAxisFormat ); 1112// if( dtFormat != null && dtFormat.length() > 0 ) { 1113// dateAxisFormat = dtFormat; 1114// } 1115 } 1116 1117 /** 1118 * BODY要素に記述した、chartDataset タグの属性設定クラスをListに追加します。 1119 * 1120 * BODY部に記述された、chartDataset タグの属性は、チャートのデータ取得Queryや、 1121 * チャートの種類などの情報を管理しています。 1122 * チャートの種類(Category系)によっては、チャートを合成して表示させることが可能です。 1123 * それらの複数のチャートの指定が、chartDataset タグ で行われます。 1124 * 1125 * @param chDataset chartDatasetタグの属性設定クラス 1126 */ 1127 protected void addChartDataset( final ChartDataset chDataset ) { 1128 if( chartDataset == null ) { chartDataset = new ArrayList<ChartDataset>(); } 1129 chartDataset.add( chDataset ); 1130 } 1131 1132 /** 1133 * シリアライズ用のカスタムシリアライズ書き込みメソッド 1134 * 1135 * @og.rev 4.0.0.0 (2007/11/29) 新規追加 1136 * @serialData 一部のオブジェクト(Map<String,ChartCache>,ChartCache)は、シリアライズされません。 1137 * 1138 * @param strm ObjectOutputStreamオブジェクト 1139 * @throws IOException シリアライズに関する入出力エラーが発生した場合 1140 */ 1141 private void writeObject( final ObjectOutputStream strm ) throws IOException { 1142 strm.defaultWriteObject(); 1143 } 1144 1145 /** 1146 * シリアライズ用のカスタムシリアライズ読み込みメソッド 1147 * 1148 * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。 1149 * 1150 * @og.rev 4.0.0.0 (2007/11/29) 新規追加 1151 * @serialData 一部のオブジェクト(Map<String,ChartCache>,ChartCache)は、読み込まれません。 1152 * 1153 * @param strm ObjectInputStreamオブジェクト 1154 * @see #release2() 1155 * @throws IOException シリアライズに関する入出力エラーが発生した場合 1156 * @throws ClassNotFoundException クラスを見つけることができなかった場合 1157 */ 1158 private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException { 1159 strm.defaultReadObject(); 1160 } 1161 1162 /** 1163 * このオブジェクトの文字列表現を返します。 1164 * 基本的にデバッグ目的に使用します。 1165 * 1166 * @return このクラスの文字列表現 1167 */ 1168 @Override 1169 public String toString() { 1170 StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 1171 1172 rtn.append( "[" ).append( this.getClass().getName() ).append( "]" ).append( HybsSystem.CR ); 1173 rtn.append( "title [" ).append( title ).append( "]" ).append( HybsSystem.CR ); 1174 rtn.append( "width [" ).append( width ).append( "]" ).append( HybsSystem.CR ); 1175 rtn.append( "height [" ).append( height ).append( "]" ).append( HybsSystem.CR ); 1176 rtn.append( "domainLabel [" ).append( domainLabel ).append( "]" ).append( HybsSystem.CR ); 1177 rtn.append( "showLegend [" ).append( showLegend ).append( "]" ).append( HybsSystem.CR ); 1178 rtn.append( "rectangleEdge [" ).append( rectangleEdge ).append( "]" ).append( HybsSystem.CR ); 1179 rtn.append( "plotOrientation [" ).append( plotOrientation ).append( "]" ).append( HybsSystem.CR ); 1180 rtn.append( "chartBackColor [" ).append( chartBackColor ).append( "]" ).append( HybsSystem.CR ); 1181 rtn.append( "plotBackColor [" ).append( plotBackColor ).append( "]" ).append( HybsSystem.CR ); 1182 1183 return rtn.toString(); 1184 } 1185 1186 /** 1187 * JFreeChart や 画像ファイルのアドレスをキャッシュするクラスです。 1188 * このキャッシュは、JFreeChart 単位に保持されます。 1189 * JFreeChart と、画像ファイルのキャッシュを行います。 1190 * JFreeChart オブジェクトをキャッシュしなおしたタイミングで、 1191 * 画像ファイルのキャッシュは初期化(クリア)されます。 1192 * キャッシュの有効期間は、システムリソースの CHART_CACHE_TIME で定義します。 1193 */ 1194 private static final class ChartCache { 1195 private static final int CACHE_TIME = HybsSystem.sysInt( "CHART_CACHE_TIME" ); 1196 private static final long MAX_CACHE_TIME = CACHE_TIME * 1000L; 1197 1198 private final Map<String,String> fileAdrs = new HashMap<String,String>(); 1199 private final String mkey ; 1200 private long createLimitTime = 0L; 1201 private JFreeChart chart = null ; 1202 1203 /** 1204 * コンストラクター 1205 * JFreeChart オブジェクトをキャッシュするキーを指定します。 1206 * 内部的には、このキー(mkey)で、比較や hashCode が計算されています。 1207 * 1208 * @param mkey キャッシュするキー 1209 */ 1210 public ChartCache( final String mkey ) { 1211 this.mkey = mkey; 1212 } 1213 1214 /** 1215 * JFreeChart オブジェクトをキャッシュします。 1216 * 画像ファイルのキャッシュは初期化(クリア)されます。 1217 * このキャッシュのタイミングで、キャッシュ時間を初期化します。 1218 * 1219 * @param chart JFreeChartオブジェクト 1220 */ 1221 public void setJFreeChart( final JFreeChart chart ) { 1222 this.chart = chart; 1223 fileAdrs.clear(); 1224 createLimitTime = System.currentTimeMillis() + MAX_CACHE_TIME; 1225 } 1226 1227 /** 1228 * JFreeChart オブジェクトを返します。 1229 * キャッシュされていれば、そのキャッシュを、そうでなければ、null を 1230 * 返します。 1231 * キャッシュの有効期間は、システムリソースの CHART_CACHE_TIME で定義します。 1232 * オブジェクトの作成時間が、それを超える場合は、キャッシュを初期化します。 1233 * 1234 * @return JFreeChart JFreeChartオブジェクト 1235 */ 1236 public JFreeChart getJFreeChart() { 1237 return chart; 1238 } 1239 1240 /** 1241 * 画像ファイルをキャッシュします。 1242 * 画像ファイルのキャッシュはサブキー単位に行われます。 1243 * つまり、このオブジェクトの中に、複数の画像ファイルのアドレスが 1244 * キャッシュされています。 1245 * 1246 * @param chart JFreeChartオブジェクト 1247 */ 1248 public void putFileAddress( final String skey,final String adrs ) { 1249 fileAdrs.put( skey,adrs ); 1250 } 1251 1252 /** 1253 * 画像ファイルのアドレスを返します。 1254 * キャッシュされていれば、そのキャッシュを、そうでなければ、null を 1255 * 返します。 1256 * キャッシュの有効期間は、システムリソースの CHART_CACHE_TIME で定義します。 1257 * オブジェクトの作成時間が、それを超える場合は、キャッシュを初期化します。 1258 * 1259 * @return JFreeChart JFreeChartオブジェクト 1260 */ 1261 public String getFileAddress( final String skey ) { 1262 return fileAdrs.get( skey ) ; 1263 } 1264 1265 /** 1266 * キャッシュが、有効かどうかを返します。(有効:true) 1267 * キャッシュは、システムリソースの CHART_CACHE_TIME (秒)パラメータ 1268 * 指定された時間が経過すると、無効と判断されます。 1269 * 有効であれば、true を返します。 1270 * 1271 * @return 有効かどうか(有効:true/無効:false) 1272 */ 1273 public boolean isAvailable() { 1274 return ( System.currentTimeMillis() < createLimitTime ) ; 1275 } 1276 1277 /** 1278 * このオブジェクトと他のオブジェクトが等しいかどうかを示します。 1279 * キャッシュのキーが等しいかどうかで判断します。 1280 * 1281 * @param object 比較対象の参照オブジェクト 1282 * @return obj 引数に指定されたオブジェクトとこのオブジェクトが等しい場合は true、そうでない場合は false 1283 */ 1284 public boolean equals( final Object object ) { 1285 if( object instanceof ChartCache ) { 1286 return this.mkey.equals( ((ChartCache)object).mkey ); 1287 } 1288 return false ; 1289 } 1290 1291 /** 1292 * オブジェクトのハッシュコード値を返します。 1293 * このメソッドは、java.util.Hashtable によって提供されるような 1294 * ハッシュテーブルで使用するために用意されています。 1295 * equals( Object ) メソッドをオーバーライトした場合は、hashCode() メソッドも 1296 * 必ず 記述する必要があります。 1297 * この実装では、mkey.hashCode() と同値を返します。 1298 * 1299 * @return このオブジェクトのハッシュコード値 1300 */ 1301 public int hashCode() { 1302 return mkey.hashCode() ; 1303 } 1304 } 1305}