001 /*
002 * Sonar, open source software quality management tool.
003 * Copyright (C) 2008-2012 SonarSource
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.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
044 private Dashboard() {
045 }
046
047 /**
048 * Creates a new {@link Dashboard}.
049 */
050 public static Dashboard create() {
051 return new Dashboard();
052 }
053
054 /**
055 * Add a widget with the given parameters, and return the newly created {@link Widget} object if one wants to add parameters to it.
056 *
057 * <p>The widget ids are listed by the web service /api/widgets</p>
058 *
059 * @param widgetId id of an existing widget
060 * @param columnId column starts with 1. The widget is ignored if the column id does not match the layout.
061 */
062 public Widget addWidget(String widgetId, int columnId) {
063 if (columnId < 1) {
064 throw new IllegalArgumentException("Widget column starts with 1");
065 }
066
067 Widget widget = new Widget(widgetId);
068 widgetsByColumn.put(columnId, widget);
069 return widget;
070 }
071
072 public Collection<Widget> getWidgets() {
073 return widgetsByColumn.values();
074 }
075
076 public List<Widget> getWidgetsOfColumn(int columnId) {
077 return widgetsByColumn.get(columnId);
078 }
079
080 /**
081 * Returns the description of the dashboard.
082 *
083 * @return the description
084 */
085 public String getDescription() {
086 return description;
087 }
088
089 /**
090 * Sets the description of the dashboard.
091 * <p/>
092 * Note: you should use the i18n mechanism for the description.
093 *
094 * @param description the description to set
095 */
096 public Dashboard setDescription(String description) {
097 this.description = description;
098 return this;
099 }
100
101 /**
102 * Returns the layout. Default value is the 2 columns mode with width 50%/50%.
103 *
104 * @return the layout
105 */
106 public DashboardLayout getLayout() {
107 return layout;
108 }
109
110 public Dashboard setLayout(DashboardLayout dl) {
111 if (dl == null) {
112 throw new IllegalArgumentException("The layout can not be null");
113 }
114 this.layout = dl;
115 return this;
116 }
117
118
119 /**
120 * Note that this class is an inner class to avoid confusion with the extension point org.sonar.api.web.Widget.
121 */
122 public static final class Widget {
123 private String id;
124 private Map<String, String> properties;
125
126 Widget(String id) {
127 this.id = id;
128 this.properties = Maps.newHashMap();
129 }
130
131 public Widget setProperty(String key, String value) {
132 properties.put(key, value);
133 return this;
134 }
135
136 /**
137 * Returns the properties of this widget.
138 *
139 * @return the properties
140 */
141 public Map<String, String> getProperties() {
142 return properties;
143 }
144
145 public String getProperty(String key) {
146 return properties.get(key);
147 }
148
149 /**
150 * Returns the identifier of this widget.
151 *
152 * @return the id
153 */
154 public String getId() {
155 return id;
156 }
157 }
158
159 }