OSDN Git Service

import
[luz/luz.git] / lacoder / src / com / lavans / lacoder / model / Attribute.java
diff --git a/lacoder/src/com/lavans/lacoder/model/Attribute.java b/lacoder/src/com/lavans/lacoder/model/Attribute.java
new file mode 100644 (file)
index 0000000..9aa9a30
--- /dev/null
@@ -0,0 +1,655 @@
+/* $Id: Attribute.java 451 2011-08-12 11:38:19Z dobashi $\r
+ * create: 2004/12/28\r
+ * (c)2004 Lavans Networks Inc. All Rights Reserved.\r
+ */\r
+package com.lavans.lacoder.model;\r
+\r
+import com.lavans.lacoder.main.JavaType;\r
+import com.lavans.luz2.commons.StringUtils;\r
+\r
+/**\r
+ * toGetParameter/toSetParameterにjspでやるべき事が混じってるような感じ。\r
+ * やはりmap.put()あたりはjspに持って行くべきか?\r
+ * @author dobashi\r
+ * @version 1.00\r
+ */\r
+public class Attribute{\r
+//     private static Log logger = LogFactory.getLog(Attribute.class);\r
+\r
+       /** 親となるエンティティ */\r
+       private Entity entity = null;\r
+       /** 名前。意味区切り大文字 */\r
+       private String name = null;\r
+       /** タイトル */\r
+       private String title = null;\r
+       /** DB上の型 */\r
+       private String dbType = null;\r
+       /** javaの型 */\r
+       private String javaType = null;\r
+       /** 対応するクラス名 */\r
+       private String className = null;\r
+//     private String classAttrName = null;\r
+       // list形式の場合\r
+       private boolean isList = false;\r
+       // 固定長リストの場合\r
+       private int listSize=0;\r
+\r
+       /** 日付入力用のformat。 */\r
+       private String dateFormat = "yyyy/MM/dd";\r
+\r
+       /** sequence flag */\r
+       private boolean isSequence = false;\r
+\r
+       /** enum flag */\r
+       private boolean isEnum = false;\r
+\r
+       /** primary key flag */\r
+       private boolean isPrimaryKey = false;\r
+\r
+       // constraint 制約\r
+       /** nullable flag. default = false. */\r
+       private boolean isNullable = false;\r
+\r
+       /** precision for BigDecimal */\r
+       private Integer precision = null;\r
+       /** scale for BigDecimal */\r
+       private Integer scale = null;\r
+\r
+       // 最小値最大値。\r
+       // longで指定できる範囲ならvalidate()で判定処理を自動生成する。\r
+       // 数値なら大きさ、文字列なら長さを指定する。\r
+       /** min value */\r
+       private Long min = null;\r
+       /** max value */\r
+       private Long max = null;\r
+\r
+       /**\r
+        * 初期化値を返す。主にStringの初期値を""にして新規登録時にjspにnullが表示されないようにするため。\r
+        * @return\r
+        */\r
+       public String getInitValue(){\r
+//             logger.debug(arg0)\r
+               String result = null;\r
+               if(getJavaType().equals("int") ||\r
+                       getJavaType().equals("long") ||\r
+                       getJavaType().equals("double") ||\r
+                       getJavaType().equals("float") ){\r
+                       result = "0";\r
+               }else if(getJavaType().equals("boolean")){\r
+                       result = "false";\r
+               }else if(getName().equals("statusEnumId") ){\r
+                       // ステータスEnumのデフォルト値\r
+                       result = "\"on\"";\r
+               }else if(getJavaType().equals("String")){\r
+                       result = "\"\"";\r
+               }else if(!isEditable()){\r
+                       result = "null";\r
+               }else if(getJavaType().equals("Date")){\r
+//                     result = "new Date()";\r
+                       result = "null";\r
+               }else{\r
+                       result = "null";\r
+               }\r
+               return result;\r
+       }\r
+\r
+       /**\r
+        * jdbcでのset/getメソッドでの型名を返す。\r
+        * @return\r
+        */\r
+       public String getJdbcMethodName(){\r
+               // Oracleでbyte[]の時はBytesじゃなくてBlobにしないといけないかも\r
+               return JavaType.getJdbcMethodName(javaType);\r
+       }\r
+\r
+       /**\r
+        * INSERT文でのvalue名を返す。\r
+        * @return\r
+        */\r
+       public String getInsertSql(){\r
+               return  ", :"+name;\r
+       }\r
+\r
+       /**\r
+        * UPDATE文でのフィールド名を返す。\r
+        * @return\r
+        */\r
+       public String getUpdateSql(){\r
+               String result = null;\r
+\r
+               if(isPrimaryKey){\r
+                       // PKはWHERE句に含まれている\r
+                       result="";\r
+               }else if(name.equals("insert_datetime")){\r
+                       // insert_dateは更新できない\r
+                       result = "";\r
+               }else{\r
+                       result = ", "+ getColumnName()+"=:"+name;\r
+               }\r
+               return result;\r
+       }\r
+\r
+       /**\r
+        * テーブルでのカラム名を返す。\r
+        * @return\r
+        */\r
+       public String getColumnName(){\r
+               return StringUtils.toUnderscore(name).toUpperCase();\r
+       }\r
+\r
+       /**\r
+        * パラメータ化する時の値を返す。Stringならそのまま。\r
+        * それ以外のクラスならgetId()を返す。プリミティブ型なら文字列に変換。\r
+        * @return\r
+        */\r
+       public String toGetParameter(){\r
+               // insert_date/userはパラメータ化の必要なし。\r
+               if(!isEditable()){\r
+                       return "";\r
+               }\r
+\r
+               String result  = null;\r
+//             if(!className.equals("")){\r
+//                     if(entity.getTypeManager().getJavaType(type).equals("int")){\r
+//                             result = "new Integer("+ getVarName() + ".getId())";\r
+//                     }else{\r
+//                             result = getVarName() + ".getId()";\r
+//                     }\r
+//             }else\r
+               if(isList){\r
+                       // とりあえずリストはOutputパラメータだけなので無視\r
+                       return "";\r
+//                     buf.append(getClassLastName() +".getInstance(((String[])map.get(prefix+"+ getConstName() +"))[0]);");\r
+               }else if(getJavaType().equals("String")){\r
+                       result = getVarName();\r
+               }else if(getJavaType().equals("Date")){\r
+                       // date型は値が入っていない場合NullPo抑制が必要\r
+\r
+                       result = name + "==null?\"\":"+ getGetterName() +"Str()";\r
+               }else if(getJavaType().equals("byte[]")){\r
+                       // Base64で埋められるけど、バイナリデータをformに入れて持ち回りたいことはないのでなにもしない。\r
+                       // でも後で入れるかもしれないからコメントで残しておく\r
+                       //result = "StringUtils.encodeBase64Url( + name + ")";\r
+               }else{\r
+                       result = "String.valueOf("+ getVarName() +")";\r
+               }\r
+               result = "map.put(prefix+"+ getConstName() +", new String[]{"+ result +"});";\r
+\r
+               return result;\r
+       }\r
+\r
+       /**\r
+        * mapからインスタンス変数へ代入。\r
+        * @return\r
+        */\r
+       public String toSetParameter(){\r
+               // insert_date/userはパラメータ化の必要なし。\r
+               if(!isEditable()){\r
+                       return "";\r
+               }\r
+\r
+               StringBuffer buf = new StringBuffer();\r
+               buf.append("if(map.get(prefix+"+ getConstName() +")!=null) "+ getVarName() +" = ");\r
+\r
+               if(isList){\r
+                       // とりあえずリストはOutputパラメータだけなので無視\r
+                       return "";\r
+//                     buf.append(getClassLastName() +".getInstance(((String[])map.get(prefix+"+ getConstName() +")));");\r
+               }else if(getJavaType().equals("int")){\r
+                       buf.append("Integer.parseInt(map.get(prefix+"+ getConstName() +")[0]);");\r
+               }else if(getJavaType().equals("long")){\r
+                       buf.append("Long.parseLong(map.get(prefix+"+ getConstName() +")[0]);");\r
+               }else if(getJavaType().equals("double")){\r
+                       buf.append("Double.parseDouble(map.get(prefix+"+ getConstName() +")[0]);");\r
+               }else if(getJavaType().equals("boolean")){\r
+                       buf.append("Boolean.parseBoolean(map.get(prefix+"+ getConstName() +")[0]);");\r
+               }else if(getJavaType().equals("Date")){\r
+                       buf.append(getGetterName() +"DateFormat().parse(map.get(prefix+"+ getConstName() +")[0]);");\r
+               }else if(getJavaType().equals("BigDecimal")){\r
+                       buf.append("new BigDecimal(map.get(prefix+"+ getConstName() +")[0]);");\r
+               }else if(getJavaType().equals("byte[]")){\r
+                       //buf.append("StringUtils.decodeBase64Url(map.get(prefix+"+ getConstName() +"));");\r
+               }else{  // それ以外(String)\r
+                       buf.append("map.get(prefix+"+ getConstName() +")[0];");\r
+               }\r
+\r
+               return "try{ "+ buf.toString() +"}catch(Exception e){}";\r
+       }\r
+\r
+       /**\r
+        * パラメータ化する時の値を返す。Stringならそのまま。\r
+        * それ以外のクラスならgetId()を返す。プリミティブ型なら文字列に変換。\r
+        * @return\r
+        */\r
+       public String toGetAttributeInfo(){\r
+               StringBuilder buf = new StringBuilder();\r
+               buf.append("map.put("+ getConstName() +", ");\r
+\r
+               if(getJavaType().equals("int")){\r
+                       buf.append("Integer.class);");\r
+               }else if(getJavaType().equals("long")){\r
+                       buf.append("Long.class);");\r
+               }else if(getJavaType().equals("double")){\r
+                       buf.append("Double.class);");\r
+               }else if(getJavaType().equals("boolean")){\r
+                       buf.append("Boolean.class);");\r
+               }else if(getJavaType().equals("Date")){\r
+                       buf.append("java.sql.Date.class);");\r
+//             }else if(getJavaType().equals("BigDecimal")){\r
+//                     buf.append("BigDecimal.class;");\r
+//             }else if(getJavaType().equals("byte[]")){\r
+//                     buf.append("byte[].class;");\r
+               }else{  // それ以外(String, BigDecimal, byt[])\r
+                       buf.append(getJavaType()+".class);");\r
+               }\r
+\r
+               return buf.toString();\r
+       }\r
+\r
+       /**\r
+        * パラメータ化する時の値を返す。Stringならそのまま。\r
+        * それ以外のクラスならgetId()を返す。プリミティブ型なら文字列に変換。\r
+        * @return\r
+        */\r
+       public String toGetAttributeMap(){\r
+               String result  = null;\r
+               if(isList){\r
+                       // リストは後で考える。Enumの配列とか?カンマ区切りStringの処理?\r
+                       return "";\r
+               }\r
+               result = "map.put("+ getConstName() +","+ getVarName() +");";\r
+\r
+               return result;\r
+       }\r
+\r
+       public String toGetter(){\r
+               StringBuffer buf = new StringBuffer();\r
+               buf.append("    /**\n");\r
+               buf.append("     * @return "+ getVarName() +"を戻します。\n");\r
+               buf.append("     */\n");\r
+               buf.append("    public "+ getJavaType() +" "+ getGetterName() +"(){\n");\r
+               buf.append("            return "+ getVarName() +";\n");\r
+               buf.append("    }\n");\r
+\r
+               if(hasClass()){\r
+                       buf.append("    /**\n");\r
+                       buf.append("     * @return "+ getClassLastName() +"を戻します。\n");\r
+                       buf.append("     */\n");\r
+                       buf.append("    public "+ getClassLastName() +" get"+ StringUtils.capitalize(getClassVarName()) +"(){\n");\r
+                       if(isEnum){\r
+                               if(getJavaType().equals("boolean")){\r
+                                       buf.append("            return "+ getClassLastName() +".getInstance(Boolean.toString("+ getVarName() +"));\n");\r
+                               }else if(getJavaType().equals("int")){\r
+                                       buf.append("            return "+ getClassLastName() +".getInstanceByInt("+ getVarName() +");\n");\r
+                               }else{\r
+                                       buf.append("            return "+ getClassLastName() +".getInstance("+ getVarName() +");\n");\r
+                               }\r
+                       }else{\r
+                               buf.append("            return "+ getClassVarName() +";\n");\r
+                       }\r
+                       buf.append("    }\n");\r
+                       if(isEnum){\r
+                               buf.append("    /**\n");\r
+                               buf.append("     * @return "+ getVarName() +"Titleを戻します。\n");\r
+                               buf.append("     */\n");\r
+                               buf.append("    public String get"+ StringUtils.capitalize(getClassVarName()) +"Title(){\n");\r
+                               buf.append("            if(get"+ StringUtils.capitalize(getClassVarName()) +"()==null) return \"\";\n");\r
+                               buf.append("            return get"+ StringUtils.capitalize(getClassVarName()) +"().getTitle();\n");\r
+                               buf.append("    }\n");\r
+                       }\r
+                       // enumの時はtitleも返す\r
+               }else if(getJavaType().equals("Date")){\r
+                       buf.append("    /**\n");\r
+                       buf.append("     * @return "+ getVarName() +"の日付フォーマットを戻します。\n");\r
+                       buf.append("     */\n");\r
+                       buf.append("    public DateFormat "+ getGetterName() +"DateFormat(){\n");\r
+                       buf.append("            return new SimpleDateFormat(\""+ getDateFormat() +"\");\n");\r
+                       buf.append("    }\n");\r
+                       buf.append("    /**\n");\r
+                       buf.append("     * @return "+ getVarName() +"の日付文字列を戻します。\n");\r
+                       buf.append("     */\n");\r
+                       buf.append("    public String "+ getGetterName() +"Str(){\n");\r
+                       buf.append("            return "+ getGetterName() + "DateFormat().format("+ getVarName() +");\n");\r
+                       buf.append("    }\n");\r
+               }\r
+\r
+               return buf.toString();\r
+       }\r
+\r
+       /**\r
+        * setterの生成\r
+        * @return\r
+        */\r
+       public String toSetter(){\r
+               StringBuffer buf = new StringBuffer();\r
+               buf.append("    /**\n");\r
+               buf.append("     *  "+ getVarName() +"を設定します。\n");\r
+               buf.append("     */\n");\r
+               buf.append("    public void "+ getSetterName() +"("+ getJavaType() +" "+ getVarName() +"){\n");\r
+               buf.append("            this."+ getVarName() +"="+ getVarName() +";\n");\r
+               buf.append("    }\n");\r
+\r
+               if(hasClass()){\r
+                       buf.append("    /**\n");\r
+                       buf.append("     * "+ getClassLastName() +"を設定します。\n");\r
+                       buf.append("     */\n");\r
+                       buf.append("    public void set"+ StringUtils.capitalize(getClassVarName()) +"("+ getClassLastName() +" "+ getClassVarName() +"){\n");\r
+                       if(isEnum){\r
+                               if(getJavaType().equals("boolean")){\r
+                                       buf.append("            this."+ getVarName() +"=Boolean.parseBoolean("+ getClassVarName() +".getId());\n");\r
+                               }else if(getJavaType().equals("int")){\r
+                                       buf.append("            this."+ getVarName() +"="+ getClassVarName() +".getInt();\n");\r
+                               }else{\r
+                                       buf.append("            this."+ getVarName() +"="+ getClassVarName() +".getId();\n");\r
+                               }\r
+                       }else{\r
+                               buf.append("            this."+ getClassVarName() +"="+ getClassVarName() +";\n");\r
+                       }\r
+                       buf.append("    }\n");\r
+               }else if(getJavaType().equals("Date")){\r
+                       buf.append("    /**\n");\r
+                       buf.append("     * "+ getVarName() +"の日付文字列を設定します。\n");\r
+                       buf.append("     */\n");\r
+                       buf.append("    public void "+ getSetterName() +"Str(String "+ getVarName() +"Str) throws ParseException{\n");\r
+                       buf.append("            this."+ getVarName() +"="+ getGetterName() + "DateFormat().parse("+ getVarName() +"Str);\n");\r
+                       buf.append("    }\n");\r
+               }\r
+\r
+               return buf.toString();\r
+       }\r
+\r
+       /**\r
+        *  insert_date/user等は入力不可。\r
+        * @return\r
+        */\r
+       public boolean isEditable(){\r
+               // insert_date/userはパラメータ化の必要なし。\r
+               if(name.equals("insert_datetime") || name.equals("update_datetime") ){\r
+                       return false;\r
+               }\r
+               return true;\r
+       }\r
+       /**\r
+        * @return entity を戻します。\r
+        */\r
+       public Entity getEntity() {\r
+               return entity;\r
+       }\r
+       /**\r
+        * @param entity entity を設定。\r
+        */\r
+       public void setEntity(Entity entity) {\r
+               this.entity = entity;\r
+       }\r
+\r
+//     /**\r
+//      * @return classAttrName を戻します。\r
+//      */\r
+//     public String getClassAttrName() {\r
+//             return classAttrName;\r
+//     }\r
+//     /**\r
+//      * @param classAttrName classAttrName を設定。\r
+//      */\r
+//     public void setClassAttrName(String attrName) {\r
+//             this.classAttrName = attrName;\r
+//     }\r
+       /**\r
+        * @return className を戻します。\r
+        */\r
+       public String getClassName() {\r
+               // クラス名が.で始まる場合はドメインパスまでを省略している\r
+               if((className!=null) && className.startsWith(".")){\r
+                       className = entity.getParentPackage().getDomainPath()+className;\r
+               }\r
+               return className;\r
+       }\r
+       /**\r
+        * @return className を戻します。\r
+        */\r
+       public String getClassLastName() {\r
+               String names[] = className.split("\\.");\r
+               return names[names.length-1];\r
+       }\r
+       /**\r
+        * @param className className を設定。\r
+        */\r
+       public void setClassName(String className) {\r
+               this.className = className;\r
+       }\r
+       /**\r
+        * @return name を戻します。\r
+        */\r
+       public String getName() {\r
+               return name;\r
+       }\r
+       public String getConstName() {\r
+               return StringUtils.toUnderscore(name).toUpperCase();\r
+       }\r
+       /**\r
+        * Entity内での変数名を返す。\r
+        * classを持っている場合、末尾がIdで終わらなければIdをつける。\r
+        * @return\r
+        */\r
+       public String getVarName() {\r
+               if(!getClassName().equals("") && !name.endsWith("Id")){\r
+                       return name+"Id";\r
+               }\r
+               return name;\r
+       }\r
+       /**\r
+        * 最初を大文字にした名前を返す。\r
+        * @return\r
+        */\r
+       public String getCapitalizeName() {\r
+               return StringUtils.capitalize(getVarName());\r
+       }\r
+\r
+       /**\r
+        * Entity内でのクラス型の変数名を返す。\r
+        * 変数名が必ずIdで終わっているので、最後の2文字を削除した物をクラス型の変数名とする。\r
+        * @return\r
+        */\r
+       public String getClassVarName() {\r
+               String classVarName = getVarName();\r
+               classVarName = classVarName.substring(0, classVarName.length()-2);\r
+               return classVarName;\r
+       }\r
+\r
+       /**\r
+        * getterのメソッド名。customerId -> getCustomerId\r
+        * booleanでis/can/hasの場合はgetIsBoolとならずにisBoolだけとしたいところだけど\r
+        * struts2のActionの自動設定で失敗するのでgetIsBoolとする。\r
+        * @return\r
+        */\r
+       public String getGetterName(){\r
+//             if(getJavaType().equals("boolean")){\r
+//                     if(name.startsWith("is") || name.startsWith("can") || name.startsWith("has")){\r
+//                             return name;\r
+//                     }\r
+//             }\r
+\r
+               return "get" + StringUtils.capitalize(getVarName());\r
+       }\r
+\r
+       /**\r
+        * setterのメソッド名。customerId -> setCustomerId\r
+        * booleanでis/can/hasの場合はgetIsBoolとならずにisBoolだけとする\r
+        * @return\r
+        */\r
+       public String getSetterName(){\r
+               return "set" + StringUtils.capitalize(getVarName());\r
+\r
+       }\r
+       /**\r
+        * 変数名を頭大文字にして返す。getXX(),setXX()等で使用。\r
+        * @return\r
+        */\r
+//     public String getVarNameUpperFirst(){\r
+//             return StringUtils.upperFirst(name);\r
+//     }\r
+\r
+       /**\r
+        * @param name name を設定。\r
+        */\r
+       public void setName(String name) {\r
+               this.name = name;\r
+       }\r
+\r
+       /**\r
+        * @return isSequence を戻します。\r
+        */\r
+       public boolean isSequence() {\r
+               return isSequence;\r
+       }\r
+       /**\r
+        * @param isSequence isSequence を設定。\r
+        */\r
+       public void setSequence(boolean isSequence) {\r
+               this.isSequence = isSequence;\r
+       }\r
+       /**\r
+        * @return title を戻します。\r
+        */\r
+       public String getTitle() {\r
+               return title;\r
+       }\r
+       /**\r
+        * @param title title を設定。\r
+        */\r
+       public void setTitle(String title) {\r
+               this.title = title;\r
+       }\r
+       /**\r
+        * @return dateFormat を戻します。\r
+        */\r
+       public String getDateFormat() {\r
+               return dateFormat;\r
+       }\r
+       /**\r
+        * @param dateFormat dateFormat を設定。\r
+        */\r
+       public void setDateFormat(String format) {\r
+               this.dateFormat = format;\r
+       }\r
+       /**\r
+        * @return isEnum を戻します。\r
+        */\r
+       public boolean isEnum() {\r
+               return isEnum;\r
+       }\r
+       /**\r
+        * @param isEnum isEnum を設定。\r
+        */\r
+       public void setEnum(boolean isEnum) {\r
+               this.isEnum = isEnum;\r
+       }\r
+\r
+       public boolean hasClass() {\r
+               return !getClassName().equals("");\r
+       }\r
+\r
+       /**\r
+        * EntityクラスにおけるJavaの型。\r
+        * @return\r
+        */\r
+       public String getJavaType(){\r
+               return javaType;\r
+       }\r
+\r
+       /**\r
+        * @param javaType javaType を設定。\r
+        */\r
+       public void setJavaType(String javaType) {\r
+               this.javaType = javaType;\r
+       }\r
+       /**\r
+        * @return isList を戻します。\r
+        */\r
+       public boolean isList() {\r
+               return isList;\r
+       }\r
+       /**\r
+        * @param isList isList を設定。\r
+        */\r
+       public void setList(boolean isList) {\r
+               this.isList = isList;\r
+       }\r
+       /**\r
+        * @return listSize を戻します。\r
+        */\r
+       public int getListSize() {\r
+               return listSize;\r
+       }\r
+       /**\r
+        * @param listSize listSize を設定。\r
+        */\r
+       public void setListSize(int listSize) {\r
+               this.listSize = listSize;\r
+       }\r
+       /**\r
+        * @return isPrimaryKey を戻します。\r
+        */\r
+       public boolean isPrimaryKey() {\r
+               return isPrimaryKey;\r
+       }\r
+       /**\r
+        * @param isPrimaryKey isPrimaryKey を設定。\r
+        */\r
+       public void setPrimaryKey(boolean isPrimaryKey) {\r
+               this.isPrimaryKey = isPrimaryKey;\r
+       }\r
+\r
+       public String getDbType() {\r
+               // xmlで指定済みならそれを返す\r
+               if(dbType!=null){\r
+                       return dbType;\r
+               }\r
+               // 未指定ならTypeManagerから取得。\r
+               return entity.getTypeManager().getDbType(this);\r
+       }\r
+\r
+       public void setDbType(String dbType) {\r
+               this.dbType = dbType;\r
+       }\r
+\r
+       public boolean isNullable() {\r
+               return isNullable;\r
+       }\r
+\r
+       public void setNullable(boolean isNullable) {\r
+               this.isNullable = isNullable;\r
+       }\r
+\r
+       public Integer getPrecision() {\r
+               return precision;\r
+       }\r
+\r
+       public void setPrecision(Integer precision) {\r
+               this.precision = precision;\r
+       }\r
+\r
+       public Integer getScale() {\r
+               return scale;\r
+       }\r
+\r
+       public void setScale(Integer scale) {\r
+               this.scale = scale;\r
+       }\r
+\r
+       public Long getMin() {\r
+               return min;\r
+       }\r
+\r
+       public void setMin(Long min) {\r
+               this.min = min;\r
+       }\r
+\r
+       public Long getMax() {\r
+               return max;\r
+       }\r
+\r
+       public void setMax(Long max) {\r
+               this.max = max;\r
+       }\r
+}\r