/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Bob Foster - The color manager idea; XSWT top-level node idea; some other
* important stuff
* David Orme (ASC) - Rewrote: switched to a reflection-based implementation
* Yu You - Rewrite: switch to DataParser to manage the resource dispose
******************************************************************************/
package com.swtworkbench.community.xswt.dataparser.parsers;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;
import com.swtworkbench.community.xswt.dataparser.NonDisposableDataParser;
/**
* Class ColorDataParser. This class converts between string color
* representations and SWT Color objects.
*
* @author daveo
*/
public abstract class StaticFieldsParser extends NonDisposableDataParser {
private String prefix;
private Map valueMap = null;
private Class fieldsClass;
private Class valueClass;
protected StaticFieldsParser(Class fieldsClass, Class valueClass, String prefix, boolean cache) {
super();
this.fieldsClass = fieldsClass;
this.valueClass = valueClass;
this.prefix = prefix;
if (cache) {
valueMap = new HashMap();
fillValueMap(valueMap);
}
}
private int modifiers = Modifier.PUBLIC | Modifier.STATIC | Modifier.FINAL;
protected void fillValueMap(Map map) {
Field[] fields = fieldsClass.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
if (testField(field)) {
String name = field.getName();
if (prefix == null || name.startsWith(prefix)) {
try {
Object o = field.get(null);
map.put(name, o);
if (prefix != null) {
map.put(name.substring(prefix.length()), o);
}
} catch (IllegalAccessException eIllegalAccess) {
}
}
}
}
}
private boolean testField(Field field) {
return field != null && valueClass.equals(field.getType()) && (field.getModifiers() & modifiers) == modifiers;
}
/*
* (non-Javadoc)
*
* @see com.swtworkbench.community.xswt.dataparser.IDataParser#parse(java.lang.String)
*/
public Object parse(String source) {
if (valueMap != null) {
return valueMap.get(source);
}
Field field = null;
try {
field = fieldsClass.getField(source);
} catch (SecurityException e2) {
} catch (NoSuchFieldException e2) {
}
if (field == null && prefix != null && source.startsWith(prefix)) {
try {
field = fieldsClass.getField(source.substring(prefix.length()));
} catch (SecurityException e2) {
} catch (NoSuchFieldException e2) {
}
}
if (testField(field)) {
try {
return field.get(null);
} catch (IllegalAccessException eIllegalAccess) {
}
}
return null;
}
}