001    /*
002     * Sonar, open source software quality management tool.
003     * Copyright (C) 2008-2011 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.server.ui;
021    
022    import com.google.common.collect.Maps;
023    import org.apache.commons.lang.ArrayUtils;
024    import org.apache.commons.lang.StringUtils;
025    import org.apache.commons.lang.builder.CompareToBuilder;
026    import org.apache.commons.lang.builder.EqualsBuilder;
027    import org.apache.commons.lang.builder.ToStringBuilder;
028    import org.sonar.api.utils.AnnotationUtils;
029    import org.sonar.api.web.*;
030    
031    import java.util.Collection;
032    import java.util.Map;
033    
034    public class ViewProxy<V extends View> implements Comparable<ViewProxy> {
035    
036      private V view;
037      private String[] sections = {NavigationSection.HOME};
038      private String[] userRoles = {};
039      private String[] resourceScopes = {};
040      private String[] resourceQualifiers = {};
041      private String[] resourceLanguages = {};
042      private String[] defaultForMetrics = {};
043      private String description = "";
044      private Map<String, WidgetProperty> widgetPropertiesByKey = Maps.newHashMap();
045      private String[] widgetCategories = {};
046      private WidgetLayoutType widgetLayout = WidgetLayoutType.DEFAULT;
047      private boolean isDefaultTab = false;
048      private boolean isWidget = false;
049    
050      public ViewProxy(final V view) {
051        this.view = view;
052    
053        UserRole userRoleAnnotation = AnnotationUtils.getClassAnnotation(view, UserRole.class);
054        if (userRoleAnnotation != null) {
055          userRoles = userRoleAnnotation.value();
056        }
057    
058        NavigationSection sectionAnnotation = AnnotationUtils.getClassAnnotation(view, NavigationSection.class);
059        if (sectionAnnotation != null) {
060          sections = sectionAnnotation.value();
061        }
062    
063        ResourceScope scopeAnnotation = AnnotationUtils.getClassAnnotation(view, ResourceScope.class);
064        if (scopeAnnotation != null) {
065          resourceScopes = scopeAnnotation.value();
066        }
067    
068        ResourceQualifier qualifierAnnotation = AnnotationUtils.getClassAnnotation(view, ResourceQualifier.class);
069        if (qualifierAnnotation != null) {
070          resourceQualifiers = qualifierAnnotation.value();
071        }
072    
073        ResourceLanguage languageAnnotation = AnnotationUtils.getClassAnnotation(view, ResourceLanguage.class);
074        if (languageAnnotation != null) {
075          resourceLanguages = languageAnnotation.value();
076        }
077    
078        DefaultTab defaultTabAnnotation = AnnotationUtils.getClassAnnotation(view, DefaultTab.class);
079        if (defaultTabAnnotation != null) {
080          if (defaultTabAnnotation.metrics().length == 0) {
081            isDefaultTab = true;
082            defaultForMetrics = new String[0];
083    
084          } else {
085            isDefaultTab = false;
086            defaultForMetrics = defaultTabAnnotation.metrics();
087          }
088        }
089    
090        Description descriptionAnnotation = AnnotationUtils.getClassAnnotation(view, Description.class);
091        if (descriptionAnnotation != null) {
092          description = descriptionAnnotation.value();
093        }
094    
095        WidgetProperties propAnnotation = AnnotationUtils.getClassAnnotation(view, WidgetProperties.class);
096        if (propAnnotation != null) {
097          for (WidgetProperty property : propAnnotation.value()) {
098            widgetPropertiesByKey.put(property.key(), property);
099          }
100        }
101    
102        WidgetCategory categAnnotation = AnnotationUtils.getClassAnnotation(view, WidgetCategory.class);
103        if (categAnnotation != null) {
104          widgetCategories = categAnnotation.value();
105        }
106    
107        WidgetLayout layoutAnnotation = AnnotationUtils.getClassAnnotation(view, WidgetLayout.class);
108        if (layoutAnnotation != null) {
109          widgetLayout = layoutAnnotation.value();
110        }
111    
112        isWidget = (view instanceof Widget);
113      }
114    
115      public V getTarget() {
116        return view;
117      }
118    
119      public String getId() {
120        return view.getId();
121      }
122    
123      public String getTitle() {
124        return view.getTitle();
125      }
126    
127      public String getDescription() {
128        return description;
129      }
130    
131      public Collection<WidgetProperty> getWidgetProperties() {
132        return widgetPropertiesByKey.values();
133      }
134    
135      public WidgetProperty getWidgetProperty(String propertyKey) {
136        return widgetPropertiesByKey.get(propertyKey);
137      }
138    
139      public String[] getWidgetCategories() {
140        return widgetCategories;
141      }
142    
143      public String[] getSections() {
144        return sections;
145      }
146    
147      public String[] getUserRoles() {
148        return userRoles;
149      }
150    
151      public String[] getResourceScopes() {
152        return resourceScopes;
153      }
154    
155      public String[] getResourceQualifiers() {
156        return resourceQualifiers;
157      }
158    
159      public String[] getResourceLanguages() {
160        return resourceLanguages;
161      }
162    
163      public boolean isDefaultTab() {
164        return isDefaultTab;
165      }
166    
167      public String[] getDefaultTabForMetrics() {
168        return defaultForMetrics;
169      }
170    
171      public boolean supportsMetric(String metricKey) {
172        return ArrayUtils.contains(defaultForMetrics, metricKey);
173      }
174    
175      public boolean isWidget() {
176        return isWidget;
177      }
178    
179      public boolean isGwt() {
180        return view instanceof GwtPage;
181      }
182    
183      public WidgetLayoutType getWidgetLayout() {
184        return widgetLayout;
185      }
186    
187      public boolean isEditable() {
188        return !widgetPropertiesByKey.isEmpty();
189      }
190    
191      public boolean hasRequiredProperties() {
192        boolean requires = false;
193        for (WidgetProperty property : getWidgetProperties()) {
194          if (!property.optional() && StringUtils.isEmpty(property.defaultValue())) {
195            requires = true;
196          }
197        }
198        return requires;
199      }
200    
201      @Override
202      public int hashCode() {
203        return getId().hashCode();
204      }
205    
206    
207      @Override
208      public boolean equals(Object obj) {
209        if (obj == null) {
210          return false;
211        }
212        if (obj == this) {
213          return true;
214        }
215        if (obj.getClass() != getClass()) {
216          return false;
217        }
218        ViewProxy rhs = (ViewProxy) obj;
219        return new EqualsBuilder()
220          .append(getId(), rhs.getId())
221          .isEquals();
222      }
223    
224      @Override
225      public String toString() {
226        return new ToStringBuilder(this)
227          .append("id", view.getId())
228          .append("sections", sections)
229          .append("userRoles", userRoles)
230          .append("scopes", resourceScopes)
231          .append("qualifiers", resourceQualifiers)
232          .append("languages", resourceLanguages)
233          .append("metrics", defaultForMetrics)
234          .toString();
235    
236      }
237    
238      public int compareTo(ViewProxy other) {
239        return new CompareToBuilder()
240          .append(getTitle(), other.getTitle())
241          .append(getId(), other.getId())
242          .toComparison();
243    
244      }
245    }