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