Clover coverage report - brownies library - 1.0-beta-1 Coverage timestamp: 月 8 16 2004 17:14:42 GMT+09:00 FRAMES NO FRAMES |
file stats: | LOC: | 293 |  | Methods: | 21
| NCLOC: | 152 |  | Classes: | 1
30 day Evaluation Version distributed via the Maven Jar Repository. Clover is not free. You have 30 days to evaluate it. Please visit http://www.thecortex.net/clover to obtain a licensed version of Clover
Source file | Conditionals | Statements | Methods | TOTAL
SqlReplacer.java | 0% | 0% | 0% | 0% |

1 |  |
     /*
2 |  |
      * Joey and its relative products are published under the terms
3 |  |
      * of the Apache Software License.
4 |  |
      */
5 |  |
     /*
6 |  |
      * Created on 2004/02/15
7 |  |
      */
8 |  |
     package org.asyrinx.brownie.core.sql;
9 |  |
10 |  |
     import java.sql.Time;
11 |  |
     import java.sql.Timestamp;
12 |  |
     import java.text.DateFormat;
13 |  |
     import java.text.SimpleDateFormat;
14 |  |
     import java.util.ArrayList;
15 |  |
     import java.util.Collections;
16 |  |
     import java.util.Date;
17 |  |
     import java.util.List;
18 |  |
     import java.util.Set;
19 |  |
20 |  |
     import org.asyrinx.brownie.core.collection.IntegerKeyMap;
21 |  |
     import org.asyrinx.brownie.core.collection.StringKeyMap;
22 |  |
23 |  |
     /**
24 |  |
      * PreparedStatementで使用されるSQLの?を置換し、実行可能なSQLに変換するクラスです。 <br>
25 |  |
      * 基本的に?を該当する値に変換するだけですが、値のクラスによって以下の処理を行います。 <br>
26 |  |
      * 文字列（Stringオブジェクト）はquoteプロパティで指定された文字で囲まれます。 <br>
27 |  |
      * 日付（Dateオブジェクト）はformatForDateプロパティで指定されたフォーマットで文字列に変換され、quoteプロパティで指定された文字で囲まれます。
28 |  |
      * <br>
29 |  |
      * 時刻（Timeオブジェクト）はformatForTimeプロパティで指定されたフォーマットで文字列に変換され、quoteプロパティで指定された文字で囲まれます。
30 |  |
      * <br>
31 |  |
      * TimestampオブジェクトはformatForTimestampプロパティで指定されたフォーマットで文字列に変換され、quoteプロパティで指定された文字で囲まれます。
32 |  |
      * <br>
33 |  |
      *
34 |  |
      * @author akima
35 |  |
      */
36 |  |
     public class SqlReplacer {
37 |  |
38 |  |
         /**
39 |  |
          *
40 |  |
          */
41 | 0 |
         public SqlReplacer() {
42 | 0 |
             super();
43 |  |
         }
44 |  |
45 |  |
         private DateFormat formatForDate = new SimpleDateFormat("yyyy/MM/dd");
46 |  |
47 |  |
         private DateFormat formatForTime = new SimpleDateFormat("HH:mm:ss");
48 |  |
49 |  |
         private DateFormat formatForTimestamp = new SimpleDateFormat(
50 |  |
                 "yyyy/MM/dd HH:mm:ss");
51 |  |
52 |  |
         private char quote = DEFAULT_QUOTE;
53 |  |
54 |  |
         private static final char DEFAULT_QUOTE = '\'';
55 |  |
56 |  |
         /**
57 |  |
          * 変換を実行します。
58 |  |
          *
59 |  |
          * @param sql
60 |  |
          *            ?を含むSQL文
61 |  |
          * @param parameters
62 |  |
          *            番号と関連付けられたパラメータ群
63 |  |
          * @return 変換されたSQL文
64 |  |
          */
65 | 0 |
         public String execute(String sql, IntegerKeyMap parameters) {
66 | 0 |
             final StringBuffer result = new StringBuffer(100);
67 | 0 |
             final int lastParameterIndex = getLastParameterIndex(parameters);
68 | 0 |
             int paramIndex = 0;
69 | 0 |
             boolean inSingleQuote = false;
70 | 0 |
             boolean inDoubleQuote = false;
71 | 0 |
             for (int i = 0; i < sql.length(); i++) {
72 | 0 |
                 final char currChar = sql.charAt(i);
73 | 0 |
                 switch (currChar) {
74 |  |
                 case '?':
75 | 0 |
                     if (inSingleQuote || inDoubleQuote) {
76 | 0 |
                         result.append(currChar);
77 | 0 |
                         break;
78 |  |
                     }
79 | 0 |
                     paramIndex++;
80 | 0 |
                     if (paramIndex > lastParameterIndex)
81 | 0 |
                         paramIndex = 1;
82 | 0 |
                     final Object value = parameters.get(paramIndex);
83 | 0 |
                     appendValue(result, value);
84 | 0 |
                     break;
85 |  |
                 case '\'':
86 | 0 |
                     if (!inDoubleQuote)
87 | 0 |
                         inSingleQuote = !inSingleQuote;
88 | 0 |
                     result.append(currChar);
89 | 0 |
                     break;
90 |  |
                 case '"':
91 | 0 |
                     if (!inSingleQuote)
92 | 0 |
                         inDoubleQuote = !inDoubleQuote;
93 | 0 |
                     result.append(currChar);
94 | 0 |
                     break;
95 |  |
                 default:
96 | 0 |
                     result.append(currChar);
97 | 0 |
                     break;
98 |  |
                 }
99 |  |
             }
100 | 0 |
             return result.toString();
101 |  |
         }
102 |  |
103 |  |
         /**
104 |  |
          * 変換を実行します。
105 |  |
          *
106 |  |
          * @param sql
107 |  |
          * @param parameters
108 |  |
          *            番号と関連付けられたパラメータ群
109 |  |
          * @return 変換されたSQL文
110 |  |
          */
111 | 0 |
         public String execute(String sql, StringKeyMap parameters) {
112 | 0 |
             return sql + " parameters=" + parameters;
113 |  |
         }
114 |  |
115 |  |
         /**
116 |  |
          * @param parameters
117 |  |
          * @return
118 |  |
          */
119 | 0 |
         private int getLastParameterIndex(IntegerKeyMap parameters) {
120 | 0 |
             final Set keySet = parameters.keySet();
121 | 0 |
             final List keyList = new ArrayList();
122 | 0 |
             keyList.addAll(keySet);
123 | 0 |
             Collections.sort(keyList);
124 | 0 |
             if (keyList.isEmpty())
125 | 0 |
                 return 0;
126 | 0 |
             final Object value = keyList.get(keyList.size() - 1);
127 | 0 |
             if (value instanceof Number)
128 | 0 |
                 return ((Number) value).intValue();
129 | 0 |
             return 0;
130 |  |
         }
131 |  |
132 | 0 |
         private void appendValue(StringBuffer dest, Object value) {
133 | 0 |
             if (value == null) {
134 | 0 |
                 dest.append("null");
135 | 0 |
                 return;
136 |  |
             }
137 | 0 |
             if (needQuote(value))
138 | 0 |
                 dest.append(getQuote());
139 |  |
140 | 0 |
             if (value instanceof String)
141 | 0 |
                 dest.append(toString((String) value));
142 | 0 |
             else if (value instanceof Timestamp)
143 | 0 |
                 dest.append(toString((Timestamp) value));
144 | 0 |
             else if (value instanceof Time)
145 | 0 |
                 dest.append(toString((Time) value));
146 | 0 |
             else if (value instanceof Date)
147 | 0 |
                 dest.append(toString((Date) value));
148 |  |
             else
149 | 0 |
                 dest.append(toString(value));
150 |  |
151 | 0 |
             if (needQuote(value))
152 | 0 |
                 dest.append(getQuote());
153 |  |
         }
154 |  |
155 | 0 |
         private boolean needQuote(Object value) {
156 | 0 |
             return (value instanceof String) || (value instanceof Date)
157 |  |
                     || (value instanceof Time) || (value instanceof Timestamp);
158 |  |
         }
159 |  |
160 | 0 |
         private String toString(Object value) {
161 | 0 |
             return String.valueOf(value);
162 |  |
         }
163 |  |
164 | 0 |
         private String toString(String value) {
165 | 0 |
             return value;
166 |  |
         }
167 |  |
168 | 0 |
         private String toString(Time value) {
169 | 0 |
             return String.valueOf(formatForTime.format(value));
170 |  |
         }
171 |  |
172 | 0 |
         private String toString(Date value) {
173 | 0 |
             return String.valueOf(formatForDate.format(value));
174 |  |
         }
175 |  |
176 | 0 |
         private String toString(Timestamp value) {
177 | 0 |
             return formatForTimestamp.format(new Date(value.getTime()));
178 |  |
         }
179 |  |
180 |  |
         /**
181 |  |
          * 変換を実行します。 Date、Time、Timestamp用のフォーマット文字列はデフォルトのものを使用します。
182 |  |
          *
183 |  |
          * @param sql
184 |  |
          *            ?を含むSQL文
185 |  |
          * @param parameters
186 |  |
          *            番号と関連付けられたパラメータ群
187 |  |
          * @return 変換されたSQL文
188 |  |
          */
189 | 0 |
         public static String replacePreparedParmaeters(String sql,
190 |  |
                 IntegerKeyMap parameters) {
191 | 0 |
             final SqlReplacer replacer = new SqlReplacer();
192 | 0 |
             return replacer.execute(sql, parameters);
193 |  |
         }
194 |  |
195 |  |
         /**
196 |  |
          * 変換を実行します。 Date、Time、Timestamp用のフォーマット文字列はデフォルトのものを使用します。
197 |  |
          *
198 |  |
          * @param sql
199 |  |
          *            ?を含むSQL文
200 |  |
          * @param parameters
201 |  |
          *            番号と関連付けられたパラメータ群
202 |  |
          * @param formatForDate
203 |  |
          *            Date用のフォーマット
204 |  |
          * @param formatForTime
205 |  |
          *            Time用のフォーマット
206 |  |
          * @param formatForTimestamp
207 |  |
          *            Timestamp用のフォーマット
208 |  |
          * @return 変換されたSQL文
209 |  |
          */
210 | 0 |
         public static String replacePreparedParmaeters(String sql,
211 |  |
                 IntegerKeyMap parameters, String formatForDate,
212 |  |
                 String formatForTime, String formatForTimestamp) {
213 | 0 |
             final SqlReplacer replacer = new SqlReplacer();
214 | 0 |
             replacer.setFormatForDate(new SimpleDateFormat(formatForDate));
215 | 0 |
             replacer.setFormatForTime(new SimpleDateFormat(formatForTime));
216 | 0 |
             replacer
217 |  |
                     .setFormatForTimestamp(new SimpleDateFormat(formatForTimestamp));
218 | 0 |
             return replacer.execute(sql, parameters);
219 |  |
         }
220 |  |
221 |  |
         /**
222 |  |
          * Date用のフォーマット
223 |  |
          *
224 |  |
          * @return
225 |  |
          */
226 | 0 |
         public DateFormat getFormatForDate() {
227 | 0 |
             return formatForDate;
228 |  |
         }
229 |  |
230 |  |
         /**
231 |  |
          * Time用のフォーマット
232 |  |
          *
233 |  |
          * @return
234 |  |
          */
235 | 0 |
         public DateFormat getFormatForTime() {
236 | 0 |
             return formatForTime;
237 |  |
         }
238 |  |
239 |  |
         /**
240 |  |
          * Timestamp用のフォーマット
241 |  |
          *
242 |  |
          * @return
243 |  |
          */
244 | 0 |
         public DateFormat getFormatForTimestamp() {
245 | 0 |
             return formatForTimestamp;
246 |  |
         }
247 |  |
248 |  |
         /**
249 |  |
          * Date用のフォーマット
250 |  |
          *
251 |  |
          * @param format
252 |  |
          */
253 | 0 |
         public void setFormatForDate(DateFormat format) {
254 | 0 |
             formatForDate = format;
255 |  |
         }
256 |  |
257 |  |
         /**
258 |  |
          * Time用のフォーマット
259 |  |
          *
260 |  |
          * @param format
261 |  |
          */
262 | 0 |
         public void setFormatForTime(DateFormat format) {
263 | 0 |
             formatForTime = format;
264 |  |
         }
265 |  |
266 |  |
         /**
267 |  |
          * Timestamp用のフォーマット
268 |  |
          *
269 |  |
          * @param format
270 |  |
          */
271 | 0 |
         public void setFormatForTimestamp(DateFormat format) {
272 | 0 |
             formatForTimestamp = format;
273 |  |
         }
274 |  |
275 |  |
         /**
276 |  |
          * 文字列、日付、時刻等を変換の際に使用するクォーテーション
277 |  |
          *
278 |  |
          * @return
279 |  |
          */
280 | 0 |
         public char getQuote() {
281 | 0 |
             return quote;
282 |  |
         }
283 |  |
284 |  |
         /**
285 |  |
          * 文字列、日付、時刻等を変換の際に使用するクォーテーション
286 |  |
          *
287 |  |
          * @param c
288 |  |
          */
289 | 0 |
         public void setQuote(char c) {
290 | 0 |
             quote = c;
291 |  |
         }
292 |  |
293 |  |
     }