com.google.gwt.dev.cfg.ConfigurationProperties Maven / Gradle / Ivy
/*
* Copyright 2014 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.dev.cfg;
import com.google.gwt.core.ext.BadPropertyValueException;
import com.google.gwt.core.ext.DefaultConfigurationProperty;
import com.google.gwt.core.ext.PropertyOracle;
import com.google.gwt.core.ext.SelectionProperty;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.TreeLogger.Type;
import com.google.gwt.thirdparty.guava.common.base.Splitter;
import com.google.gwt.thirdparty.guava.common.collect.ImmutableMap;
import com.google.gwt.thirdparty.guava.common.collect.ImmutableMap.Builder;
import com.google.gwt.thirdparty.guava.common.collect.Lists;
import java.io.Serializable;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/**
* The compiler's representation of a set of configuration properties.
* These are properties that don't vary by permutation.
* They may be single-valued or multi-valued.
*/
public class ConfigurationProperties implements Serializable {
public static final ConfigurationProperties EMPTY =
new ConfigurationProperties(Collections.emptyList());
/**
* @author James X. Nelson ([email protected], @james)
*
*/
public class ConfigOnlyPropertyOracle implements PropertyOracle {
@Override
public com.google.gwt.core.ext.ConfigurationProperty getConfigurationProperty(
final String propertyName) throws BadPropertyValueException {
return ConfigurationProperties.this.getConfigurationProperty(propertyName);
}
@Override
public SelectionProperty getSelectionProperty(final TreeLogger logger,
final String propertyName) throws BadPropertyValueException {
logger.log(Type.ERROR, "This property oracle does not support retrieval of SelectionProperties");
throw new UnsupportedOperationException("This property oracle does not support retrieval of SelectionProperties");
}
}
private static final Splitter SPLIT_ON_COMMAS =
Splitter.on(',').omitEmptyStrings().trimResults();
/**
* Maps a configuration property's name to its values.
*
* The value list may be empty, to represent a multi-valued property that has no values.
* (This is distinct from a property that doesn't exist at all.)
*
*
The value list may contain nulls. By default, an undefined, single-valued
* configuration property is represented as a list containing one null.
*
*
We don't have a way to distinguish a single-valued property from
* a multi-valued property that happens to contain one entry. (It's available in
* {@link ConfigurationProperty} but not preserved.)
*
*
(We can't use a Multimap due to the above requirements.)
*/
private final ImmutableMap> properties;
/**
* Takes a snapshot of some ConfigurationProperty instances.
*/
public ConfigurationProperties(Iterable properties) {
Builder> builder = ImmutableMap.builder();
for (ConfigurationProperty property : properties) {
builder.put(property.getName(), copyOf(property.getValues()));
}
this.properties = builder.build();
}
/**
* Takes a snapshot of a module's configuration properties.
*/
public ConfigurationProperties(ModuleDef def) {
this(def.getProperties().getConfigurationProperties());
}
/**
* Construct from a map (for testing).
*/
public ConfigurationProperties(Map> map) {
Builder> builder = ImmutableMap.builder();
for (Entry> entry : map.entrySet()) {
builder.put(entry.getKey(), copyOf(entry.getValue()));
}
this.properties = builder.build();
}
/**
* Returns a single-valued property as a boolean if possible.
* If not set or not single-valued, returns the default value.
*/
public boolean getBoolean(final String key, final boolean defaultValue) {
final List values = getStrings(key);
if (values.size() != 1 || values.get(0) == null) {
return defaultValue;
}
return Boolean.parseBoolean(values.get(0));
}
/**
* Returns a single-valued configuration property as an integer if possible.
* If not set, not single-valued, or not an integer, returns the default value.
*/
public int getInteger(final String key, final int defaultValue) {
final List values = getStrings(key);
if (values.size() != 1 || values.get(0) == null) {
return defaultValue;
}
try {
return Integer.parseInt(values.get(0));
} catch (final NumberFormatException e) {
return defaultValue;
}
}
/**
* Returns a single-valued property as a string if possible.
* If not set or not single-valued, returns the default value.
*/
public String getString(String key, String defaultValue) {
List values = getStrings(key);
if (values.size() != 1 || values.get(0) == null) {
return defaultValue;
}
return values.get(0);
}
/**
* Returns all the values of a multi-valued configuration property, or an empty list
* if not found.
*
* A single-valued and unset configuration property will be returned as a list
* containing one null.
*/
public List getStrings(final String key) {
if (!properties.containsKey(key)) {
return Collections.emptyList();
}
return properties.get(key);
}
/**
* Reads a configuration property as a comma-separated list of strings.
* It may be a single-valued or multi-valued property. If multi-valued,
* each value will be split on commas and all items concatenated.
*
* Leading and trailing space is automatically trimmed, and nulls and
* empty strings are automatically ignored.
*
*
Returns an empty list if the property doesn't exist.
*/
public List getCommaSeparatedStrings(final String key) {
final List result = Lists.newArrayList();
for (final String value : getStrings(key)) {
if (value != null) {
result.addAll(SPLIT_ON_COMMAS.splitToList(value));
}
}
return result;
}
/**
* Returns whether the property is multivalued or not. If the property is not defined then it is
* considered single valued.
*/
public boolean isMultiValued(String key) {
return getStrings(key).size() > 1;
}
/**
* Returns the ConfigurationProperty with the given key.
* (API-compatible with {@link com.google.gwt.core.ext.PropertyOracle}.)
*/
com.google.gwt.core.ext.ConfigurationProperty getConfigurationProperty(final String key)
throws BadPropertyValueException {
if (!properties.containsKey(key)) {
throw new BadPropertyValueException(key);
}
return new DefaultConfigurationProperty(key, properties.get(key));
}
/**
* Returns an unmodifiable copy of a list that may contain nulls.
*/
private static List copyOf(final List values) {
return Collections.unmodifiableList(Lists.newArrayList(values));
}
/**
* Returns a property oracle that can only access configuration properties.
*/
public PropertyOracle toConfigurationOnlyPropertyOracle() {
return new ConfigOnlyPropertyOracle();
}
}