/*
* PropertyUtilities.java
*
* Created on January 30, 2001, 4:25 PM
*/
package org.freehep.application;
import java.awt.Color;
import java.awt.Rectangle;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.swing.table.AbstractTableModel;
/**
* A set of static methods for operating on a Properties set
* @see java.util.Properties
* @author tonyj
* @version $Id: PropertyUtilities.java 8584 2006-08-10 23:06:37Z duns $
*/
public abstract class PropertyUtilities
{
/**
* @param prop The Properties set
* @param key the key used to store this property
* @param def a default in case the property cannot be retrieved
*/
public static Rectangle getRectangle(Properties prop, final String key, final Rectangle def)
{
try
{
final Rectangle result = new Rectangle();
result.x = getInteger(prop,key.concat("-x"));
result.y = getInteger(prop,key.concat("-y"));
result.width = getInteger(prop,key.concat("-w"));
result.height = getInteger(prop,key.concat("-h"));
return result;
}
catch (Exception e)
{
return def;
}
}
/**
* @param prop The Properties set
* @param key the key used to store this property
* @param rect the value to store
*/
public static void setRectangle(Properties prop, final String key, final Rectangle rect)
{
prop.put(key.concat("-x"), String.valueOf(rect.x));
prop.put(key.concat("-y"), String.valueOf(rect.y));
prop.put(key.concat("-w"), String.valueOf(rect.width));
prop.put(key.concat("-h"), String.valueOf(rect.height));
}
/**
* @param prop The Properties set
* @param key the key used to store this property
* @param def a default in case the property cannot be retrieved
*/
public static Color getColor(Properties prop, final String key, final java.awt.Color def)
{
try
{
return new Color(getInteger(prop,key.concat("-r")), getInteger(prop,key.concat("-g")),
getInteger(prop,key.concat("-b")));
}
catch (Exception e)
{
return def;
}
}
/**
* @param prop The Properties set
* @param key the key used to store this property
* @param c the value to store
*/
public static void setColor(Properties prop, final String key, final Color c)
{
prop.put(key.concat("-r"), String.valueOf(c.getRed()));
prop.put(key.concat("-g"), String.valueOf(c.getGreen()));
prop.put(key.concat("-b"), String.valueOf(c.getBlue()));
}
/**
* @param prop The Properties set
* @param key the key used to store this property
* @param def a default in case the property cannot be retrieved
*/
public static Collection getStringCollection(Properties prop, final String key, final Collection def)
{
try
{
// NOTE Compatible with StringArrays
final int length = getInteger(prop,key +"-length");
final Collection result = new ArrayList(length);
for (int i = 0; i < length; i++) {
String value = prop.getProperty(key + "-" + i);
if (value != null) result.add(value);
}
return result;
}
catch (Exception e)
{
return def;
}
}
/**
* @param prop The Properties set
* @param key the key used to store this property
* @param sa the value to store
*/
public static void setStringCollection(Properties prop, final String key, Collection sa)
{
// remove previous setting
try
{
// NOTE Compatible with StringArrays
final int length = getInteger(prop,key +"-length");
for (int i = 0; i < length; i++) {
prop.remove(key + "-" + i);
}
prop.remove(key+"-length");
}
catch (Exception e) { }
prop.put( key +"-length", sa == null ? "0" : String.valueOf(sa.size()) );
if (sa != null) {
int k = 0;
for (Iterator i = sa.iterator(); i.hasNext(); ) {
prop.put(key +"-"+ k, (String)i.next());
k++;
}
}
}
/**
* @param prop The Properties set
* @param key the key used to store this property
* @param def a default in case the property cannot be retrieved
*/
public static String[] getStringArray(Properties prop, final String key, final String[] def)
{
try
{
final String[] result = new String[getInteger(prop,key +"-length")];
for (int i = 0; i < result.length; i++)
result[i] = prop.getProperty(key +"-"+ i);
return result;
}
catch (Exception e)
{
return def;
}
}
/**
* @param prop The Properties set
* @param key the key used to store this property
* @param sa the value to store
*/
public static void setStringArray(Properties prop, final String key, String[] sa)
{
prop.put( key +"-length", sa == null ? "0" : String.valueOf(sa.length) );
if (sa != null) for (int i = 0; i < sa.length; i++) prop.put(key +"-"+ i, sa[i]);
}
/**
* @param prop The Properties set
* @param key the key used to store this property
* @param def a default in case the property cannot be retrieved
*/
public static String getString(Properties prop, final String key, final String def)
{
try
{
final String s = prop.getProperty(key);
return s == null ? def : s;
}
catch (Exception e)
{
return def;
}
}
/**
* @param prop The Properties set
* @param key the key used to store this property
* @param s the value to store
*/
public static void setString(Properties prop, final String key, String s)
{
if (s == null) s="";
prop.put(key, s);
}
/**
* @param prop The Properties set
* @param key the key used to store this property
* @param def a default in case the property cannot be retrieved
*/
public static boolean getBoolean(Properties prop, final String key, final boolean def)
{
final String value = prop.getProperty(key);
return value==null ? def : value.equalsIgnoreCase("true");
}
/**
* @param prop The Properties set
* @param key the key used to store this property
* @param value the value to store
*/
public static void setBoolean(Properties prop, final String key, final boolean value)
{
prop.put(key,String.valueOf(value));
}
/**
* @exception NumberFormatException if the property retrieved cannot be converted to <code>int</code>
* @param prop The Properties set
* @param key the key used to store this property
*/
public static int getInteger(Properties prop, final String key) throws NumberFormatException
{
return Integer.parseInt(prop.getProperty(key));
}
/**
* @param prop The Properties set
* @param key the key used to store this property
* @param def a default in case the property cannot be retrieved
*/
public static int getInteger(Properties prop, final String key, final int def)
{
try
{
final String s = prop.getProperty(key);
return s == null ? def : Integer.parseInt(s);
}
catch (Exception e)
{
return def;
}
}
/**
* @param prop The Properties set
* @param key the key used to store this property
* @param i the value to store
*/
public static void setInteger(Properties prop, final String key, final int i)
{
prop.put(key, String.valueOf(i));
}
/**
* @param prop The Properties set
* @param key the key used to store this property
* @param f the value to store
*/
public static void setFloat(Properties prop, final String key, final float f)
{
prop.put(key, String.valueOf(f));
}
/**
* @param prop The Properties set
* @param key the key used to store this property
* @param def a default in case the property cannot be retrieved
*/
public static float getFloat(Properties prop, final String key, final float def)
{
try
{
final String s = prop.getProperty(key);
return s == null ? def : Float.parseFloat(s);
}
catch (Exception e)
{
return def;
}
}
public static void setURL(Properties prop, final String key, final URL url)
{
prop.put(key,url.toString());
}
/**
* Load a URL from a properties file. If the URL begins with / it is taken to be a
* system resource (i.e. on the classpath).
*/
public static URL getURL(Properties prop, final String key, final URL def)
{
String p = prop.getProperty(key);
if (p == null) return def;
try
{
return new URL(p);
}
catch (java.net.MalformedURLException x)
{
URL url = Application.getApplication().getClass().getResource(p);
return url == null ? def : url;
}
}
/**
* Translates a string by substituting tokens of the form {name} to the
* value of property name in the properties set.
* @param prop The properties set
* @param in The string to be translated
* @return The resulting string.
*/
public static String translate(Properties prop,String in)
{
if (in == null) return null;
StringBuffer out = null; // avoid creating if unnecessary
int l = in.length();
int pos = 0;
while (pos < l)
{
int start = in.indexOf('{',pos);
if (start < 0) break;
int end = in.indexOf('}',start);
if (end < 0 || end-start < 2) break;
if (out == null) out = new StringBuffer(in.substring(0,start));
else out.append(in.substring(pos,start));
String value = prop.getProperty(in.substring(start+1,end));
if (value != null) out.append(value);
pos = end+1;
}
if (out == null) return in;
if (pos<l) out.append(in.substring(pos));
return out.toString();
}
/**
* Creates a TableModel from a property set
*/
public static class PropertyTable extends AbstractTableModel implements Comparator
{
private List list;
PropertyTable(Properties prop)
{
list = new ArrayList(prop.entrySet());
Collections.sort(list,this);
}
public int compare(Object o1, Object o2)
{
Map.Entry entry1 = (Map.Entry) o1;
Map.Entry entry2 = (Map.Entry) o2;
String name1 = entry1.getKey().toString();
String name2 = entry2.getKey().toString();
return name1.compareTo(name2);
}
public int getRowCount() { return list.size(); }
public int getColumnCount() { return 2; }
public Object getValueAt(int row, int column)
{
Map.Entry entry = (Map.Entry) list.get(row);
return column == 0 ? entry.getKey() : entry.getValue();
}
public String getColumnName(int col)
{
return col == 0 ? "Property" : "Value";
}
}
/**
* A Properties object whose values and defaults are automatically translated
* if they contain {prop} tokens.
* @see #translate(Properties,String)
*/
// TODO: Protect against recursive translation?
public static class TranslatedProperties extends Properties
{
public TranslatedProperties()
{
super();
}
public TranslatedProperties(Properties def)
{
super(def);
}
public String getProperty(String key)
{
return PropertyUtilities.translate(this,super.getProperty(key));
}
public String getProperty(String key, String def)
{
return PropertyUtilities.translate(this,super.getProperty(key,def));
}
}
}