001 /* 002 * SonarQube, open source software quality management tool. 003 * Copyright (C) 2008-2013 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 }