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.config;
021    
022    import com.google.common.base.Preconditions;
023    import com.google.common.base.Strings;
024    import com.google.common.collect.ImmutableList;
025    import org.sonar.api.PropertyField;
026    import org.sonar.api.PropertyType;
027    
028    import javax.annotation.Nullable;
029    
030    import java.util.List;
031    
032    import static com.google.common.collect.Lists.newArrayList;
033    
034    /**
035     * @since 3.3
036     */
037    public final class PropertyFieldDefinition {
038      private final String key;
039      private final String name;
040      private final String description;
041      private final int indicativeSize;
042      private final PropertyType type;
043      private final List<String> options;
044    
045      private PropertyFieldDefinition(Builder builder) {
046        this.key = builder.key;
047        this.name = builder.name;
048        this.description = builder.description;
049        this.indicativeSize = builder.indicativeSize;
050        this.type = builder.type;
051        this.options = builder.options;
052      }
053    
054      static List<PropertyFieldDefinition> create(PropertyField[] fields) {
055        List<PropertyFieldDefinition> definitions = newArrayList();
056        for (PropertyField field : fields) {
057          definitions.add(PropertyFieldDefinition.build(field.key())
058              .name(field.name())
059              .description(field.description())
060              .indicativeSize(field.indicativeSize())
061              .type(field.type())
062              .options(field.options())
063              .build()
064          );
065        }
066        return definitions;
067      }
068    
069      public static Builder build(String key) {
070        return new Builder(key);
071      }
072    
073      public String key() {
074        return key;
075      }
076    
077      public String name() {
078        return name;
079      }
080    
081      public String description() {
082        return description;
083      }
084    
085      public int indicativeSize() {
086        return indicativeSize;
087      }
088    
089      public PropertyType type() {
090        return type;
091      }
092    
093      public List<String> options() {
094        return options;
095      }
096    
097      public PropertyDefinition.Result validate(@Nullable String value) {
098        return PropertyDefinition.validate(type, value, options);
099      }
100    
101      public static class Builder {
102        private String key;
103        private String name;
104        private String description;
105        private int indicativeSize;
106        private PropertyType type;
107        private List<String> options;
108    
109        private Builder(String key) {
110          this.key = key;
111          this.name = "";
112          this.description = "";
113          this.indicativeSize = 20;
114          this.type = PropertyType.STRING;
115          this.options = newArrayList();
116        }
117    
118        public Builder name(String name) {
119          this.name = name;
120          return this;
121        }
122    
123        public Builder description(String description) {
124          this.description = description;
125          return this;
126        }
127    
128        public Builder indicativeSize(int indicativeSize) {
129          this.indicativeSize = indicativeSize;
130          return this;
131        }
132    
133        public Builder type(PropertyType type) {
134          this.type = type;
135          return this;
136        }
137    
138        public Builder options(String... options) {
139          this.options.addAll(ImmutableList.copyOf(options));
140          return this;
141        }
142    
143        public Builder options(List<String> options) {
144          this.options.addAll(ImmutableList.copyOf(options));
145          return this;
146        }
147    
148        public PropertyFieldDefinition build() {
149          Preconditions.checkArgument(!Strings.isNullOrEmpty(key), "Key must be set");
150          Preconditions.checkArgument(!Strings.isNullOrEmpty(name), "Name must be set");
151          return new PropertyFieldDefinition(this);
152        }
153      }
154    }