blob: b3b6d860ecb675247f067832117689e610ea4166 [file] [log] [blame]
/*
* Copyright 2008 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 java.lang.reflect.InvocationTargetException;
import java.util.Iterator;
import java.util.SortedMap;
import java.util.SortedSet;
import java.util.TreeMap;
import java.util.TreeSet;
/**
* A typed map of deferred binding properties.
*/
public class Properties implements Iterable<Property> {
private final SortedSet<BindingProperty> bindingProps = new TreeSet<BindingProperty>();
private final SortedSet<ConfigurationProperty> configProps = new TreeSet<ConfigurationProperty>();
private final SortedMap<String, Property> map = new TreeMap<String, Property>();
/**
* Creates the specified deferred-binding property, or returns an existing one
* by the specified name if present.
*/
public BindingProperty createBinding(String name) {
BindingProperty prop = create(name, BindingProperty.class);
bindingProps.add(prop);
return prop;
}
/**
* Creates the specified configuration property, or returns an existing one by
* the specified name if present.
*/
public ConfigurationProperty createConfiguration(String name,
boolean allowMultipleValues) {
ConfigurationProperty prop = create(name, allowMultipleValues,
ConfigurationProperty.class);
configProps.add(prop);
return prop;
}
public Property find(String name) {
return map.get(name);
}
/**
* Gets all deferred binding properties in sorted order.
*/
public SortedSet<BindingProperty> getBindingProperties() {
return bindingProps;
}
public SortedSet<ConfigurationProperty> getConfigurationProperties() {
return configProps;
}
public Iterator<Property> iterator() {
return map.values().iterator();
}
private <T extends Property> T create(String name, boolean flag,
boolean useFlagArgument, Class<T> clazz) {
if (clazz == null) {
throw new NullPointerException("clazz");
} else if (name == null) {
throw new NullPointerException("name");
}
Property property = find(name);
if (property != null) {
try {
return clazz.cast(property);
} catch (ClassCastException e) {
throw new IllegalArgumentException("Cannot create property " + name
+ " because one of another type ("
+ property.getClass().getSimpleName() + ") already exists.");
}
}
Exception ex = null;
try {
T newInstance;
if (useFlagArgument) {
newInstance = clazz.getConstructor(String.class, boolean.class).newInstance(
name, flag);
} else {
newInstance = clazz.getConstructor(String.class).newInstance(name);
}
map.put(name, newInstance);
return newInstance;
} catch (NoSuchMethodException e) {
ex = e;
} catch (InstantiationException e) {
ex = e;
} catch (IllegalAccessException e) {
ex = e;
} catch (InvocationTargetException e) {
ex = e;
}
throw new RuntimeException("Unable to create Property instance", ex);
}
private <T extends Property> T create(String name, boolean flag,
Class<T> clazz) {
return create(name, flag, true, clazz);
}
private <T extends Property> T create(String name, Class<T> clazz) {
return create(name, false, false, clazz);
}
}