diff --git a/common/source/java/ch/systemsx/cisd/common/parser/DBRestrictions.java b/common/source/java/ch/systemsx/cisd/common/db/DBRestrictions.java similarity index 74% rename from common/source/java/ch/systemsx/cisd/common/parser/DBRestrictions.java rename to common/source/java/ch/systemsx/cisd/common/db/DBRestrictions.java index 2bd630eadef73840b7c6d926e7ae12cf9cef4d67..3f956f16fd826f3baa291b283fe4dc134ab3866a 100644 --- a/common/source/java/ch/systemsx/cisd/common/parser/DBRestrictions.java +++ b/common/source/java/ch/systemsx/cisd/common/db/DBRestrictions.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ch.systemsx.cisd.common.parser; +package ch.systemsx.cisd.common.db; import java.util.ArrayList; import java.util.HashMap; @@ -25,6 +25,7 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; @@ -43,11 +44,18 @@ public class DBRestrictions private static final Pattern VARCHAR_PATTERN = Pattern.compile("varchar\\(([0-9]+)\\)"); - private static final Pattern CREATE_TABLE_PATTERN = Pattern.compile("create table ([a-z,0-9,_]+) \\((.+)\\)"); + /** The prefix each <code>create table</code> statement starts with. */ + private static final String CREATE_TABLE_PREFIX = "create table "; + + private static final Pattern CREATE_TABLE_PATTERN = + Pattern.compile(CREATE_TABLE_PREFIX + "([a-z,0-9,_]+) \\((.+)\\)"); + + /** The prefix each <code>alter table</code> statement starts with (to add a constraint). */ + private static final String ALTER_TABLE_PREFIX = "alter table "; private static final Pattern CHECK_CONSTRAINT_PATTERN = - Pattern - .compile("alter table ([a-z,0-9,_]+) add constraint [a-z,0-9,_]+ check \\(([a-z,0-9,_]+) in \\((.+)\\)\\)"); + Pattern.compile(ALTER_TABLE_PREFIX + + "([a-z,0-9,_]+) add constraint [a-z,0-9,_]+ check \\(([a-z,0-9,_]+) in \\((.+)\\)\\)"); private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, DBRestrictions.class); @@ -137,15 +145,22 @@ public class DBRestrictions { for (String line : ddlScript) { - final Matcher createTableMatcher = CREATE_TABLE_PATTERN.matcher(line); - if (createTableMatcher.matches()) + if (line.startsWith(CREATE_TABLE_PREFIX)) { - final String tableName = createTableMatcher.group(1); - final String tableDefinition = createTableMatcher.group(2); - final String[] columnDefinitions = StringUtils.split(tableDefinition, ','); - for (String columnDefinition : columnDefinitions) + final Matcher createTableMatcher = CREATE_TABLE_PATTERN.matcher(line); + if (createTableMatcher.matches()) { - parseColumnDefinition(columnDefinition, tableName, domains); + final String tableName = createTableMatcher.group(1); + final String tableDefinition = createTableMatcher.group(2); + final String[] columnDefinitions = StringUtils.split(tableDefinition, ','); + for (String columnDefinition : columnDefinitions) + { + parseColumnDefinition(columnDefinition, tableName, domains); + } + } else + { + operationLog.warn("line \"" + line + "\" looks like table definition, but is ill-formed."); + continue; } } } @@ -186,40 +201,40 @@ public class DBRestrictions { assert array != null; assert term != null; - - for (int i = firstIndex; i < array.length; ++i) - { - if (term.equals(array[i])) - { - return i; - } - } - return -1; + return ArrayUtils.indexOf(array, term, firstIndex); } private void parserCheckedConstraints(List<String> ddlScript) { for (String line : ddlScript) { - final Matcher checkedConstraintMatcher = CHECK_CONSTRAINT_PATTERN.matcher(line); - if (checkedConstraintMatcher.matches()) + if (line.startsWith(ALTER_TABLE_PREFIX)) { - final String tableName = checkedConstraintMatcher.group(1); - final String columnName = checkedConstraintMatcher.group(2); - final String alternativesStr = checkedConstraintMatcher.group(3); - final String[] alternatives = StringUtils.split(alternativesStr, ','); - final Set<String> alternativeSet = new HashSet<String>(); - for (String alternative : alternatives) + + final Matcher checkedConstraintMatcher = CHECK_CONSTRAINT_PATTERN.matcher(line); + if (checkedConstraintMatcher.matches()) { - if (alternative.charAt(0) != '\'' || alternative.charAt(alternative.length() - 1) != '\'') + final String tableName = checkedConstraintMatcher.group(1); + final String columnName = checkedConstraintMatcher.group(2); + final String alternativesStr = checkedConstraintMatcher.group(3); + final String[] alternatives = StringUtils.split(alternativesStr, ','); + final Set<String> alternativeSet = new HashSet<String>(); + for (String alternative : alternatives) { - operationLog.warn("Invalid alternatives definition \"" + alternative + "\" for column " - + columnName + " of table " + tableName); - continue; + if (alternative.charAt(0) != '\'' || alternative.charAt(alternative.length() - 1) != '\'') + { + operationLog.warn("Invalid alternatives definition \"" + alternative + "\" for column " + + columnName + " of table " + tableName); + continue; + } + alternativeSet.add(alternative.substring(1, alternative.length() - 1)); } - alternativeSet.add(alternative.substring(1, alternative.length() - 1)); + getTableRestrictions(tableName).checkedConstraintsMap.put(columnName, alternativeSet); + } else + { + operationLog.warn("line \"" + line + "\" looks like constraint definition, but is ill-formed."); + continue; } - getTableRestrictions(tableName).checkedConstraintsMap.put(columnName, alternativeSet); } } } diff --git a/common/source/java/ch/systemsx/cisd/common/parser/SQLCommandTokenizer.java b/common/source/java/ch/systemsx/cisd/common/db/SQLCommandTokenizer.java similarity index 99% rename from common/source/java/ch/systemsx/cisd/common/parser/SQLCommandTokenizer.java rename to common/source/java/ch/systemsx/cisd/common/db/SQLCommandTokenizer.java index 519423f749aa28f1a9176921a0b940a5374ba308..1b6419ab2fe58208091ae04197daa4fc804463ff 100644 --- a/common/source/java/ch/systemsx/cisd/common/parser/SQLCommandTokenizer.java +++ b/common/source/java/ch/systemsx/cisd/common/db/SQLCommandTokenizer.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package ch.systemsx.cisd.common.parser; +package ch.systemsx.cisd.common.db; /** * A class keeping the state when normalizing a SQL script.