/**
* 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 wicket.contrib.groovy.builder.util;
import groovy.lang.IntRange;
import java.io.Serializable;
import java.util.Map;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.lang.StringUtils;
import wicket.contrib.groovy.builder.WicketComponentBuilderException;
import wicket.model.IModel;
import wicket.model.Model;
/**
* Some general utilities for pulling values from the attributes map.
*
* @author Kevin Galligan
*
*/
public class AttributeUtils
{
public static boolean booleanValue(Object arg)
{
if(arg instanceof Boolean)
return ((Boolean)arg).booleanValue();
else
return Boolean.parseBoolean(arg.toString());
}
public static IModel modelValue(Serializable arg)
{
if(arg instanceof IModel)
return (IModel)arg;
else
return new Model(arg);
}
public static IntRange intRangeValue(Object arg)
{
if(arg == null)
return null;
if(arg instanceof IntRange)
return (IntRange)arg;
else
throw new WicketComponentBuilderException("Range must be of type IntRange");
}
public static Class classValue(Object arg) throws ClassNotFoundException
{
if(arg instanceof Class)
return (Class)arg;
else if(arg instanceof String)
return Class.forName((String)arg);
else
throw new WicketComponentBuilderException("Can't figure out Class type");
}
public static Class classValueSafe(Object arg)
{
try
{
return classValue(arg);
}
catch (ClassNotFoundException e)
{
throw new WicketComponentBuilderException("Can't get Class value", e);
}
}
public static Object multiName(Map attrs, String[] names)
{
for(int i=0; i<names.length; i++)
{
String name = names[i];
Object value = attrs.remove(name);
if(value != null)
return value;
}
return null;
}
public static Object multiNameOptional(Map attrs, String[] names)
{
return multiName(attrs, names);
}
public static Object multiNameRequired(Map attrs, String[] names)
{
Object value = multiName(attrs, names);
if(value == null)
throw new WicketComponentBuilderException("One of "+ StringUtils.join(names, ',') +" required");
return value;
}
public static Object generalAttributeConversion(Class expectedType, Object value)
{
if(value instanceof String)
{
if (expectedType.equals(Class.class))
{
try
{
value = AttributeUtils.classValue(value);
}
catch (ClassNotFoundException e)
{
throw new WicketComponentBuilderException("Attribute conversion error. Could not find class '"+ value.toString() +"'", e);
}
}
if(expectedType.equals(String.class) == false)
value = ConvertUtils.convert((String) value, expectedType);
}
return value;
}
}