001 /*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016 package org.opengion.hayabusa.develop;
017
018 import java.util.regex.Matcher;
019 import java.util.regex.Pattern;
020 import java.util.Locale;
021
022 /**
023 * JSPã®ç”Ÿæ?・ãƒ??ã‚¿å–り込ã¿å‡¦ç?§å¿?¦ãªåˆ—挙型をã¾ã¨ã‚ãŸã‚¯ãƒ©ã‚¹ã€?
024 *
025 * 主ã«ã‚ーワード管ç?¨ãƒ—ãƒã‚°ãƒ©ãƒ?¸ã®switchæ–??削減を目çš?¨ã—ã¦ä½œæ?ã€?
026 *
027 *
028 * @author Takeshi.Takada
029 *
030 */
031 public class JspEnumeration {
032 /**
033 * GROUP BYå¥ã‚’å¿?¦ã¨ã™ã‚‹é–¢æ•°ã‚’å?挙ã—ã¾ã™ã?
034 *
035 * containsã€searchã¨è¨?£ãŸç‹¬è‡ªãƒ¡ã‚½ãƒ?ƒ‰ã‚‚実è£?—ã¦ã?¾ã™ã?
036 *
037 */
038 // protected static enum GROUPING_FUNCTIONS { MAX , MIN , SUM , COUNT , max , min , sum , count ;
039 public static enum GROUPING_FUNCTIONS { MAX , MIN , SUM , COUNT ;
040
041 /**
042 * 与ãˆã‚‰ã‚ŒãŸæ–‡å—ãŒè‡ªèº«ã«åˆ—挙ã•れãŸå?ã®ä½•れã‹ã¨ä¸??ã™ã‚‹ã‹æ¤œè¨¼ã™ã‚‹ã€?
043 * ä¸??ã™ã‚‹å ´åˆã«çœŸã‚’è¿”ã™ã€?
044 * ä¸??ã—ãªã??åˆã«å½ã‚’è¿”ã™ã€?
045 *
046 * @param arg 引数
047 * @return 検証ã®çµæžœ
048 */
049 public static boolean contains( final String arg ) {
050 for( GROUPING_FUNCTIONS fnc : values() ){
051 // if ( arg.equals( fnc.toString() ) ){
052 if ( arg.equalsIgnoreCase( fnc.toString() ) ){
053 return true;
054 }
055 }
056 return false;
057 }
058
059 /**
060 * 自身ã«åˆ—挙ã•れã¦ã?‚‹å€¤ãŒä¸Žãˆã‚‰ã‚ŒãŸæ–‡å—å?ã«å«ã¾ã‚Œã¦ã?‚‹ã‹æ¤œè¨¼ã™ã‚‹ã€?
061 * å«ã¾ã‚Œã¦ã?‚‹å ´åˆã?真を返ã™ã€?
062 * å«ã¾ã‚Œã¦ã?ªã??åˆã?å½ã‚’è¿”ã™ã€?
063 *
064 * @param arg 引数
065 * @return 検証ã®çµæžœ
066 */
067 public static boolean search( final String arg ) {
068 String argU = arg.toUpperCase(Locale.JAPAN);
069
070 for( GROUPING_FUNCTIONS fnc : values() ){
071 // if( arg.indexOf( fnc.toString() ) > -1 ) {
072 if( argU.indexOf( fnc.toString() ) > -1 ) {
073 return true;
074 }
075 }
076 return false;
077 }
078 }
079
080 /**
081 * ãƒ??タ上ã?ãŸã ã®æ–?—å?ã¨ã—ã¦æ‰±ã?–¢æ•°ã‚’å?挙ã—ã¾ã™ã?
082 * (注?šç¾åœ¨ã€å?挙ä¸ã®é–¢æ•°ã¯Oracleã®å†?®¹ã§ã™ã?)
083 *
084 */
085 public static enum TREATS_STRING_FUNCTIONS {
086 CASE ,
087 CEIL , ROUND , FLOOR , TRUNC , MOD , CHR , CONCAT , SUBSTR , INITCAP ,
088 SUBSTRB , LOWER , TRIM , LPAD , LTRIM , UPPER , REPLACE , USER , RPAD ,
089 ASCII , LENGTH , LENGTHB , INSTR , POSITION , INSTRB , ADD_MONTHS , DAYOFMONTH ,
090 MONTHNAME , TIMESTAMPADD , CURDATE , DAYOFWEEK , MONTHS_BETWEEN , TIMESTAMPDIFF ,
091 CURRENT_DATE , DAYOFYEAR , NEXT_DAY , CURRENT_TIME , HOUR , NOW , WEEK , CURRENT_TIMESTAMP ,
092 LAST_DAY , YEAR , CURTIME , MINUTE , SECOND , DAYNAME , MONTH , SYSDATE , CAST , AVG ,
093 CONVERT , DATABASE , TO_CHAR , DECODE , TO_NUMBER , EXTRACT , TO_DATE , GREATEST , STDDEV ,
094 INTERVAL , VARIANCE , LEAST , LOCATE , NVL ;
095
096 /**
097 * 関数ã®å†?®¹ã«ç¬¬äºŒå¼•æ•°ã®å†?®¹ã‚’ä»˜åŠ ã™ã‚‹å‡¦ç?‚’実è£?—ã¾ã?
098 * 第二引数ã®å†?®¹
099 * 0:カラãƒ?¸ä»˜ä¸Žã™ã‚‹ãƒ†ãƒ¼ãƒ–ルå?ãƒ??ブル別å?
100 *
101 * @param column String
102 * @param args String[]
103 * @return 関数を更新ã—ãŸçµæžœ
104 */
105 public String update( final String column , final String[] args ) {
106 return column;
107 }
108
109 }
110
111 /**
112 * 演算åを列挙ã™ã‚‹ã€?
113 *
114 * â—使用ä¾?
115 * WHERE_OPERATORS op = WHERE_OPERATORS.valueOf("eq");
116 * System.out.println(op.apply("GF92.CLM","{@CLM}",false));
117 *
118 * â—上記å?ç?µæžœ
119 * GF92.CLM = '{@CLM}'
120 *
121 */
122 public static enum WHERE_OPERATORS {
123 eq() {
124 public String apply(final String left , final String right, final boolean is_num) {
125 if ( is_num ){
126 return leftVal(left) + "=\t " + right ;
127 }else {
128 return leftVal(left) + "=\t '" + right + "'";
129 }
130 }
131 public String[] symbol(){
132 return new String[] {"="};
133 }
134 } ,
135 lk1() {
136 public String apply(final String left , final String right, final boolean is_num) {
137 return leftVal(left) + "like '" + right + "%'";
138 }
139 public String[] symbol(){
140 return new String[] {"like","","%"};
141 }
142 } ,
143 lk2() {
144 public String apply(final String left , final String right, final boolean is_num) {
145 return leftVal(left) + "like '%" + right + "'";
146 }
147 public String[] symbol(){
148 return new String[] {"like","%",""};
149 }
150 } ,
151 lk3() {
152 public String apply(final String left , final String right, final boolean is_num) {
153 return leftVal(left) + "like '%" + right + "%'";
154 }
155 public String[] symbol(){
156 return new String[] {"like","%","%"};
157 }
158 } ,
159 gt() {
160 public String apply(final String left , final String right, final boolean is_num) {
161 if ( is_num ) {
162 return leftVal(left) + ">\t " + right + "";
163 }else{
164 return leftVal(left) + ">\t '" + right + "'";
165 }
166 }
167 public String[] symbol(){
168 return new String[] {">"};
169 }
170 } ,
171 ge() {
172 public String apply(final String left , final String right, final boolean is_num) {
173 if ( is_num ) {
174 return leftVal(left) + ">=\t " + right + "";
175 }else{
176 return leftVal(left) + ">=\t '" + right + "'";
177 }
178 }
179 public String[] symbol(){
180 return new String[] {">="};
181 }
182 } ,
183 lt() {
184 public String apply(final String left , final String right, final boolean is_num) {
185 if ( is_num ) {
186 return leftVal(left) + "<\t " + right + "";
187 }else {
188 return leftVal(left) + "<\t '" + right + "'";
189 }
190 }
191 public String[] symbol(){
192 return new String[] {"<"};
193 }
194 } ,
195 le() {
196 public String apply(final String left , final String right, final boolean is_num) {
197 if ( is_num ){
198 return leftVal(left) + "<=\t " + right + "";
199 }else{
200 return leftVal(left) + "<=\t '" + right + "'";
201 }
202 }
203 public String[] symbol(){
204 return new String[] {"<="};
205 }
206 } ,
207 not() {
208 public String apply(final String left , final String right, final boolean is_num) {
209 if ( is_num ) {
210 return leftVal(left) + "!=\t " + right + "";
211 } else {
212 return leftVal(left) + "!=\t '" + right + "'";
213 }
214 }
215 public String[] symbol(){
216 return new String[] {"!="};
217 }
218 } ,
219 bw() {
220 public String apply(final String left , final String right, final boolean is_num) {
221 if ( is_num ) {
222 return leftVal(left) + "between " + betweenFormat( right , "_FROM" ) + " and " + betweenFormat( right , "_TO" ) + "";
223 }else {
224 return leftVal(left) + "between '" + betweenFormat( right , "_FROM" ) + "' and '" + betweenFormat( right , "_TO" ) + "'";
225 }
226 }
227 public String[] symbol(){
228 return new String[] {"between"};
229 }
230 } ,
231 in() {
232 public String apply(final String left , final String right, final boolean is_num) {
233 return leftVal(left) + "in\t (" +inFormat( right , is_num ) + ")";
234 }
235 public String[] symbol(){
236 return new String[] {"in"};
237 }
238 } ,
239 ;
240
241 // static final String[] TABS = new String[] { "\t\t\t" , "\t\t" , "\t" };
242 static final String[] TABS = new String[] { "\t\t\t\t" , "\t\t\t" , "\t\t" , "\t" }; // 5.6.4.4 (2013/05/31)
243
244 /**
245 * 演算åã?記å·ã‚’略語ã«å¤‰æ›ã™ã‚‹ã€?
246 *
247 * @og.rev 5.6.4.4 (2013/05/31) タブã«ã‚ˆã‚‹ä½ç½®åˆã‚ã›ã?計算方法修æ£ã€?
248 *
249 * @param left 引数
250 * @return 演算åã?記å·ã®ç•¥èª?
251 */
252 static String leftVal( final String left ) {
253 // return left + TABS[Math.max( left.length()/4, TABS.length-1 )] ; // ?”タブを想定ã?
254
255 int adrs = ((left.length()-1)/4 > 3 ) ? 3 : (left.length()-1)/4 ;
256 return left + TABS[adrs] ; // ?”タブを想定ã?
257 }
258
259 /**
260 * 与ãˆã‚‰ã‚ŒãŸå·¦è¾ºã¨å³è¾ºã‚’å?ã«æ¼”ç®—å付ãã®æ–?—å?を作æ?ã™ã‚‹ã€?
261 * 第?“引数ã®booleanã¯ã€trueã®æ™‚ã«å€¤ãŒæ•°å€¤ã§ã‚ã‚‹ã“ã¨ã‚’æ„味ã™ã‚‹ã€?
262 *
263 * @param left String
264 * @param right String
265 * @param is_num boolean
266 * @return 演算åã‚’åŠ?ˆãŸçµæžœ
267 */
268 abstract public String apply(final String left , final String right , final boolean is_num);
269
270 /**
271 * 演算åã‚’è¿”å´ã™ã‚‹ã€?
272 *
273 * @return String[] 演算å?
274 */
275 abstract public String[] symbol();
276
277 /**
278 * INå¥ã®å€¤ã‚’çµ?¿ç«‹ã¦ãªãŠã—ã¾ã™ã?
279 *
280 * @param str String
281 * @param is_number boolean
282 * @return INå¥ã®ãƒ•ォーマッãƒ?
283 */
284 static String inFormat(final String str , final boolean is_number){
285 StringBuilder formated = new StringBuilder("");
286 String[] ins = str.split( "," );
287 for (String in :ins ){
288 if (formated.length() > 0 ){
289 formated.append( "," );
290 }
291 if ( is_number ) {
292 formated.append( in );
293 }else{
294 formated.append( "'" ).append( in ).append( "'" );
295 }
296 }
297
298 return formated.toString();
299
300 }
301
302 /**
303 * BETWEENã‚’çµ?¿ç«‹ã¦ãªãŠã™ã€?
304 *
305 * @param str String
306 * @param suffix String
307 * @return BETWEENã®ãƒ•ォーマッãƒ?
308 */
309 static String betweenFormat(final String str , final String suffix){
310 StringBuilder sb = new StringBuilder(str);
311 if ( str.indexOf("{@") == 0 ){
312 sb.insert( sb.length() - 1 , suffix );
313 }else{
314 sb.append( suffix );
315 }
316 return sb.toString();
317 }
318
319 static Pattern LK1_PTN = Pattern.compile("like\\s+\\'\\{@(\\w*?)\\}%\\'");
320 static Pattern LK2_PTN = Pattern.compile("like\\s+\\'%\\{@(\\w*?)\\}\\'");
321 static Pattern LK3_PTN = Pattern.compile("like\\s+\\'%\\{@(\\w*?)\\}%\\'");
322
323 /**
324 * 演算åã?記å·ã‚’略語ã«å¤‰æ›ã™ã‚‹ã€?
325 *
326 * @param arg 引数
327 * @return 演算åã?記å·ã®ç•¥èª?
328 */
329 static String convert(final String arg){
330 for( WHERE_OPERATORS fnc : values() ){
331 if ( fnc.symbol().length == 1 && arg.trim().indexOf( fnc.symbol()[0] ) == 0 ){
332 return fnc.toString();
333 }
334 if( fnc.symbol().length == 3){
335 // Matcher matcher = Pattern.compile("like\\s+\\'\\{@(\\w*?)\\}%\\'").matcher( arg );
336 Matcher matcher = LK1_PTN.matcher( arg );
337 if (matcher.find()){
338 return lk1.toString();
339 }
340 // matcher = Pattern.compile("like\\s+\\'%\\{@(\\w*?)\\}\\'").matcher( arg );
341 matcher = LK2_PTN.matcher( arg );
342 if (matcher.find()){
343 return lk2.toString();
344 }
345 // matcher = Pattern.compile("like\\s+\\'%\\{@(\\w*?)\\}%\\'").matcher( arg );
346 matcher = LK3_PTN.matcher( arg );
347 if (matcher.find()){
348 return lk3.toString();
349 }
350 }
351 }
352 return "";
353 }
354 }
355
356 }