- } else if (encodedValue.equals("NULL") || encodedValue.equals("null")) {
- return null;
- } else if (encodedValue.endsWith("\"")) {
- return decodeString(encodedValue);
- } else if (encodedValue.equals("true")) {
- return true;
- } else if (encodedValue.equals("false")) {
- return false;
- } else if (encodedValue.endsWith("b")) {
- return Byte.parseByte(cut);
- } else if (encodedValue.endsWith("c")) {
- return decodeString(cut).charAt(0);
- } else if (encodedValue.endsWith("s")) {
- return Short.parseShort(cut);
- } else if (encodedValue.endsWith("L")) {
- return Long.parseLong(cut);
- } else if (encodedValue.endsWith("F")) {
- return Float.parseFloat(cut);
- } else if (encodedValue.endsWith("d")) {
- return Double.parseDouble(cut);
- } else {
- return Integer.parseInt(encodedValue);
+ } catch (Exception e) {
+ if (e instanceof UnknownFormatConversionException) {
+ throw (UnknownFormatConversionException) e;
+ }
+ throw new UnknownFormatConversionException(e.getMessage());
+ }
+ }
+
+ /**
+ * Return the corresponding class or throw an {@link Exception} if it
+ * cannot.
+ *
+ * @param type
+ * the class name to look for
+ *
+ * @return the class (will never be NULL)
+ *
+ * @throws ClassNotFoundException
+ * if the class cannot be found
+ * @throws NoSuchMethodException
+ * if the class cannot be created (usually because it or its
+ * enclosing class doesn't have an empty constructor)
+ */
+ static private Class<?> getClass(String type)
+ throws ClassNotFoundException, NoSuchMethodException {
+ Class<?> clazz = null;
+ try {
+ clazz = Class.forName(type);
+ } catch (ClassNotFoundException e) {
+ int pos = type.length();
+ pos = type.lastIndexOf(".", pos);
+ if (pos >= 0) {
+ String parentType = type.substring(0, pos);
+ String nestedType = type.substring(pos + 1);
+ Class<?> javaParent = null;
+ try {
+ javaParent = getClass(parentType);
+ parentType = javaParent.getName();
+ clazz = Class.forName(parentType + "$" + nestedType);
+ } catch (Exception ee) {
+ }
+
+ if (javaParent == null) {
+ throw new NoSuchMethodException(
+ "Class not found: "
+ + type
+ + " (the enclosing class cannot be created: maybe it doesn't have an empty constructor?)");
+ }
+ }
+ }
+
+ if (clazz == null) {
+ throw new ClassNotFoundException("Class not found: " + type);
+ }
+
+ return clazz;
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ private static Enum<?> decodeEnum(String escaped) {
+ // escaped: be.xxx.EnumType.VALUE;
+ int pos = escaped.lastIndexOf(".");
+ String type = escaped.substring(0, pos);
+ String name = escaped.substring(pos + 1, escaped.length() - 1);
+
+ try {
+ return Enum.valueOf((Class<Enum>) getClass(type), name);
+ } catch (Exception e) {
+ throw new UnknownFormatConversionException("Unknown enum: <" + type
+ + "> " + name);