|
What this is
Other links
The source code
/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is NetBeans. The Initial Developer of the Original
* Code is Sun Microsystems, Inc. Portions Copyright 1997-2003 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.modules.schema2beansdev.gen;
import java.util.*;
import java.io.*;
/**
* Various utility methods dealing with Java
*/
public class JavaUtil {
// This class is not for instantiating.
private JavaUtil() {
}
/**
* Convert primitives into Objects and leave objects as is.
* @param expr the text expression representing some value
* @param classType the current type of @param expr
* ('age', 'int') -> 'new java.lang.Integer(age)'
* ('age', 'Integer') -> 'age'
*/
static public String toObject(String expr, String classType) {
classType = classType.intern();
if ("boolean" == classType)
return "("+expr+" ? java.lang.Boolean.TRUE : java.lang.Boolean.FALSE)";
else {
String objClass = (String) toObjectType.get(classType);
if (objClass == null) {
return expr;
}
return "new "+objClass+"("+expr+")";
}
}
static public String toObject(String expr, String classType, boolean j2me) {
if (j2me) {
if ("boolean".equals(classType))
return "new java.lang.Boolean("+expr+")";
}
return toObject(expr, classType);
}
static private Map toObjectType;
static {
toObjectType = new HashMap();
toObjectType.put("int", "java.lang.Integer");
toObjectType.put("char", "java.lang.Character");
toObjectType.put("long", "java.lang.Long");
toObjectType.put("short", "java.lang.Short");
toObjectType.put("byte", "java.lang.Byte");
toObjectType.put("float", "java.lang.Float");
toObjectType.put("double", "java.lang.Double");
toObjectType.put("boolean", "java.lang.Boolean");
}
/**
* Take a Java primitive and return it's object type.
* Return the same type if there isn't an object version.
*/
static public String toObjectType(String classType) {
String objClass = (String) toObjectType.get(classType);
if (objClass == null)
return classType;
return objClass;
}
static private Map fromObjectType;
static {
fromObjectType = new HashMap();
fromObjectType.put("java.lang.Integer", "int");
fromObjectType.put("java.lang.Character", "char");
fromObjectType.put("java.lang.Long", "long");
fromObjectType.put("java.lang.Short", "short");
fromObjectType.put("java.lang.Byte", "byte");
fromObjectType.put("java.lang.Float", "float");
fromObjectType.put("java.lang.Double", "double");
fromObjectType.put("java.lang.Boolean", "boolean");
fromObjectType.put("Integer", "int");
fromObjectType.put("Character", "char");
fromObjectType.put("Long", "long");
fromObjectType.put("Short", "short");
fromObjectType.put("Byte", "byte");
fromObjectType.put("Float", "float");
fromObjectType.put("Double", "double");
fromObjectType.put("Boolean", "boolean");
}
/**
* Take a Java boxed object (like Integer) and return it's primitive type.
* Return the same type if there isn't a primitive version.
*/
static public String fromObjectType(String classType) {
String objClass = (String) fromObjectType.get(classType);
if (objClass == null)
return classType;
return objClass;
}
/**
* Convert expr into a String. Similar to toObject.
* @param expr the value to convert into a String
* @param type is the name of the current type
* ('String', 'value') -> 'value'
* ('int', '42') -> '""+42'
* ('Integer', 'age') -> 'age.toString()'
*/
static public String typeToString(String type, String expr) {
type = (type == null) ? null : type.intern();
if ("String" == type || "java.lang.String" == type)
return expr;
if (type == "java.util.Calendar")
return "java.text.DateFormat.getInstance().format("+expr+".getTime())"; // See JavaBeansUtil for correctly printing out XML Schema format
if (type == "boolean")
return expr+" ? \"true\" : \"false\"";
if (isPrimitiveType(type))
return "\"\"+"+expr;
return expr+".toString()";
}
/**
* @param expr is an Object type, and we will convert it
* to a primitive.
* eg: ('java.lang.Double', expr) -> '(java.lang.Double) expr'
* eg: ('int', 'obj') -> '((java.lang.Integer)obj).intValue()'
*/
static public String fromObject(String type, String expr) {
type = type.intern();
if (type == "int")
return "((java.lang.Integer)"+expr+").intValue()";
if (type == "long")
return "((java.lang.Long)"+expr+").longValue()";
if (type == "short")
return "((java.lang.Short)"+expr+").shortValue()";
if (type == "byte")
return "((java.lang.Byte)"+expr+").byteValue()";
if (type == "float")
return "((java.lang.Float)"+expr+").floatValue()";
if (type == "double")
return "((java.lang.Double)"+expr+").doubleValue()";
if (type == "char")
return "((java.lang.Character)"+expr+").charValue()";
if (type == "boolean")
return "((java.lang.Boolean)"+expr+").booleanValue()";
return "("+type+")"+expr;
}
/**
* Is @param className immutable? An immutable object can hold state,
* but after it's been constructed that state cannot change.
*/
static public boolean isImmutable(String className) {
className = className.intern();
return immutableTable.containsKey(className);
}
static private Map immutableTable;
static {
immutableTable = new HashMap();
immutableTable.put("String", null);
immutableTable.put("java.lang.String", null);
immutableTable.put("int", null);
immutableTable.put("short", null);
immutableTable.put("long", null);
immutableTable.put("boolean", null);
immutableTable.put("char", null);
immutableTable.put("float", null);
immutableTable.put("double", null);
immutableTable.put("byte", null);
immutableTable.put("java.lang.Boolean", null);
immutableTable.put("java.lang.Byte", null);
immutableTable.put("java.lang.Character", null);
immutableTable.put("java.lang.Double", null);
immutableTable.put("java.lang.Float", null);
immutableTable.put("java.lang.Integer", null);
immutableTable.put("java.lang.Long", null);
immutableTable.put("java.lang.Short", null);
immutableTable.put("Boolean", null);
immutableTable.put("Byte", null);
immutableTable.put("Character", null);
immutableTable.put("Double", null);
immutableTable.put("Float", null);
immutableTable.put("Integer", null);
immutableTable.put("Long", null);
immutableTable.put("Short", null);
immutableTable.put("java.math.BigInteger", null);
immutableTable.put("java.math.BigDecimal", null);
immutableTable.put("javax.xml.namespace.QName", null);
immutableTable.put("org.netbeans.modules.schema2beans.QName", null);
immutableTable.put("java.net.URI", null);
}
/**
* Take a String (@param value) and generate Java code to coerce it.
* eg: ('String', "Hello") -> '"Hello"'
* ('int', '10') -> '10'
* ('Integer', '43') -> 'new Integer(43)'
* ('java.util.Locale', 'Locale.US') -> 'Locale.US'
*/
public static String instanceFrom(String type, String value) {
if (type == null)
return value;
type = type.intern();
if (type == "java.lang.String" || type == "String") {
StringBuffer buf = new StringBuffer("\"");
for (int i = 0; i < value.length(); ++i) {
char c = value.charAt(i);
buf.append(escapeCharForInstance(c, '"'));
}
buf.append("\"");
return buf.toString();
}
if (type == "java.lang.Character" || type == "Character") {
return "new "+type+"("+instanceFrom("char", value)+")";
}
if (type == "Double" || type == "java.lang.Double" || type == "Integer" ||
type == "java.lang.Integer" || type == "Boolean" ||
type == "java.lang.Boolean" || type == "Float" ||
type == "java.lang.Float" || type == "Short" ||
type == "java.lang.Short" || type == "Long" ||
type == "java.lang.Long")
return "new "+type+"("+value+")";
if (type == "char[]" || type == "char []")
return instanceFrom("java.lang.String", value)+".toCharArray()";
if (type == "char") {
char c = value.charAt(0);
return "'"+escapeCharForInstance(c, '\'')+"'";
}
if (type == "float")
return value+"f";
if (type == "java.math.BigDecimal" || type == "java.math.BigInteger") {
// We will never need to escape anything inside value here.
return "new "+type+"(\""+value+"\")";
}
return value;
}
/**
* A helper method for instanceFrom. We escape 1 char at a time here.
*/
public static String escapeCharForInstance(char c, char illegalChar) {
if (c == illegalChar)
return "\\"+illegalChar;
if (c == '\\')
return "\\\\";
if (c == '\b')
return "\\b";
if (c == '\t')
return "\\t";
if (c == '\n')
return "\\n";
if (c == '\f')
return "\\f";
if (c == '\r')
return "\\r";
if (c < ' ' || c > '\177')
return uencode(c);
return ""+c;
}
/**
* Convert @param value2 (a literal) to @param type1 and then
* compare that to @param value1.
* @return Java code in a String, that returns negative, 0, or positive
* if value1 < value2, value1 == value2, or value1 > value2.
*
* ("foo", "java.math.BigDecimal", "1") -> 'foo.compareTo(new java.math.BigDecimal("1"))'
*/
public static String compareTo(String value1, String type1, String value2) {
type1 = type1.intern();
String value2Instance = genParseText(type1, value2);
if (isPrimitiveType(type1)) {
if ("\"0\"".equals(value2))
return value1;
return value1+" - "+value2Instance;
}
return value1+".compareTo("+value2Instance+")";
}
/**
* Just like compareTo, but the second value (@param value2Text) is
* unquoted text.
*/
public static String compareToText(String value1, String type1, String value2Text) {
type1 = type1.intern();
if (type1 == "int" || type1 == "short")
return value1+" - "+value2Text;
if (type1 == "long")
return value1+" - "+value2Text+"L";
if (type1 == "float")
return value1+" - "+value2Text+"f";
if (type1 == "double")
return value1+" - "+value2Text+"d";
return compareTo(value1, type1, instanceFrom("java.lang.String", value2Text));
}
public static String genParseText(String type, String expr, boolean j2me) {
if (j2me)
return genParseTextME(type, expr);
else
return genParseText(type, expr);
}
/**
* Take a particular @param type (eg: "java.lang.Integer") and return a
* String that will parse the @param expr and make it into that type.
* The value of @param expr should be a String.
* eg: ('java.lang.Integer', 'node.getNodeValue()')
* -> 'new java.lang.Integer(node.getNodeValue())'
*/
public static String genParseText(String type, String expr) {
if (type == null)
return expr;
type = type.intern();
if (type == "java.lang.String" || type == "String")
return expr;
if (type == "boolean")
return "java.lang.Boolean.valueOf("+expr+").booleanValue()";
if (type == "java.lang.Boolean" || type == "Boolean")
return "java.lang.Boolean.valueOf("+expr+")";
if (type == "java.lang.Integer" || type == "Integer" || type == "java.lang.Long" || type == "Long" || type == "java.lang.Short" || type == "Short" || type == "java.lang.Float" || type == "Float" || type == "java.lang.Double" || type == "Double" || type == "java.lang.Byte" || type == "Byte" || type == "java.math.BigDecimal" || type == "BigDecimal" || type == "java.math.BigInteger" || type == "BigInteger" || type == "java.lang.StringBuffer" || type == "StringBuffer" || type == "java.text.MessageFormat" || type == "java.text.AttributedString" || type == "java.util.StringTokenizer" || type == "java.net.URI" || type == "javax.xml.namespace.QName" || type == "org.netbeans.modules.schema2beans.QName" || type == "java.io.File") { // NOI18N
return "new "+type+"("+expr+")"; // NOI18N
}
if (type == "java.lang.Character")
return "new java.lang.Character(("+expr+").charAt(0))";
if (type == "char[]" || type == "char []")
return "("+expr+").toCharArray()";
if (type == "long")
return "Long.parseLong("+expr+")";
if (type == "int")
return "Integer.parseInt("+expr+")";
if (type == "byte")
return "Byte.parseByte("+expr+")";
if (type == "short")
return "Short.parseShort("+expr+")";
if (type == "float")
return "Float.parseFloat("+expr+")";
if (type == "double")
return "Double.parseDouble("+expr+")";
if (type == "char")
return "("+expr+").charAt(0)";
if ("java.util.Date"== type)
return "java.text.DateFormat.getInstance().parse("+expr+")";
if ("javax.xml.soap.SOAPElement" == type)
return "javax.xml.soap.SOAPElementFactory.newInstance().create("+expr+").addTextNode("+expr+")"; // The parameter to create probably isn't quite correct.
// See JavaBeansUtil for correctly printing out XML Schema format of java.util.Calendar
return "/* UNKNOWN type for parsing:"+type+"*/ "+expr;
}
/**
* Take a particular @param type (eg: "java.lang.Integer") and return a
* String that will parse the @param expr and make it into that type.
* The value of @param expr should be a String.
* These work in *MIDP/J2ME*.
* eg: ('java.lang.Integer', 'node.getNodeValue()')
* -> 'new java.lang.Integer(node.getNodeValue())'
*/
static public String genParseTextME(String type, String name) {
String parm = name;
type = type.intern();
if (type == "String" || type == "java.lang.String")
return parm;
else if (type == "int")
parm = "java.lang.Integer.parseInt(" + name + ")";
else if(type == "short")
parm = "java.lang.Short.parseShort(" + name + ")";
else if(type == "long")
parm = "java.lang.Long.parseLong(" + name + ")";
else if (type == "boolean")
parm = "(\"true\".equals("+name+") || \"1\".equals("+name+") || \"TRUE\".equals("+name+") || \"True\".equals("+name+"))";
else if (type == "char")
parm = name + ".charAt(0)";
else if ("char[]" == type)
parm = name+".toCharArray()";
else if ("java.lang.Integer" == type)
parm = "new java.lang.Integer("+genParseTextME("int", name)+")";
else if ("java.lang.Long" == type)
parm = "new java.lang.Long("+genParseTextME("long", name)+")";
else if ("java.lang.Boolean" == type) {
// The .TRUE or .FALSE trick doesn't seem to compile.
//parm = "("+genParseTextME("boolean", name)+") ? java.lang.Boolean.TRUE : java.lang.Boolean.FALSE";
parm = "new java.lang.Boolean("+genParseTextME("boolean", name)+")";
} else if (type == "double")
parm = "java.lang.Double.parseDouble(" + name + ")";
else if (type == "float")
parm = "java.lang.Float.parseFloat(" + name + ")";
else if (type == "byte")
parm = "java.lang.Byte.parseByte(" + name + ")";
else if ("java.lang.Short" == type)
parm = "new "+type+"("+genParseTextME("short", name)+")";
else if ("java.lang.Byte" == type)
parm = "new "+type+"("+genParseTextME("byte", name)+")";
else if ("java.lang.Double" == type
|| "java.lang.Float" == type
|| "java.lang.StringBuffer" == type
|| "java.math.BigInteger" == type
|| "java.math.BigDecimal" == type)
parm = "new "+type+"("+name+")";
/*
else if ("java.util.Date" == type)
parm = "???";
*/
else if ("java.lang.Character" == type)
parm = "new "+type+"("+name+".charAt(0))";
return parm;
}
/**
* Take a particular @param type (eg: "java.lang.Integer") and return a
* String that will parse the @param expr, making it into that type,
* and storing the value into @param var.
* The value of @param expr should be a String.
*/
public static String genParseText(String type, String expr, String var) {
return genParseText(type, expr, var, false);
}
public static String genParseText(String type, String expr, String var,
boolean j2me) {
if (type == null)
return expr;
type = type.intern();
StringBuffer out = new StringBuffer();
if (type == "java.util.Calendar") {
// See JavaBeansUtil for correctly printing out XML Schema format of java.util.Calendar
out.append(var);
out.append(" = ");
out.append("java.util.Calendar.getInstance(); ");
out.append(var);
out.append(".setTime(java.text.DateFormat.getInstance().parse(");
out.append(expr);
out.append("));");
} else {
out.append(var);
out.append(" = ");
out.append(genParseText(type, expr, j2me));
out.append(";");
}
return out.toString();
}
/**
* What exceptions might we encounter from doing the result of
* genParseText. These exceptions are ones that we'd have to declare.
*/
public static List exceptionsFromParsingText(String type) {
return exceptionsFromParsingText(type, true);
}
public static List exceptionsFromParsingText(String type, boolean fromParsing) {
List result = new ArrayList();
if (type == null)
return result;
type = type.intern();
if (type == "java.net.URI")
result.add("java.net.URISyntaxException");
if (fromParsing && type == "java.util.Calendar")
result.add("java.text.ParseException");
return result;
}
public static boolean isPrimitiveType(String className) {
if (className == null)
return false;
className = className.intern();
return ("long" == className || "int" == className ||
"char" == className || "short" == className ||
"double" == className || "float" == className ||
"byte" == className || "boolean" == className);
}
public static Class getPrimitive(String className) {
className = className.intern();
if (className == "int")
return Integer.TYPE;
if (className == "long")
return Long.TYPE;
if (className == "float")
return Float.TYPE;
if (className == "double")
return Double.TYPE;
if (className == "byte")
return Byte.TYPE;
if (className == "boolean")
return Boolean.TYPE;
if (className == "char")
return Character.TYPE;
if (className == "short")
return Short.TYPE;
if (className == "void")
return Void.TYPE;
return null;
}
public static boolean canProduceNoXMLMetaChars(String className) {
className = fromObjectType(className).intern();
return ("long" == className || "int" == className ||
"short" == className ||
"double" == className || "float" == className ||
"byte" == className || "boolean" == className ||
"java.math.BigDecimal" == className ||
"java.math.BigInteger" == className);
}
public static String nullValueForType(String type) {
type = type.intern();
if (type == "long" || type == "int" || type == "short" || type == "char" || type == "byte")
return "0";
if (type == "double")
return "0.0";
if (type == "float")
return "0.0f";
if (type == "boolean")
return "false";
return "null";
}
/**
* @param type is the name of a class
* @return a default value for that type.
* eg: X -> new X()
* java.math.BigDecimal -> new java.math.BigDecimal("0")
* Integer -> new Integer("0")
*/
public static String genNewDefault(String type) {
type = type.intern();
if ("java.lang.String" == type || "String" == type)
return "\"\"";
if (isPrimitiveType(type))
return nullValueForType(type);
if (type == "java.lang.Boolean" || type == "Boolean")
return "java.lang.Boolean.FALSE";
if (type == "java.lang.Integer" || type == "Integer" || type == "java.lang.Long" || type == "Long" || type == "java.lang.Short" || type == "Short" || type == "java.lang.Float" || type == "Float" || type == "java.lang.Double" || type == "Double" || type == "java.lang.Byte" || type == "Byte" || type == "java.math.BigInteger" || type == "BigInteger" || type == "java.math.BigDecimal" || type == "BigDecimal") { // NOI18N
return "new "+type+"(\"0\")"; // NOI18N
}
if (type == "java.net.URI" || type == "javax.xml.namespace.QName" || type == "org.netbeans.modules.schema2beans.QName")
return "new "+type+"(\"\")"; // NOI18N
if (type == "java.lang.Character")
return "new java.lang.Character('0')";
if (type == "java.util.Calendar")
return "java.util.Calendar.getInstance()";
if (type == "byte[]")
return "new byte[0]";
return "new "+type+"()";
}
/**
* Given a scalar type, figure out how to make it into an int
* (ie, hash code).
*/
static public String exprToInt(String type, String expr) {
type = type.intern();
if (type == "boolean")
return expr+" ? 0 : 1";
else if (type == "byte" || type == "char" || type == "short")
return "(int) "+expr;
else if (type == "int")
return expr;
else if (type == "long")
return "(int)("+expr+"^("+expr+">>>32))";
else if (type == "float")
return "Float.floatToIntBits("+expr+")";
else if (type == "double")
return exprToInt("long", "Double.doubleToLongBits("+expr+")");
else
return "("+expr+").hashCode()";
}
/**
* @return an expression to compare to expressions; this can be put right
* into an if statement.
* ('int', 'var1', 'var2') -> 'var1 == var2'
* ('String', 'word', '"hello"') -> 'word == null ? "hello" == null : word.equals("hello")'
* ('float', 'var1', 'var2') -> 'Float.floatToIntBits(var1) == Float.floatToIntBits(var2)'
*/
static public String genEquals(String type, String attr1, String attr2) {
return genEquals(type, attr1, attr2, true);
}
/**
* @param attr1CanBeNull whether or not attr1 could be null.
*/
static public String genEquals(String type, String attr1, String attr2,
boolean attr1CanBeNull) {
type = type.intern();
if (type == "float") {
return "Float.floatToIntBits("+attr1+") == Float.floatToIntBits("+attr2+")";
} else if (type == "double") {
return "Double.doubleToLongBits("+attr1+") == Double.doubleToLongBits("+attr2+")";
} else if (isPrimitiveType(type)) {
return attr1+" == "+attr2;
} else if (attr1CanBeNull) {
return attr1+" == null ? "+attr2+" == null : "+attr1+".equals("+attr2+")";
} else {
return attr1+".equals("+attr2+")";
}
}
/**
* Looks for the class and sees if it's cloneable.
*/
public static boolean isCloneable(String className) {
if (className == null)
return false;
className = className.intern();
if (className == "java.util.Calendar")
return true;
try {
//System.out.println("Looking for class: "+className);
Class cls = Class.forName(className);
if (cls == null)
return false;
//System.out.println("Found it");
if (Cloneable.class.isAssignableFrom(cls)) {
System.out.println(className+" is cloneable.");
return true;
}
return false;
} catch (ClassNotFoundException e) {
return false;
}
}
/**
* Is the class not an interface and not abstract; i.e., it's possible
* to call a constructor on this class. (Note that primitives fail.)
*/
public static boolean isInstantiable(String className) {
if (className == null)
return false;
className = className.intern();
if (className == "String" || className == "java.lang.String")
return true;
try {
//System.out.println("Looking for class: "+className);
Class cls = Class.forName(className);
if (cls == null)
return false;
//System.out.println("Found it: result="+cls.isInterface());
if (cls.isInterface())
return false;
if (java.lang.reflect.Modifier.isAbstract(cls.getModifiers()))
return false;
return true;
} catch (ClassNotFoundException e) {
if (className.indexOf('.') < 0)
return isInstantiable("java.lang."+className);
return false;
}
}
/**
* checkValueToType will make sure that a given value is
* acceptable for a given type. To make the problem more
* tractable, this is limited to simple types.
* eg:
* ("java.lang.Integer", "1") -> true
* ("java.lang.Integer", "1.5") -> false
* ("java.lang.String", "ksadjflkjas24#@") -> true
* ("short", "12345") -> true
* ("short", "123456") -> false
* Note that the 'tostr' template in javaGenLibrary.xsl has very
* similar code and any changes should be made there too.
*/
public static boolean checkValueToType(String type, String value) {
//System.out.println("checkValueToType: type="+type+" value='"+value+"'");
// We try to convert it (just like how javaGenLibrary.xsl
// would generate code for). If an IllegalArgumentException
// is thrown, then it's the wrong value for that type.
try { // BEGIN_NOI18N
if ("java.lang.String".equals(type) || "char[]".equals(type)
|| "char []".equals(type) || "char".equals(type)
|| "Character".equals(type) || "String".equals(type)
|| "java.lang.Character".equals(type))
return true;
else if ("long".equals(type))
Long.parseLong(value);
else if ("int".equals(type))
Integer.parseInt(value);
else if ("byte".equals(type))
Byte.parseByte(value);
else if ("short".equals(type))
Short.parseShort(value);
else if ("float".equals(type))
Float.parseFloat(value);
else if ("double".equals(type))
Double.parseDouble(value);
else if ("boolean".equals(type))
Boolean.valueOf(value).booleanValue();
else if ("java.lang.Double".equals(type))
new java.lang.Double(value);
else if ("java.lang.Integer".equals(type))
new java.lang.Integer(value);
else if ("java.lang.Boolean".equals(type))
new java.lang.Boolean(value);
else if ("java.lang.Float".equals(type))
new java.lang.Float(value);
else if ("java.lang.Short".equals(type))
new java.lang.Short(value);
else if ("java.lang.Long".equals(type))
new java.lang.Long(value);
else if ("java.math.BigDecimal".equals(type))
new java.math.BigDecimal(value);
else if ("java.math.BigInteger".equals(type))
new java.math.BigInteger(value);
else if ("java.lang.StringBuffer".equals(type))
new java.lang.StringBuffer(value);
else if ("java.text.MessageFormat".equals(type))
new java.text.MessageFormat(value);
else if ("java.text.AttributedString".equals(type))
new java.text.AttributedString(value);
else if ("java.util.StringTokenizer".equals(type))
new java.util.StringTokenizer(value);
else { // END_NOI18N
/*
// Should do some reflection and see if a valueOf method
// exists and takes a single String as an argument.
Class clz = getClass(type);
if (clz != null) {
java.lang.reflect.Method meth =
clz.getMethod("valueOf", new Class[] {String.class});
if (meth == null || !Modifier.isStatic(meth.getModifiers())) {
return false;
}
} else {
return false;
}
// Could try to invoke the method too, but do we
// really want to invoke a method from some random class.
*/
if ("".equals(value)) // NOI18N
return false; // Hack, should check value
return true; // for now
}
} catch (IllegalArgumentException e) {
return false;
/*
} catch (java.lang.ClassNotFoundException e) {
LogFlags.lgr.println(LogFlags.DEBUG, LogFlags.module,
LogFlags.DBG_VALIDATE, 100,
"checkValueToType got ClassNotFoundException for type='"+type+"' value='"+value+"'");
return false;
} catch (NoSuchMethodException e) {
LogFlags.lgr.println(LogFlags.DEBUG, LogFlags.module,
LogFlags.DBG_VALIDATE, 100,
"checkValueToType got NoSuchMethodException for type='"+type+"' value='"+value+"'");
return false;
*/
}
return true;
}
static public String baseClassOfArray(String className) {
// Does this handle more than 1 dimensional arrays correctly
if (className.startsWith("[L") && className.endsWith(";")) { // NOI18N
return className.substring(2, className.length()-1);
}
return className.substring(0, className.length()-2);
}
/**
* This will return a name from @param fullClassName where everything upto
* and including the last '.' is removed.
* eg: "java.lang.String[]" -> "String[]"
* "java.util.ArrayList" -> "ArrayList"
*/
static public String baseName(String fullClassName) {
int pos = fullClassName.lastIndexOf('.');
if (pos == -1)
return fullClassName;
return fullClassName.substring(pos+1, fullClassName.length());
}
private static final Class charArrayClass =
java.lang.reflect.Array.newInstance(java.lang.Character.TYPE, 0).getClass();
static public String getCanonicalClassName(Class cls) {
if (charArrayClass.isAssignableFrom(cls))
return "char[]"; // NOI18N
if (cls.isArray())
return baseClassOfArray(cls.getName())+"[]";
return cls.getName();
}
static public int getOptimialHashMapSize(Object[] keys) {
return getOptimialHashMapSize(keys, keys.length * 8);
}
/**
* Using reflection figure out the optimal initial capacity for a
* HashMap given some keys. This uses a load factor of 1.0f.
* By optimal, the table does not need resizing and there are
* no lists (or chaining) being done in a HashMap.Entry.
*
* @param maxSize the point at which to give up (the maximum size to try)
*/
static public int getOptimialHashMapSize(Object[] keys, int maxSize) {
int keyLength = keys.length;
int defaultAnswer = keyLength + 1;
try {
java.lang.reflect.Field tableField = HashMap.class.getDeclaredField("table");
tableField.setAccessible(true);
for (int tableSize = keyLength + 1; tableSize <= maxSize;
tableSize <<= 1) {
//System.out.println("tableSize="+tableSize);
HashMap map = new HashMap(tableSize, 1.0f);
for (int k = 0; k < keyLength; ++k) {
map.put(keys[k], null);
}
Object[] table = (Object[]) tableField.get(map);
int nullCount = 0;
for (int i = 0; i < table.length; ++i) {
//System.out.println("table["+i+"]="+table[i]);
if (table[i] == null)
++nullCount;
}
//System.out.println("nullCount="+nullCount);
if (table.length - nullCount != keyLength) {
//System.out.println("A list had begun.");
continue;
}
return table.length;
}
} catch (java.lang.IllegalAccessException e) {
return defaultAnswer;
} catch (java.lang.NoSuchFieldException e) {
return defaultAnswer;
}
return defaultAnswer;
}
// Convert the @param in stream using native2ascii, assuming it's already
// UTF-8 encoded.
static public void native2ascii(Writer out, Reader in) throws java.io.IOException {
FilterWriter n2afilter = new N2AFilter(out);
copyStream(n2afilter, in);
}
static public class N2AFilter extends FilterWriter {
public N2AFilter(Writer writer) {
super(writer);
}
public void write(char[] cbuf) throws IOException {
write(cbuf, 0, cbuf.length);
}
public void write(int c) throws IOException {
write((char) c);
}
public void write(char c) throws IOException {
//System.out.println("c="+c);
if(c > '\177') {
out.write(uencode(c));
} else {
out.write(c);
}
}
public void write(char ac[], int off, int len) throws IOException {
int end = off+len;
for (int k = off; k < end; k++) {
write(ac[k]);
}
}
public void write(String str) throws IOException {
write(str.toCharArray(), 0, str.length());
}
public void write(String str, int off, int len) throws IOException {
write(str.toCharArray(), off, len);
}
}
/**
* Take a character and return the \ u (Unicode) representation of it.
*/
public static String uencode(char c) {
StringBuffer result = new StringBuffer("\\u");
String s1 = Integer.toHexString(c);
StringBuffer stringbuffer = new StringBuffer(s1);
stringbuffer.reverse();
int l = 4 - stringbuffer.length();
for(int i1 = 0; i1 < l; i1++)
stringbuffer.append('0');
for(int j1 = 0; j1 < 4; j1++)
result.append(stringbuffer.charAt(3 - j1));
return result.toString();
}
public static final int BUFFER_SIZE = 4096;
/**
* copyStream is not really a Java Utility method, but it's needed by
* one of them, and so is here.
* @return the total length of the stream (in char's) copied.
*/
public static int copyStream(Writer out, Reader in) throws java.io.IOException {
int len;
int totalLength = 0;
char[] buf = new char[BUFFER_SIZE];
while ((len = in.read(buf, 0, BUFFER_SIZE)) != -1) {
out.write(buf, 0, len);
totalLength += len;
}
out.flush();
return totalLength;
}
/**
* copyStream is not really a Java Utility method, but it's needed by
* one of them, and so is here.
* @return the total length of the stream (in char's) copied.
*/
public static int copyStream(OutputStream out, InputStream in) throws java.io.IOException {
int len;
int totalLength = 0;
byte[] buf = new byte[BUFFER_SIZE];
while ((len = in.read(buf, 0, BUFFER_SIZE)) != -1) {
out.write(buf, 0, len);
totalLength += len;
}
out.flush();
return totalLength;
}
static public class InputMonitor implements Runnable {
private InputStream is;
private OutputStream out;
public InputMonitor(InputStream is, OutputStream out) {
this.is = is;
this.out = out;
}
/**
* Copy the contents of the InputStream to the Writer.
* Remember to close the InputStream or else this Thread will
* never end.
*/
public void run() {
//System.out.println("Starting InputMonitor thread");
try {
int c;
while ((c = is.read()) != -1) {
byte ch = (byte)c;
out.write(ch);
}
out.flush();
} catch (java.io.IOException e) {
try {
out.write(e.getMessage().getBytes());
} catch (java.io.IOException e2) {
// try only once.
}
}
//System.out.println("Finished InputMonitor thread");
}
}
private static Map reservedWords;
static {
reservedWords = new HashMap();
reservedWords.put("abstract", "_abstract");
reservedWords.put("assert", "_assert");
reservedWords.put("boolean", "_boolean");
reservedWords.put("break", "_break");
reservedWords.put("byte", "_byte");
reservedWords.put("case", "_case");
reservedWords.put("catch", "_catch");
reservedWords.put("char", "_char");
reservedWords.put("class", "_class");
reservedWords.put("const", "_const");
reservedWords.put("continue", "_continue");
reservedWords.put("default", "_default");
reservedWords.put("do", "_do");
reservedWords.put("double", "_double");
reservedWords.put("else", "_else");
reservedWords.put("extends", "_extends");
reservedWords.put("false", "_false");
reservedWords.put("final", "_final");
reservedWords.put("finally", "_finally");
reservedWords.put("float", "_float");
reservedWords.put("for", "_for");
reservedWords.put("goto", "_goto");
reservedWords.put("if", "_if");
reservedWords.put("implements", "_implements");
reservedWords.put("import", "_import");
reservedWords.put("instanceof", "_instanceof");
reservedWords.put("int", "_int");
reservedWords.put("interface", "_interface");
reservedWords.put("long", "_long");
reservedWords.put("native", "_native");
reservedWords.put("new", "_new");
reservedWords.put("null", "_null");
reservedWords.put("package", "_package");
reservedWords.put("private", "_private");
reservedWords.put("protected", "_protected");
reservedWords.put("public", "_public");
reservedWords.put("return", "_return");
reservedWords.put("short", "_short");
reservedWords.put("static", "_static");
reservedWords.put("strictfp", "_strictfp");
reservedWords.put("super", "_super");
reservedWords.put("switch", "_switch");
reservedWords.put("synchronized", "_synchronized");
reservedWords.put("this", "_this");
reservedWords.put("throw", "_throw");
reservedWords.put("throws", "_throws");
reservedWords.put("transient", "_transient");
reservedWords.put("true", "_true");
reservedWords.put("try", "_try");
reservedWords.put("void", "_void");
reservedWords.put("volatile", "_volatile");
reservedWords.put("while", "_while");
}
public static boolean reservedWord(String name) {
return reservedWords.containsKey(name);
}
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.