OgnlValueFormatter.java
package com.gh.mygreen.xlsmapper.xml;
/**
* Javaのオブジェクトを<a href="http://s2container.seasar.org/2.4/ja/ognl.html" target="_blank">OGNL形式</a>の文字列に変換します。
* <ul>
* <li>このクラスは、{@link XmlBuilder}でアノテーション定義用のXMLを組み立てるために利用します。</li>
* <li>アノテーションで利用可能な属性の型(プリミティブ型/String/Class/列挙型、それらの一次元配列)に対応しています。</li>
* <li>プリミティブ型のラッパークラスは、プリミティブ型の形式に変換して処理されます。</li>
* </ul>
*
* @since 1.1
* @author T.TSUCHIE
*
*/
public class OgnlValueFormatter {
/**
* JavaオブジェクトをOGNL式に変換する。
* @param value 変換対象のオブジェクト。
* @return OGNL式。
* @throws IllegalArgumentException value class type is not supported.
*/
public String format(final Object value) {
if(value == null) {
return "null";
}
final Class<?> clazz = value.getClass();
if(clazz.isPrimitive()) {
if(clazz.equals(Boolean.TYPE)) {
return format((boolean) value);
} else if(clazz.equals(Byte.TYPE)) {
return format((byte) value);
} else if(clazz.equals(Character.TYPE)) {
return format((char) value);
} else if(clazz.equals(Short.TYPE)) {
return format((short) value);
} else if(clazz.equals(Integer.TYPE)) {
return format((int) value);
} else if(clazz.equals(Long.TYPE)) {
return format((long) value);
} else if(clazz.equals(Float.TYPE)) {
return format((float) value);
} else if(clazz.equals(Double.TYPE)) {
return format((double) value);
}
} else if(clazz.isArray()) {
if(value instanceof boolean[]) {
return format((boolean[]) value);
} else if(value instanceof char[]) {
return format((char[]) value);
} else if(value instanceof byte[]) {
return format((byte[]) value);
} else if(value instanceof short[]) {
return format((short[]) value);
} else if(value instanceof int[]) {
return format((int[]) value);
} else if(value instanceof long[]) {
return format((long[]) value);
} else if(value instanceof float[]) {
return format((float[]) value);
} else if(value instanceof double[]) {
return format((double[]) value);
} else if(value instanceof String[]) {
return format((String[]) value);
} else if(value instanceof Enum[]) {
return format((Enum[]) value);
} else if(value instanceof Class[]) {
return format((Class[]) value);
}
} else if(value instanceof String) {
return format((String) value);
} else if(value instanceof Boolean) {
return format((boolean) value);
} else if(value instanceof Byte) {
return format((byte) value);
} else if(value instanceof Character) {
return format((char) value);
} else if(value instanceof Short) {
return format((short) value);
} else if(value instanceof Integer) {
return format((int) value);
} else if(value instanceof Long) {
return format((long) value);
} else if(value instanceof Float) {
return format((float) value);
} else if(value instanceof Double) {
return format((double) value);
} else if(Class.class.isAssignableFrom(clazz)) {
return format((Class<?>) value);
} else if(Enum.class.isAssignableFrom(clazz)) {
return format((Enum<?>) value);
}
throw new IllegalArgumentException(String.format("not support type '%s'.", clazz.getName()));
}
private String format(final boolean value) {
return String.valueOf(value);
}
private String format(final char value) {
return String.format("'\\u%04X'", (int)value);
}
private String format(final byte value) {
return String.format("@Byte@valueOf('%d').byteValue()", value);
}
private String format(final short value) {
return String.format("@Short@valueOf('%d').shortValue()", value);
}
private String format(final int value) {
return String.valueOf(value);
}
private String format(final long value) {
return String.valueOf(value) + "L";
}
private String format(final float value) {
return String.valueOf(value) + "F";
}
private String format(final double value) {
return String.valueOf(value) + "D";
}
private String format(final String value) {
StringBuilder sb = new StringBuilder();
sb.append("\"");
final int len = value.length();
for(int i=0; i < len; i++) {
char c = value.charAt(i);
if(c == '"') {
// エスケープ
sb.append("\\\"");
} else {
sb.append(c);
}
}
sb.append("\"");
return sb.toString();
}
private String format(final Enum<?> value) {
String className = value.getClass().getName();
String itemName = value.name();
return "@" + className + "@" + itemName;
}
private String format(final Class<?> value) {
String className = value.getName();
return "@" + className + "@class";
}
private String format(final boolean[] value) {
StringBuilder sb = new StringBuilder();
sb.append("new boolean[] {");
final int len = value.length;
for(int i=0; i < len; i++) {
sb.append(format(value[i]));
if(i < len - 1) {
sb.append(", ");
}
}
sb.append("}");
return sb.toString();
}
private String format(final char[] value) {
StringBuilder sb = new StringBuilder();
sb.append("new char[] {");
final int len = value.length;
for(int i=0; i < len; i++) {
sb.append(format(value[i]));
if(i < len - 1) {
sb.append(", ");
}
}
sb.append("}");
return sb.toString();
}
private String format(final byte[] value) {
StringBuilder sb = new StringBuilder();
sb.append("new byte[] {");
final int len = value.length;
for(int i=0; i < len; i++) {
sb.append(format(value[i]));
if(i < len - 1) {
sb.append(", ");
}
}
sb.append("}");
return sb.toString();
}
private String format(final short[] value) {
StringBuilder sb = new StringBuilder();
sb.append("new short[] {");
final int len = value.length;
for(int i=0; i < len; i++) {
sb.append(format(value[i]));
if(i < len - 1) {
sb.append(", ");
}
}
sb.append("}");
return sb.toString();
}
private String format(final int[] value) {
StringBuilder sb = new StringBuilder();
sb.append("new int[] {");
final int len = value.length;
for(int i=0; i < len; i++) {
sb.append(format(value[i]));
if(i < len - 1) {
sb.append(", ");
}
}
sb.append("}");
return sb.toString();
}
private String format(final long[] value) {
StringBuilder sb = new StringBuilder();
sb.append("new long[] {");
final int len = value.length;
for(int i=0; i < len; i++) {
sb.append(format(value[i]));
if(i < len - 1) {
sb.append(", ");
}
}
sb.append("}");
return sb.toString();
}
private String format(final float[] value) {
StringBuilder sb = new StringBuilder();
sb.append("new float[] {");
final int len = value.length;
for(int i=0; i < len; i++) {
sb.append(format(value[i]));
if(i < len - 1) {
sb.append(", ");
}
}
sb.append("}");
return sb.toString();
}
private String format(final double[] value) {
StringBuilder sb = new StringBuilder();
sb.append("new double[] {");
final int len = value.length;
for(int i=0; i < len; i++) {
sb.append(format(value[i]));
if(i < len - 1) {
sb.append(", ");
}
}
sb.append("}");
return sb.toString();
}
private String format(final String[] value) {
StringBuilder sb = new StringBuilder();
sb.append("new String[] {");
joinedFormat(value, sb);
sb.append("}");
return sb.toString();
}
private void joinedFormat(final Object[] array, final StringBuilder sb) {
final int len = array.length;
for(int i=0; i < len; i++) {
sb.append(format(array[i]));
if(i < len - 1) {
sb.append(", ");
}
}
}
private String format(final Enum<?>[] value) {
StringBuilder sb = new StringBuilder();
String className = value.getClass().getComponentType().getName();
sb.append(String.format("new %s[] {", className));
joinedFormat(value, sb);
sb.append("}");
return sb.toString();
}
private String format(final Class<?>[] value) {
StringBuilder sb = new StringBuilder();
String className = value.getClass().getComponentType().getName();
sb.append(String.format("new %s[] {", className));
joinedFormat(value, sb);
sb.append("}");
return sb.toString();
}
}