001 /*
002 * Sonar, open source software quality management tool.
003 * Copyright (C) 2009 SonarSource SA
004 * mailto:contact AT sonarsource DOT com
005 *
006 * Sonar is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Lesser General Public
008 * License as published by the Free Software Foundation; either
009 * version 3 of the License, or (at your option) any later version.
010 *
011 * Sonar is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 * Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public
017 * License along with Sonar; if not, write to the Free Software
018 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02
019 */
020 package org.sonar.api.charts;
021
022 import org.apache.commons.lang.StringUtils;
023 import org.apache.commons.lang.text.StrTokenizer;
024 import org.sonar.api.utils.SonarException;
025
026 import java.io.UnsupportedEncodingException;
027 import java.net.URLDecoder;
028 import java.util.HashMap;
029 import java.util.Locale;
030 import java.util.Map;
031
032 /**
033 * @since 1.10
034 */
035 public class ChartParameters {
036 private static final String[] EMPTY = new String[0];
037
038 public static final String PARAM_WIDTH = "w";
039 public static final String PARAM_BACKGROUND_COLOR = "bgc";
040 public static final String PARAM_HEIGHT = "h";
041 public static final int MAX_WIDTH = 700;
042 public static final String PARAM_LOCALE = "locale";
043
044 public static final int MAX_HEIGHT = 500;
045 public static final int DEFAULT_WIDTH = 200;
046
047 public static final int DEFAULT_HEIGHT = 200;
048
049
050 private Map<String, String> params;
051
052 public ChartParameters(Map<String, String> params) {
053 this.params = params;
054 }
055
056 public ChartParameters(String queryString) {
057 this.params = new HashMap<String, String>();
058 String[] groups = StringUtils.split(queryString, "&");
059 for (String group : groups) {
060 String[] keyval = StringUtils.split(group, "=");
061 params.put(keyval[0], keyval[1]);
062 }
063 }
064
065 public String getValue(String key) {
066 return getValue(key, "", false);
067 }
068
069 public String getValue(String key, String defaultValue, boolean decode) {
070 String val = params.get(key);
071 if (decode) {
072 val = decode(val);
073 }
074 if (val == null) {
075 val = defaultValue;
076 }
077 return val;
078 }
079
080 public String[] getValues(String key, String delimiter) {
081 String value = params.get(key);
082 if (value != null) {
083 return StringUtils.split(value, delimiter);
084 }
085 return EMPTY;
086 }
087
088 public String[] getValues(String key, String delimiter, boolean decode) {
089 String value = params.get(key);
090 if (value != null) {
091 if (decode) {
092 value = decode(value);
093 }
094 return new StrTokenizer(value, delimiter).setIgnoreEmptyTokens(false).getTokenArray();
095 }
096 return EMPTY;
097 }
098
099 public int getWidth() {
100 int width = Integer.parseInt(getValue(PARAM_WIDTH, "" + DEFAULT_WIDTH, false));
101 return Math.min(width, MAX_WIDTH);
102 }
103
104 public int getHeight() {
105 int height = Integer.parseInt(getValue(PARAM_HEIGHT, "" + DEFAULT_HEIGHT, false));
106 return Math.min(height, MAX_HEIGHT);
107 }
108
109 public Locale getLocale() {
110 String locale = getValue(PARAM_LOCALE);
111 if (StringUtils.isNotBlank(locale)) {
112 return new Locale(locale);
113 }
114 return Locale.ENGLISH;
115 }
116
117 private String decode(String val) {
118 if (val != null) {
119 try {
120 val = URLDecoder.decode(val, "UTF-8");
121 } catch (UnsupportedEncodingException e) {
122 throw new SonarException("Decoding chart parameter : " + val, e);
123 }
124 }
125 return val;
126 }
127 }