001 /*
002 * SonarQube, open source software quality management tool.
003 * Copyright (C) 2008-2014 SonarSource
004 * mailto:contact AT sonarsource DOT com
005 *
006 * SonarQube 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 * SonarQube 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 License
017 * along with this program; if not, write to the Free Software Foundation,
018 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
019 */
020 package org.sonar.api.web;
021
022 import com.google.common.collect.ArrayListMultimap;
023 import com.google.common.collect.ListMultimap;
024 import com.google.common.collect.Maps;
025
026 import java.util.Collection;
027 import java.util.List;
028 import java.util.Map;
029
030 /**
031 * Definition of a dashboard.
032 * <p/>
033 * Its name and description can be retrieved using the i18n mechanism, using the keys "dashboard.<id>.name" and
034 * "dashboard.<id>.description".
035 *
036 * @since 2.13
037 */
038 public final class Dashboard {
039
040 private String description;
041 private DashboardLayout layout = DashboardLayout.TWO_COLUMNS;
042 private ListMultimap<Integer, Widget> widgetsByColumn = ArrayListMultimap.create();
043 private boolean global = false;
044 private boolean activated = true;
045
046 private Dashboard() {
047 }
048
049 /**
050 * Creates a new {@link Dashboard}.
051 */
052 public static Dashboard create() {
053 return new Dashboard();
054 }
055
056 /**
057 * Add a widget with the given parameters, and return the newly created {@link Widget} object if one wants to add parameters to it.
058 *
059 * <p>The widget ids are listed by the web service /api/widgets</p>
060 *
061 * @param widgetId id of an existing widget
062 * @param columnId column starts with 1. The widget is ignored if the column id does not match the layout.
063 */
064 public Widget addWidget(String widgetId, int columnId) {
065 if (columnId < 1) {
066 throw new IllegalArgumentException("Widget column starts with 1");
067 }
068
069 Widget widget = new Widget(widgetId);
070 widgetsByColumn.put(columnId, widget);
071 return widget;
072 }
073
074 public Collection<Widget> getWidgets() {
075 return widgetsByColumn.values();
076 }
077
078 public List<Widget> getWidgetsOfColumn(int columnId) {
079 return widgetsByColumn.get(columnId);
080 }
081
082 /**
083 * Returns the description of the dashboard.
084 *
085 * @return the description
086 */
087 public String getDescription() {
088 return description;
089 }
090
091 /**
092 * Sets the description of the dashboard.
093 * <p/>
094 * Note: you should use the i18n mechanism for the description.
095 *
096 * @param description the description to set
097 */
098 public Dashboard setDescription(String description) {
099 this.description = description;
100 return this;
101 }
102
103 /**
104 * Returns the layout. Default value is the 2 columns mode with width 50%/50%.
105 *
106 * @return the layout
107 */
108 public DashboardLayout getLayout() {
109 return layout;
110 }
111
112 public Dashboard setLayout(DashboardLayout dl) {
113 if (dl == null) {
114 throw new IllegalArgumentException("The layout can not be null");
115 }
116 this.layout = dl;
117 return this;
118 }
119
120 /**
121 * A dashboard is global when it doesn't display information from a projet but rather more general information.
122 * <p>Before version 3.1 no dashboard was global.</p>
123 *
124 * @since 3.1
125 */
126 public boolean isGlobal() {
127 return global;
128 }
129
130 /**
131 * A dashboard is global when it doesn't display information from a projet but rather more general information.
132 * <p>Before version 3.1 no dashboard was global.</p>
133 *
134 * @since 3.1
135 */
136 public Dashboard setGlobal(boolean global) {
137 this.global = global;
138 return this;
139 }
140
141 /**
142 * A dashboard can be activated for all anonymous users or users who haven't configured their own dashboards.
143 * <p>Before version 3.1 every dashboard created through this extension point was automatically activated.
144 * This is still the default behavior.</p>
145 *
146 * @since 3.1
147 */
148 public boolean isActivated() {
149 return activated;
150 }
151
152 /**
153 * Set whether the dashboard is activated for all anonymous users or users who haven't configured their own dashboards.
154 *
155 * @since 3.1
156 */
157 public Dashboard setActivated(boolean activated) {
158 this.activated = activated;
159 return this;
160 }
161
162 /**
163 * Note that this class is an inner class to avoid confusion with the extension point org.sonar.api.web.Widget.
164 */
165 public static final class Widget {
166 private String id;
167 private Map<String, String> properties;
168
169 Widget(String id) {
170 this.id = id;
171 this.properties = Maps.newHashMap();
172 }
173
174 public Widget setProperty(String key, String value) {
175 properties.put(key, value);
176 return this;
177 }
178
179 /**
180 * Returns the properties of this widget.
181 *
182 * @return the properties
183 */
184 public Map<String, String> getProperties() {
185 return properties;
186 }
187
188 public String getProperty(String key) {
189 return properties.get(key);
190 }
191
192 /**
193 * Returns the identifier of this widget.
194 *
195 * @return the id
196 */
197 public String getId() {
198 return id;
199 }
200 }
201 }