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.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    @SuppressWarnings("rawtypes")
035    public class ViewProxy<V extends View> implements Comparable<ViewProxy> {
036    
037      private V view;
038      private String[] sections = {NavigationSection.HOME};
039      private String[] userRoles = {};
040      private String[] resourceScopes = {};
041      private String[] resourceQualifiers = {};
042      private String[] resourceLanguages = {};
043      private String[] defaultForMetrics = {};
044      private String description = "";
045      private Map<String, WidgetProperty> widgetPropertiesByKey = Maps.newHashMap();
046      private String[] widgetCategories = {};
047      private WidgetLayoutType widgetLayout = WidgetLayoutType.DEFAULT;
048      private boolean isDefaultTab = false;
049      private boolean isWidget = false;
050      private String[] mandatoryMeasures = {};
051      private String[] needOneOfMeasures = {};
052    
053      public ViewProxy(final V view) {
054        this.view = view;
055    
056        initUserRoles(view);
057        initSections(view);
058        initResourceScope(view);
059        initResourceQualifier(view);
060        initResourceLanguage(view);
061        initDefaultTabInfo(view);
062        initDescription(view);
063        initWidgetProperties(view);
064        initWidgetCategory(view);
065        initWidgetLayout(view);
066        initRequiredMeasures(view);
067    
068        isWidget = (view instanceof Widget);
069      }
070    
071      private void initRequiredMeasures(V view) {
072        RequiredMeasures requiredMeasuresAnnotation = AnnotationUtils.getClassAnnotation(view, RequiredMeasures.class);
073        if (requiredMeasuresAnnotation != null) {
074          mandatoryMeasures = requiredMeasuresAnnotation.allOf();
075          needOneOfMeasures = requiredMeasuresAnnotation.anyOf();
076        }
077      }
078    
079      private void initWidgetLayout(final V view) {
080        WidgetLayout layoutAnnotation = AnnotationUtils.getClassAnnotation(view, WidgetLayout.class);
081        if (layoutAnnotation != null) {
082          widgetLayout = layoutAnnotation.value();
083        }
084      }
085    
086      private void initWidgetCategory(final V view) {
087        WidgetCategory categAnnotation = AnnotationUtils.getClassAnnotation(view, WidgetCategory.class);
088        if (categAnnotation != null) {
089          widgetCategories = categAnnotation.value();
090        }
091      }
092    
093      private void initWidgetProperties(final V view) {
094        WidgetProperties propAnnotation = AnnotationUtils.getClassAnnotation(view, WidgetProperties.class);
095        if (propAnnotation != null) {
096          for (WidgetProperty property : propAnnotation.value()) {
097            widgetPropertiesByKey.put(property.key(), property);
098          }
099        }
100      }
101    
102      private void initDescription(final V view) {
103        Description descriptionAnnotation = AnnotationUtils.getClassAnnotation(view, Description.class);
104        if (descriptionAnnotation != null) {
105          description = descriptionAnnotation.value();
106        }
107      }
108    
109      private void initDefaultTabInfo(final V view) {
110        DefaultTab defaultTabAnnotation = AnnotationUtils.getClassAnnotation(view, DefaultTab.class);
111        if (defaultTabAnnotation != null) {
112          if (defaultTabAnnotation.metrics().length == 0) {
113            isDefaultTab = true;
114            defaultForMetrics = new String[0];
115    
116          } else {
117            isDefaultTab = false;
118            defaultForMetrics = defaultTabAnnotation.metrics();
119          }
120        }
121      }
122    
123      private void initResourceLanguage(final V view) {
124        ResourceLanguage languageAnnotation = AnnotationUtils.getClassAnnotation(view, ResourceLanguage.class);
125        if (languageAnnotation != null) {
126          resourceLanguages = languageAnnotation.value();
127        }
128      }
129    
130      private void initResourceQualifier(final V view) {
131        ResourceQualifier qualifierAnnotation = AnnotationUtils.getClassAnnotation(view, ResourceQualifier.class);
132        if (qualifierAnnotation != null) {
133          resourceQualifiers = qualifierAnnotation.value();
134        }
135      }
136    
137      private void initResourceScope(final V view) {
138        ResourceScope scopeAnnotation = AnnotationUtils.getClassAnnotation(view, ResourceScope.class);
139        if (scopeAnnotation != null) {
140          resourceScopes = scopeAnnotation.value();
141        }
142      }
143    
144      private void initSections(final V view) {
145        NavigationSection sectionAnnotation = AnnotationUtils.getClassAnnotation(view, NavigationSection.class);
146        if (sectionAnnotation != null) {
147          sections = sectionAnnotation.value();
148        }
149      }
150    
151      private void initUserRoles(final V view) {
152        UserRole userRoleAnnotation = AnnotationUtils.getClassAnnotation(view, UserRole.class);
153        if (userRoleAnnotation != null) {
154          userRoles = userRoleAnnotation.value();
155        }
156      }
157    
158      public V getTarget() {
159        return view;
160      }
161    
162      public String getId() {
163        return view.getId();
164      }
165    
166      public boolean isController() {
167        String id = view.getId();
168        return id !=null && id.length()>0 && id.charAt(0)=='/';
169      }
170    
171      public String getTitle() {
172        return view.getTitle();
173      }
174    
175      public String getDescription() {
176        return description;
177      }
178    
179      public Collection<WidgetProperty> getWidgetProperties() {
180        return widgetPropertiesByKey.values();
181      }
182    
183      public WidgetProperty getWidgetProperty(String propertyKey) {
184        return widgetPropertiesByKey.get(propertyKey);
185      }
186    
187      public String[] getWidgetCategories() {
188        return widgetCategories;
189      }
190    
191      public String[] getSections() {
192        return sections;
193      }
194    
195      public String[] getUserRoles() {
196        return userRoles;
197      }
198    
199      public String[] getResourceScopes() {
200        return resourceScopes;
201      }
202    
203      public String[] getResourceQualifiers() {
204        return resourceQualifiers;
205      }
206    
207      public String[] getResourceLanguages() {
208        return resourceLanguages;
209      }
210    
211      public boolean isDefaultTab() {
212        return isDefaultTab;
213      }
214    
215      public String[] getDefaultTabForMetrics() {
216        return defaultForMetrics;
217      }
218    
219      public boolean supportsMetric(String metricKey) {
220        return ArrayUtils.contains(defaultForMetrics, metricKey);
221      }
222      
223      public boolean acceptsAvailableMeasures(String[] availableMeasures) {
224        for (String mandatoryMeasure : mandatoryMeasures) {
225          if (!ArrayUtils.contains(availableMeasures, mandatoryMeasure)) {
226            return false;
227          }
228        }
229        if (needOneOfMeasures.length == 0) {
230          return true;
231        } else {
232          for (String neededMeasure : needOneOfMeasures) {
233            if (ArrayUtils.contains(availableMeasures, neededMeasure)) {
234              return true;
235            }
236          }
237          return false;
238        }
239      }
240    
241      public boolean isWidget() {
242        return isWidget;
243      }
244    
245      public boolean isGwt() {
246        return view instanceof GwtPage;
247      }
248    
249      public WidgetLayoutType getWidgetLayout() {
250        return widgetLayout;
251      }
252    
253      public boolean isEditable() {
254        return !widgetPropertiesByKey.isEmpty();
255      }
256    
257      public boolean hasRequiredProperties() {
258        boolean requires = false;
259        for (WidgetProperty property : getWidgetProperties()) {
260          if (!property.optional() && StringUtils.isEmpty(property.defaultValue())) {
261            requires = true;
262          }
263        }
264        return requires;
265      }
266    
267      @Override
268      public int hashCode() {
269        return getId().hashCode();
270      }
271    
272      @Override
273      public boolean equals(Object obj) {
274        if (obj == null) {
275          return false;
276        }
277        if (obj == this) {
278          return true;
279        }
280        if (obj.getClass() != getClass()) {
281          return false;
282        }
283        ViewProxy rhs = (ViewProxy) obj;
284        return new EqualsBuilder()
285            .append(getId(), rhs.getId())
286            .isEquals();
287      }
288    
289      @Override
290      public String toString() {
291        return new ToStringBuilder(this)
292            .append("id", view.getId())
293            .append("sections", sections)
294            .append("userRoles", userRoles)
295            .append("scopes", resourceScopes)
296            .append("qualifiers", resourceQualifiers)
297            .append("languages", resourceLanguages)
298            .append("metrics", defaultForMetrics)
299            .toString();
300    
301      }
302    
303      public int compareTo(ViewProxy other) {
304        return new CompareToBuilder()
305            .append(getTitle(), other.getTitle())
306            .append(getId(), other.getId())
307            .toComparison();
308    
309      }
310    }