--- /dev/null
+/* $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