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