/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.translator.jdbc.oracle;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.teiid.core.util.StringUtil;
import org.teiid.translator.jdbc.ParseFormatFunctionModifier;
public class OracleFormatFunctionModifier extends
ParseFormatFunctionModifier {
static final Pattern tokenPattern = Pattern.compile("(G+|y{1,4}|M{2,4}|DD|dd|E+|a+|HH|hh|mm|ss|S+|Z+|[\\- /,.;:]+|(?:'[^'\"]*')+|[^'\"a-zA-Z]+)"); //$NON-NLS-1$
protected boolean parse;
public OracleFormatFunctionModifier(String prefix, boolean parse) {
super(prefix);
this.parse = parse;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public boolean supportsLiteral(String literal) {
try {
translateFormat(literal);
} catch (IllegalArgumentException e) {
return false;
}
return true;
}
@Override
protected Object translateFormat(String format) {
Matcher m = tokenPattern.matcher(format);
StringBuilder sb = new StringBuilder();
sb.append("'"); //$NON-NLS-1$
int end = 0;
char previous = 0;
while (m.find()) {
if (m.group().length() == 0) {
continue;
}
if (end == 0) {
if (m.start() != 0) {
throw new IllegalArgumentException();
}
} else if (m.start() != end) {
throw new IllegalArgumentException();
}
String group = m.group();
if (Character.isLetter(previous) && group.charAt(0) == previous) {
throw new IllegalArgumentException();
}
previous = group.charAt(0);
sb.append(convertToken(group));
end = m.end();
}
if (end != format.length()) {
throw new IllegalArgumentException();
}
sb.append("'"); //$NON-NLS-1$
return sb.toString();
}
protected Object convertToken(String group) {
switch (group.charAt(0)) {
case 'G':
return "AD"; //$NON-NLS-1$
case 'y':
if (group.length() == 2) {
return "YY"; //$NON-NLS-1$
}
return "YYYY"; //$NON-NLS-1$
case 'M':
if (group.length() == 2) {
return "MM"; //$NON-NLS-1$
}
if (group.length() == 3) {
return "Mon"; //$NON-NLS-1$
}
return "Month"; //$NON-NLS-1$
case 'D':
return "DDD"; //$NON-NLS-1$
case 'd':
return "DD"; //$NON-NLS-1$
case 'E':
if (group.length() >= 4) {
return "Day"; //$NON-NLS-1$
}
return "Dy"; //$NON-NLS-1$
case 'a':
return "AM"; //$NON-NLS-1$
case 'H':
return "HH24"; //$NON-NLS-1$
case 'h':
if (parse) {
return "HH24"; //$NON-NLS-1$
}
return "HH"; //$NON-NLS-1$
case 'm':
return "MI"; //$NON-NLS-1$
case 's':
return "SS"; //$NON-NLS-1$
case 'S':
return "FF" + group.length(); //$NON-NLS-1$
case 'Z':
return "TZHTZM";//$NON-NLS-1$
case '\'':
return '"' + StringUtil.replaceAll(StringUtil.replaceAll(StringUtil.replaceAll(group.substring(1, group.length() - 1), "''", "'"), "'", "''"), "\"", "\"\"") + '"'; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
case ' ':
case '-':
case '/':
case ',':
case '.':
case ';':
case ':':
return group;
default:
return '"' + group + '"';
}
}
}