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 */
020package org.sonar.server.ui;
021
022import com.google.common.collect.Lists;
023import com.google.common.collect.Maps;
024import com.google.common.collect.Sets;
025import org.apache.commons.lang.ArrayUtils;
026import org.sonar.api.ServerComponent;
027import org.sonar.api.web.Page;
028import org.sonar.api.web.View;
029import org.sonar.api.web.Widget;
030
031import java.util.List;
032import java.util.Map;
033import java.util.Set;
034
035public class Views implements ServerComponent {
036
037  private Map<String, ViewProxy<Page>> pagesPerId = Maps.newHashMap();
038  private Set<ViewProxy<Page>> pages = Sets.newTreeSet();
039
040  private Map<String, ViewProxy<Widget>> widgetsPerId = Maps.newHashMap();
041  private Set<ViewProxy<Widget>> widgets = Sets.newTreeSet();
042
043  public Views() {
044  }
045
046  public Views(View[] views) {
047    for (View view : DefaultPages.getPages()) {
048      register(view);
049    }
050    for (View view : views) {
051      register(view);
052    }
053  }
054
055  private void register(View view) {
056    if (view instanceof Widget) {
057      ViewProxy<Widget> proxy = new ViewProxy<Widget>((Widget) view);
058      widgets.add(proxy);
059      widgetsPerId.put(proxy.getId(), proxy);
060
061    } else if (view instanceof Page) {
062      ViewProxy<Page> proxy = new ViewProxy<Page>((Page) view);
063      pagesPerId.put(proxy.getId(), proxy);
064      pages.add(proxy);
065    }
066  }
067
068  public ViewProxy<Page> getPage(String id) {
069    return pagesPerId.get(id);
070  }
071
072  public List<ViewProxy<Page>> getPages(String section) {
073    return getPages(section, null, null, null, null);
074  }
075
076  public List<ViewProxy<Page>> getPages(String section, String resourceScope, String resourceQualifier, String resourceLanguage, String[] availableMeasures) {
077    List<ViewProxy<Page>> result = Lists.newArrayList();
078    for (ViewProxy<Page> proxy : pages) {
079      if (accept(proxy, section, resourceScope, resourceQualifier, resourceLanguage, availableMeasures)) {
080        result.add(proxy);
081      }
082    }
083    return result;
084  }
085
086  public List<ViewProxy<Page>> getPagesForMetric(String section, String resourceScope, String resourceQualifier, String resourceLanguage,
087                                                 String[] availableMeasures, String metric) {
088    List<ViewProxy<Page>> result = Lists.newArrayList();
089    for (ViewProxy<Page> proxy : pages) {
090      if (accept(proxy, section, resourceScope, resourceQualifier, resourceLanguage, availableMeasures) && proxy.supportsMetric(metric)) {
091        result.add(proxy);
092      }
093    }
094    return result;
095  }
096
097  public ViewProxy<Widget> getWidget(String id) {
098    return widgetsPerId.get(id);
099  }
100
101  public List<ViewProxy<Widget>> getWidgets(String resourceScope, String resourceQualifier, String resourceLanguage, String[] availableMeasures) {
102    List<ViewProxy<Widget>> result = Lists.newArrayList();
103    for (ViewProxy<Widget> proxy : widgets) {
104      if (accept(proxy, null, resourceScope, resourceQualifier, resourceLanguage, availableMeasures)) {
105        result.add(proxy);
106      }
107    }
108    return result;
109  }
110
111  public List<ViewProxy<Widget>> getWidgets() {
112    return Lists.newArrayList(widgets);
113  }
114
115  protected static boolean accept(ViewProxy proxy, String section, String resourceScope, String resourceQualifier, String resourceLanguage, String[] availableMeasures) {
116    return acceptNavigationSection(proxy, section)
117      && acceptResourceScope(proxy, resourceScope)
118      && acceptResourceQualifier(proxy, resourceQualifier)
119      && acceptResourceLanguage(proxy, resourceLanguage)
120      && acceptAvailableMeasures(proxy, availableMeasures);
121  }
122
123  protected static boolean acceptResourceLanguage(ViewProxy proxy, String resourceLanguage) {
124    return resourceLanguage == null || ArrayUtils.isEmpty(proxy.getResourceLanguages()) || ArrayUtils.contains(proxy.getResourceLanguages(), resourceLanguage);
125  }
126
127  protected static boolean acceptResourceScope(ViewProxy proxy, String resourceScope) {
128    return resourceScope == null || ArrayUtils.isEmpty(proxy.getResourceScopes()) || ArrayUtils.contains(proxy.getResourceScopes(), resourceScope);
129  }
130
131  protected static boolean acceptResourceQualifier(ViewProxy proxy, String resourceQualifier) {
132    return resourceQualifier == null || ArrayUtils.isEmpty(proxy.getResourceQualifiers()) || ArrayUtils.contains(proxy.getResourceQualifiers(), resourceQualifier);
133  }
134
135  protected static boolean acceptNavigationSection(ViewProxy proxy, String section) {
136    return proxy.isWidget() || section == null || ArrayUtils.contains(proxy.getSections(), section);
137  }
138
139  protected static boolean acceptAvailableMeasures(ViewProxy proxy, String[] availableMeasures) {
140    return availableMeasures == null || proxy.acceptsAvailableMeasures(availableMeasures);
141  }
142}