OSDN Git Service

track
[luz/luz.git] / src / com / lavans / luz2 / commons / DaoUtils.java
diff --git a/src/com/lavans/luz2/commons/DaoUtils.java b/src/com/lavans/luz2/commons/DaoUtils.java
new file mode 100644 (file)
index 0000000..bcda317
--- /dev/null
@@ -0,0 +1,194 @@
+package com.lavans.luz2.commons;\r
+\r
+import java.math.BigDecimal;\r
+import java.util.Date;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+import java.util.Set;\r
+\r
+import org.apache.commons.logging.Log;\r
+import org.apache.commons.logging.LogFactory;\r
+\r
+import com.lavans.luz2.util.CondTypeEnum;\r
+import com.lavans.luz2.util.Config;\r
+\r
+public class DaoUtils {\r
+       /** ロガー */\r
+       private static Log logger = LogFactory.getLog(DaoUtils.class);\r
+       //private static final String CLASSNAME=DaoUtils.class.getName();\r
+\r
+       /**\r
+        * IN句の文字列作成\r
+        * @param <T>\r
+        * @param objs\r
+        * @param prefix\r
+        * @param params パラメータ用Map。ここに格納される。\r
+        * @return\r
+        */\r
+       public static String makeInCond(String[] objs, String prefix, Map<String, String[]> params){\r
+               if(objs.length==0) throw new IllegalArgumentException("target's length==0.");\r
+               StringBuilder str = new StringBuilder();\r
+               for(int i=0; i<objs.length; i++){\r
+                       str.append(",:"+prefix+i);\r
+                       params.put(prefix+i, new String[]{objs[i]});\r
+               }\r
+               return str.substring(1);\r
+       }\r
+\r
+       // どうせWebからStringでしか指定しないんだからジェネリックいらないかも\r
+//     public static <T> String makeInCond(T[] objs, String prefix, HashMap<String, Object> params){\r
+//             if(objs.length==0) throw new IllegalArgumentException("target's length==0.");\r
+//             StringBuilder str = new StringBuilder();\r
+//             for(int i=0; i<objs.length; i++){\r
+//                     str.append(",:"+prefix+i);\r
+//                     params.put(prefix+i, objs[i]);\r
+//             }\r
+//             return " IN ("+ str.substring(1)+ ")";\r
+//     }\r
+\r
+       public static String getSql(Class<?> clazz, String key){\r
+               return getSql(clazz.getName(), key);\r
+       }\r
+       public static String getSql(String className, String key){\r
+               Config config = Config.getInstance(className.replace(".","/")+".xml");\r
+               String sql="";\r
+               try {\r
+                       sql = config.getNodeValue("/sql/"+key).trim();\r
+               } catch (Exception e) {\r
+                       logger.error("SQLが見つかりません。["+ key +"]", e);\r
+               }\r
+\r
+               return sql;\r
+       }\r
+\r
+       /**\r
+        * 検索条件の設定。ここでは特定のprefixがついたkey=valueを取得するだけ\r
+        */\r
+       public static Map<String, String[]> getSearchCond(Map<String, String[]> requestParameters, String prefix){\r
+               Map<String, String[]> map = new HashMap<String, String[]>();\r
+               // just only get "search condition paraemters" here. it use later.\r
+               for(Map.Entry<String, String[]> entry: requestParameters.entrySet()){\r
+                       if(entry.getKey().startsWith(prefix)){\r
+                               map.put(entry.getKey().substring(prefix.length()), entry.getValue());\r
+                       }\r
+               }\r
+               return map;\r
+       }\r
+\r
+       /**\r
+        * make SQL where phrase from search condtions.\r
+        * @return\r
+        */\r
+       public static String getWherePhrase(Set<String> attributeNames, Map<String, String[]> cond){\r
+               // null check.\r
+               if(cond==null){\r
+                       return "";\r
+               }\r
+\r
+               // SQL construction start.\r
+               StringBuilder builder = new StringBuilder();\r
+               for(String attributeName: attributeNames){\r
+                       String key = attributeName +"."+ StringUtils.toCamelCase(CondTypeEnum.EQUAL.toString());\r
+                       if((cond.get(key)!=null) && !StringUtils.isEmpty(cond.get(key)[0])){\r
+                               builder.append(" AND "+ StringUtils.toUnderscore(attributeName).toUpperCase() +"= :"+ key);\r
+                       }\r
+                       key = attributeName +"."+ StringUtils.toCamelCase(CondTypeEnum.GREATER_EQUAL.toString());\r
+                       if((cond.get(key)!=null) && !StringUtils.isEmpty(cond.get(key)[0])){\r
+                               builder.append(" AND "+ StringUtils.toUnderscore(attributeName).toUpperCase() +">= :"+ key);\r
+                       }\r
+                       key = attributeName +"."+ StringUtils.toCamelCase(CondTypeEnum.LESS_OR_EQUAL.toString());\r
+                       if((cond.get(key)!=null) && !StringUtils.isEmpty(cond.get(key)[0])){\r
+                               builder.append(" AND "+ StringUtils.toUnderscore(attributeName).toUpperCase() +"<= :"+ key);\r
+                       }\r
+\r
+                       // fuzzy search\r
+                       key = attributeName +"."+ StringUtils.toCamelCase(CondTypeEnum.FUZZY_SEARCH.toString());\r
+                       if((cond.get(key)!=null) && !StringUtils.isEmpty(cond.get(key)[0])){\r
+                               builder.append(" AND "+ StringUtils.toUnderscore(attributeName).toUpperCase() +" LIKE :"+ key);\r
+                               // replace keyword\r
+                               cond.get(key)[0]="%"+cond.get(key)[0]+"%";\r
+                       }\r
+\r
+                       // prefix search\r
+                       key = attributeName +"."+ StringUtils.toCamelCase(CondTypeEnum.PREFIX_SEARCH.toString());\r
+                       if((cond.get(key)!=null) && !StringUtils.isEmpty(cond.get(key)[0])){\r
+                               builder.append(" AND "+ StringUtils.toUnderscore(attributeName).toUpperCase() +" LIKE :"+ key);\r
+                               // replace keyword\r
+                               cond.get(key)[0]=cond.get(key)[0]+"%";\r
+                       }\r
+\r
+                       // suffix search\r
+                       key = attributeName +"."+ StringUtils.toCamelCase(CondTypeEnum.SUFFIX_SEARCH.toString());\r
+                       if((cond.get(key)!=null) && !StringUtils.isEmpty(cond.get(key)[0])){\r
+                               builder.append(" AND "+ StringUtils.toUnderscore(attributeName).toUpperCase() +" LIKE :"+ key);\r
+                               // replace keyword\r
+                               cond.get(key)[0]="%"+cond.get(key)[0];\r
+                       }\r
+\r
+                       // multiple values\r
+                       key = attributeName +"."+ StringUtils.toCamelCase(CondTypeEnum.MULTIPLE.toString());\r
+                       if((cond.get(key)!=null) && !StringUtils.isEmpty(cond.get(key)[0])){\r
+                               builder.append(" AND "+ StringUtils.toUnderscore(attributeName).toUpperCase() +" IN ( "+ makeInCond(cond.get(key),attributeName,cond) +")");\r
+                       }\r
+\r
+                       // comma separated values\r
+                       key = attributeName +"."+ StringUtils.toCamelCase(CondTypeEnum.LIST.toString());\r
+                       if((cond.get(key)!=null) && !StringUtils.isEmpty(cond.get(key)[0])){\r
+                               // separate all keys\r
+                               String conds[] = StringUtils.splitTrim(cond.get(key)[0], ",");\r
+                               builder.append(" AND "+ StringUtils.toUnderscore(attributeName).toUpperCase() +" IN ( "+ makeInCond(conds,attributeName,cond) +")");\r
+                       }\r
+               }\r
+\r
+               return builder.toString();\r
+       }\r
+\r
+       /**\r
+        * 検索条件をMap<String,String[]>からMap<String,Object>に変換。\r
+        * InteterとかLongとか型渡して変換した方がよさそう。\r
+        *\r
+        */\r
+       public static Map<String, Object> convertSearchCond(Map<String, String[]> cond, Map<String,Class<?>> attributeInfo){\r
+               Map<String, Object> result = new HashMap<String, Object>();\r
+               for(Map.Entry<String, String[]> entry: cond.entrySet()){\r
+                       // 値が指定されていなければ評価しない\r
+                       if(StringUtils.isEmpty(entry.getValue()[0])){\r
+                               continue;\r
+                       }\r
+\r
+                       // 属性名は.より前の部分(ex memberId.equal\r
+                       if(!entry.getKey().contains(".")){\r
+                               logger.debug("No condtion ["+ entry.getKey() +"]");\r
+                               continue;\r
+                       }\r
+                       String attributeName = entry.getKey().split("\\.")[0];\r
+                       // この属性の型情報を取得\r
+                       Class<?> clazz = attributeInfo.get(attributeName);\r
+                       // 念のためnullチェック\r
+                       if(clazz==null){\r
+                               logger.debug("No attribute Info,["+ attributeName +"]");\r
+                               continue;\r
+                       }\r
+\r
+                       if(clazz.equals(Integer.class)){\r
+                               result.put(entry.getKey(), Integer.valueOf(entry.getValue()[0]));\r
+                       }else if(clazz.equals(Long.class)){\r
+                               result.put(entry.getKey(), Long.valueOf(entry.getValue()[0]));\r
+                       }else if(clazz.equals(Double.class)){\r
+                               result.put(entry.getKey(), Double.valueOf(entry.getValue()[0]));\r
+                       }else if(clazz.equals(BigDecimal.class)){\r
+                               result.put(entry.getKey(), new BigDecimal(entry.getValue()[0]));\r
+//                     }else if(clazz.equals(byte[].class)){\r
+//                             // バイナリは検索不可\r
+//                             result.put(entry.getKey(), byte.valueOf(entry.getValue()[0]));\r
+                       }else if(clazz.equals(Date.class)){\r
+                               result.put(entry.getKey(), DateUtils.getDate(entry.getValue()[0]));\r
+                       }else{\r
+                               // String\r
+                               result.put(entry.getKey(), entry.getValue()[0]);\r
+                       }\r
+\r
+               }\r
+               return result;\r
+       }\r
+}\r