OgnlValueFormatter.java

  1. package com.gh.mygreen.xlsmapper.xml;

  2. /**
  3.  * Javaのオブジェクトを<a href="http://s2container.seasar.org/2.4/ja/ognl.html" target="_blank">OGNL形式</a>の文字列に変換します。
  4.  * <ul>
  5.  *  <li>このクラスは、{@link XmlBuilder}でアノテーション定義用のXMLを組み立てるために利用します。</li>
  6.  *  <li>アノテーションで利用可能な属性の型(プリミティブ型/String/Class/列挙型、それらの一次元配列)に対応しています。</li>
  7.  *  <li>プリミティブ型のラッパークラスは、プリミティブ型の形式に変換して処理されます。</li>
  8.  * </ul>
  9.  *
  10.  * @since 1.1
  11.  * @author T.TSUCHIE
  12.  *
  13.  */
  14. public class OgnlValueFormatter {
  15.    
  16.     /**
  17.      * JavaオブジェクトをOGNL式に変換する。
  18.      * @param value 変換対象のオブジェクト。
  19.      * @return OGNL式。
  20.      * @throws IllegalArgumentException value class type is not supported.
  21.      */
  22.     public String format(final Object value) {
  23.        
  24.         if(value == null) {
  25.             return "null";
  26.         }
  27.        
  28.         final Class<?> clazz = value.getClass();
  29.         if(clazz.isPrimitive()) {
  30.             if(clazz.equals(Boolean.TYPE)) {
  31.                 return format((boolean) value);
  32.             } else if(clazz.equals(Byte.TYPE)) {
  33.                 return format((byte) value);
  34.             } else if(clazz.equals(Character.TYPE)) {
  35.                 return format((char) value);
  36.             } else if(clazz.equals(Short.TYPE)) {
  37.                 return format((short) value);
  38.             } else if(clazz.equals(Integer.TYPE)) {
  39.                 return format((int) value);
  40.             } else if(clazz.equals(Long.TYPE)) {
  41.                 return format((long) value);
  42.             } else if(clazz.equals(Float.TYPE)) {
  43.                 return format((float) value);
  44.             } else if(clazz.equals(Double.TYPE)) {
  45.                 return format((double) value);
  46.             }
  47.            
  48.         } else if(clazz.isArray()) {
  49.             if(value instanceof boolean[]) {
  50.                 return format((boolean[]) value);
  51.             } else if(value instanceof char[]) {
  52.                 return format((char[]) value);
  53.             } else if(value instanceof byte[]) {
  54.                 return format((byte[]) value);
  55.             } else if(value instanceof short[]) {
  56.                 return format((short[]) value);
  57.             } else if(value instanceof int[]) {
  58.                 return format((int[]) value);
  59.             } else if(value instanceof long[]) {
  60.                 return format((long[]) value);
  61.             } else if(value instanceof float[]) {
  62.                 return format((float[]) value);
  63.             } else if(value instanceof double[]) {
  64.                 return format((double[]) value);
  65.             } else if(value instanceof String[]) {
  66.                 return format((String[]) value);
  67.             } else if(value instanceof Enum[]) {
  68.                 return format((Enum[]) value);
  69.             } else if(value instanceof Class[]) {
  70.                 return format((Class[]) value);
  71.             }
  72.            
  73.         } else if(value instanceof String) {
  74.             return format((String) value);
  75.         } else if(value instanceof Boolean) {
  76.             return format((boolean) value);
  77.         } else if(value instanceof Byte) {
  78.             return format((byte) value);
  79.         } else if(value instanceof Character) {
  80.             return format((char) value);
  81.         } else if(value instanceof Short) {
  82.             return format((short) value);
  83.         } else if(value instanceof Integer) {
  84.             return format((int) value);
  85.         } else if(value instanceof Long) {
  86.             return format((long) value);
  87.         } else if(value instanceof Float) {
  88.             return format((float) value);
  89.         } else if(value instanceof Double) {
  90.             return format((double) value);
  91.         } else if(Class.class.isAssignableFrom(clazz)) {
  92.             return format((Class<?>) value);
  93.         } else if(Enum.class.isAssignableFrom(clazz)) {
  94.             return format((Enum<?>) value);
  95.         }
  96.        
  97.         throw new IllegalArgumentException(String.format("not support type '%s'.", clazz.getName()));
  98.     }
  99.    
  100.     private String format(final boolean value) {
  101.         return String.valueOf(value);
  102.     }
  103.    
  104.     private String format(final char value) {
  105.         return String.format("'\\u%04X'", (int)value);
  106.     }
  107.    
  108.     private String format(final byte value) {
  109.         return String.format("@Byte@valueOf('%d').byteValue()", value);
  110.     }
  111.    
  112.     private String format(final short value) {
  113.         return String.format("@Short@valueOf('%d').shortValue()", value);
  114.     }
  115.    
  116.     private String format(final int value) {
  117.         return String.valueOf(value);
  118.     }
  119.    
  120.     private String format(final long value) {
  121.         return String.valueOf(value) + "L";
  122.     }
  123.    
  124.     private String format(final float value) {
  125.         return String.valueOf(value) + "F";
  126.     }
  127.    
  128.     private String format(final double value) {
  129.         return String.valueOf(value) + "D";
  130.     }
  131.    
  132.     private String format(final String value) {
  133.         StringBuilder sb = new StringBuilder();
  134.         sb.append("\"");
  135.        
  136.         final int len = value.length();
  137.         for(int i=0; i < len; i++) {
  138.             char c = value.charAt(i);
  139.             if(c == '"') {
  140.                 // エスケープ
  141.                 sb.append("\\\"");
  142.             } else {
  143.                 sb.append(c);
  144.             }
  145.         }
  146.        
  147.         sb.append("\"");
  148.         return sb.toString();
  149.     }
  150.    
  151.     private String format(final Enum<?> value) {
  152.        
  153.         String className = value.getClass().getName();
  154.         String itemName = value.name();
  155.        
  156.         return "@" + className + "@" + itemName;
  157.        
  158.     }
  159.    
  160.     private String format(final Class<?> value) {
  161.        
  162.         String className = value.getName();
  163.         return "@" + className + "@class";
  164.        
  165.     }
  166.    
  167.     private String format(final boolean[] value) {
  168.         StringBuilder sb = new StringBuilder();
  169.         sb.append("new boolean[] {");
  170.        
  171.         final int len = value.length;
  172.         for(int i=0; i < len; i++) {
  173.             sb.append(format(value[i]));
  174.            
  175.             if(i < len - 1) {
  176.                 sb.append(", ");
  177.             }
  178.         }
  179.        
  180.         sb.append("}");
  181.        
  182.         return sb.toString();
  183.     }
  184.    
  185.     private String format(final char[] value) {
  186.         StringBuilder sb = new StringBuilder();
  187.         sb.append("new char[] {");
  188.        
  189.         final int len = value.length;
  190.         for(int i=0; i < len; i++) {
  191.             sb.append(format(value[i]));
  192.            
  193.             if(i < len - 1) {
  194.                 sb.append(", ");
  195.             }
  196.         }
  197.        
  198.         sb.append("}");
  199.        
  200.         return sb.toString();
  201.     }
  202.    
  203.     private String format(final byte[] value) {
  204.         StringBuilder sb = new StringBuilder();
  205.         sb.append("new byte[] {");
  206.        
  207.         final int len = value.length;
  208.         for(int i=0; i < len; i++) {
  209.             sb.append(format(value[i]));
  210.            
  211.             if(i < len - 1) {
  212.                 sb.append(", ");
  213.             }
  214.         }
  215.        
  216.         sb.append("}");
  217.        
  218.         return sb.toString();
  219.     }
  220.    
  221.     private String format(final short[] value) {
  222.         StringBuilder sb = new StringBuilder();
  223.         sb.append("new short[] {");
  224.        
  225.         final int len = value.length;
  226.         for(int i=0; i < len; i++) {
  227.             sb.append(format(value[i]));
  228.            
  229.             if(i < len - 1) {
  230.                 sb.append(", ");
  231.             }
  232.         }
  233.        
  234.         sb.append("}");
  235.        
  236.         return sb.toString();
  237.     }
  238.    
  239.     private String format(final int[] value) {
  240.         StringBuilder sb = new StringBuilder();
  241.         sb.append("new int[] {");
  242.        
  243.         final int len = value.length;
  244.         for(int i=0; i < len; i++) {
  245.             sb.append(format(value[i]));
  246.            
  247.             if(i < len - 1) {
  248.                 sb.append(", ");
  249.             }
  250.         }
  251.        
  252.         sb.append("}");
  253.        
  254.         return sb.toString();
  255.     }
  256.    
  257.     private String format(final long[] value) {
  258.         StringBuilder sb = new StringBuilder();
  259.         sb.append("new long[] {");
  260.        
  261.         final int len = value.length;
  262.         for(int i=0; i < len; i++) {
  263.             sb.append(format(value[i]));
  264.            
  265.             if(i < len - 1) {
  266.                 sb.append(", ");
  267.             }
  268.         }
  269.        
  270.         sb.append("}");
  271.        
  272.         return sb.toString();
  273.     }
  274.    
  275.     private String format(final float[] value) {
  276.         StringBuilder sb = new StringBuilder();
  277.         sb.append("new float[] {");
  278.        
  279.         final int len = value.length;
  280.         for(int i=0; i < len; i++) {
  281.             sb.append(format(value[i]));
  282.            
  283.             if(i < len - 1) {
  284.                 sb.append(", ");
  285.             }
  286.         }
  287.        
  288.         sb.append("}");
  289.        
  290.         return sb.toString();
  291.     }
  292.    
  293.     private String format(final double[] value) {
  294.         StringBuilder sb = new StringBuilder();
  295.         sb.append("new double[] {");
  296.        
  297.         final int len = value.length;
  298.         for(int i=0; i < len; i++) {
  299.             sb.append(format(value[i]));
  300.            
  301.             if(i < len - 1) {
  302.                 sb.append(", ");
  303.             }
  304.         }
  305.        
  306.         sb.append("}");
  307.        
  308.         return sb.toString();
  309.     }
  310.    
  311.     private String format(final String[] value) {
  312.         StringBuilder sb = new StringBuilder();
  313.         sb.append("new String[] {");
  314.        
  315.         joinedFormat(value, sb);
  316.        
  317.         sb.append("}");
  318.        
  319.         return sb.toString();
  320.     }
  321.    
  322.     private void joinedFormat(final Object[] array, final StringBuilder sb) {
  323.        
  324.         final int len = array.length;
  325.         for(int i=0; i < len; i++) {
  326.             sb.append(format(array[i]));
  327.            
  328.             if(i < len - 1) {
  329.                 sb.append(", ");
  330.             }
  331.         }
  332.        
  333.     }
  334.    
  335.     private String format(final Enum<?>[] value) {
  336.         StringBuilder sb = new StringBuilder();
  337.        
  338.         String className = value.getClass().getComponentType().getName();
  339.         sb.append(String.format("new %s[] {", className));
  340.        
  341.         joinedFormat(value, sb);
  342.        
  343.         sb.append("}");
  344.        
  345.         return sb.toString();
  346.     }
  347.    
  348.     private String format(final Class<?>[] value) {
  349.         StringBuilder sb = new StringBuilder();
  350.        
  351.         String className = value.getClass().getComponentType().getName();
  352.         sb.append(String.format("new %s[] {", className));
  353.        
  354.         joinedFormat(value, sb);
  355.        
  356.         sb.append("}");
  357.        
  358.         return sb.toString();
  359.     }
  360.    
  361. }