/*******************************************************************************
* Copyright (c) 2000, 2003 Coconut Palm Software, Inc. 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:
* Coconut Palm Software - Initial api and implementation
*******************************************************************************/
package com.swtworkbench.community.xswt.dataparser.parsers;
import java.lang.reflect.Array;
import java.util.HashMap;
import java.util.Map;
import com.swtworkbench.community.xswt.ClassBuilder;
import com.swtworkbench.community.xswt.XSWT;
import com.swtworkbench.community.xswt.XSWTException;
import com.swtworkbench.community.xswt.dataparser.NonDisposableDataParser;
/**
* Parses and resolves java.lang.Class objects
*
* @author djo
*/
public class ClassDataParser extends NonDisposableDataParser {
private ClassBuilder classBuilder;
private XSWT xswt;
public ClassDataParser(XSWT xswt) {
this.xswt = xswt;
}
public ClassDataParser(ClassBuilder classBuilder) {
this.classBuilder = classBuilder;
}
private ClassBuilder getClassBuilder() {
return (xswt != null ? xswt.classBuilder : classBuilder);
}
private static Map wrapperPrimitiveMap = new HashMap();
private static void addPrimitiveType(Class primitive, Class wrapper) {
wrapperPrimitiveMap.put(primitive, wrapper);
wrapperPrimitiveMap.put(wrapper, primitive);
wrapperPrimitiveMap.put(primitive.getName(), primitive);
}
static {
addPrimitiveType(Integer.TYPE, Integer.class);
addPrimitiveType(Byte.TYPE, Byte.class);
addPrimitiveType(Short.TYPE, Short.class);
addPrimitiveType(Long.TYPE, Long.class);
addPrimitiveType(Double.TYPE, Double.class);
addPrimitiveType(Float.TYPE, Float.class);
addPrimitiveType(Boolean.TYPE, Boolean.class);
addPrimitiveType(Character.TYPE, Character.class);
}
public static Class getPrimitiveType(String s) {
return (Class)wrapperPrimitiveMap.get(s);
}
public static Class getPrimitiveType(Class c) {
if (c.isPrimitive()) {
return c;
}
Class pc = (Class)wrapperPrimitiveMap.get(c);
return (pc != null && pc.isPrimitive() ? pc : null);
}
public static Class getObjectClass(Class c) {
if (! c.isPrimitive()) {
return c;
}
Class wc = (Class)wrapperPrimitiveMap.get(c);
return (wc != null ? wc : null);
}
/* (non-Javadoc)
* @see com.swtworkbench.community.xswt.dataparser.IDataParser#parse(java.lang.String)
*/
public Object parse(String source) throws XSWTException {
boolean isArray = source.endsWith("[]");
if (isArray) {
source = source.substring(0, source.length() - 2);
}
String className = source;
int pos = source.lastIndexOf('.');
if (Character.isLowerCase(source.charAt(pos + 1))) {
// Upcasing is needed so that you could use simple class names in
// attribute values without uppercasing them. ie: <model valueType="person"/>
className = XSWT.upperCaseFirstLetter(source.substring(pos + 1));
if (pos > 0) {
className = source.substring(0, pos + 1) + className;
}
}
Class klass = null;
try {
klass = getClassBuilder().getClass(className);
} catch (XSWTException e) {
klass = getPrimitiveType(source);
}
if (klass != null && isArray) {
klass = Array.newInstance(klass, 0).getClass();
}
if (klass == null && Character.isLowerCase(source.charAt(0))) {
klass = (Class)parse(XSWT.upperCaseFirstLetter(source));
}
return klass;
}
}