001    /*
002     * SonarQube, open source software quality management tool.
003     * Copyright (C) 2008-2014 SonarSource
004     * mailto:contact AT sonarsource DOT com
005     *
006     * SonarQube 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     * SonarQube 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 License
017     * along with this program; if not, write to the Free Software Foundation,
018     * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
019     */
020    package org.sonar.api.web;
021    
022    import com.google.common.collect.ImmutableSortedSet;
023    
024    import java.util.Set;
025    
026    import com.google.common.base.Preconditions;
027    
028    /**
029     * Definition of a {@link Filter} column.
030     *
031     * @since 3.1
032     */
033    public final class FilterColumn {
034      public static final String ASC = "ASC";
035      public static final String DESC = "DESC";
036      public static final Set<String> DIRECTIONS = ImmutableSortedSet.of(ASC, DESC);
037    
038      private final String family;
039      private final String key;
040      private final String sortDirection;
041      private final boolean variation;
042    
043      private FilterColumn(String family, String key, String sortDirection, boolean variation) {
044        Preconditions.checkArgument(DIRECTIONS.contains(sortDirection), "Valid directions are %s, not '%s'", DIRECTIONS, sortDirection);
045    
046        this.family = family;
047        this.key = key;
048        this.sortDirection = sortDirection;
049        this.variation = variation;
050      }
051    
052      /**
053       * Creates a new {@link FilterColumn}.
054       *
055       * <p>Valid values for the {@code sortDirection} are {@code #ASC}, {@code #DESC}</p>
056       *
057       * <p>When the @{see Filter} is persisted, a validation is made on the {@code family} and the {@code key}.
058       * They should point to a valid column description.</p>
059       *
060       * @throws IllegalArgumentException if {@code sortDirection} is not valid
061       */
062      public static FilterColumn create(String family, String key, String sortDirection, boolean variation) {
063        return new FilterColumn(family, key, sortDirection, variation);
064      }
065    
066      /**
067       * Get the the column's family.
068       * 
069       * @return the family
070       */
071      public String getFamily() {
072        return family;
073      }
074    
075      /**
076       * Get the the column's key.
077       * 
078       * @return the key
079       */
080      public String getKey() {
081        return key;
082      }
083    
084      /**
085       * Get the the column's sort direction.
086       * 
087       * @return the sort direction
088       */
089      public String getSortDirection() {
090        return sortDirection;
091      }
092    
093      /**
094       * A column can be based on the variation of a value rather than on the value itself.
095       * 
096       * @return <code>true</code> when the variation is used rather than the value
097       */
098      public boolean isVariation() {
099        return variation;
100      }
101    }