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.server.ws.internal;
021    
022    import com.google.common.base.Splitter;
023    import com.google.common.collect.Lists;
024    import org.apache.commons.lang.StringUtils;
025    import org.slf4j.LoggerFactory;
026    import org.sonar.api.server.ws.Request;
027    import org.sonar.api.server.ws.WebService;
028    
029    import javax.annotation.CheckForNull;
030    import javax.annotation.Nullable;
031    import java.util.List;
032    import java.util.Set;
033    
034    /**
035     * @since 4.2
036     */
037    public abstract class ValidatingRequest extends Request {
038    
039      private WebService.Action action;
040    
041      public void setAction(WebService.Action action) {
042        this.action = action;
043      }
044    
045      public WebService.Action action() {
046        return action;
047      }
048    
049      @CheckForNull
050      public String param(String key) {
051        return param(key, true);
052      }
053    
054      @CheckForNull
055      private String param(String key, boolean validateValue) {
056        WebService.Param definition = action.param(key);
057        String value = readParamOrDefaultValue(key, definition);
058        if (value != null && validateValue) {
059          validate(value, definition);
060        }
061        return value;
062      }
063    
064      @CheckForNull
065      @Override
066      public List<String> paramAsStrings(String key) {
067        WebService.Param definition = action.param(key);
068        String value = readParamOrDefaultValue(key, definition);
069        if (value == null) {
070          return null;
071        }
072        List<String> values = Lists.newArrayList(Splitter.on(',').omitEmptyStrings().trimResults().split(value));
073        for (String s : values) {
074          validate(s, definition);
075        }
076        return values;
077      }
078    
079      @CheckForNull
080      @Override
081      public <E extends Enum<E>> List<E> paramAsEnums(String key, Class<E> enumClass) {
082        WebService.Param definition = action.param(key);
083        String value = readParamOrDefaultValue(key, definition);
084        if (value == null) {
085          return null;
086        }
087        Iterable<String> values = Splitter.on(',').omitEmptyStrings().trimResults().split(value);
088        List<E> result = Lists.newArrayList();
089        for (String s : values) {
090          validate(s, definition);
091          result.add(Enum.valueOf(enumClass, s));
092        }
093        return result;
094      }
095    
096      @CheckForNull
097      private String readParamOrDefaultValue(String key, @Nullable WebService.Param definition) {
098        if (definition == null) {
099          String message = String.format("BUG - parameter '%s' is undefined for action '%s'", key, action.key());
100          LoggerFactory.getLogger(getClass()).error(message);
101          throw new IllegalArgumentException(message);
102        }
103        String value = StringUtils.defaultString(readParam(key), definition.defaultValue());
104        if (value == null) {
105          return null;
106        }
107        return value;
108      }
109    
110      @CheckForNull
111      protected abstract String readParam(String key);
112    
113      private void validate(String value, WebService.Param definition) {
114        Set<String> possibleValues = definition.possibleValues();
115        if (possibleValues != null && !possibleValues.contains(value)) {
116          throw new IllegalArgumentException(String.format(
117            "Value of parameter '%s' (%s) must be one of: %s", definition.key(), value, possibleValues));
118        }
119      }
120    }