package org.agnitas.emm.extension.sqlparser.validator.impl; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.agnitas.emm.extension.exceptions.DatabaseScriptException; import org.apache.log4j.Logger; /** * Implementation of the StatementValidation interface providing a simple subset of the <code>ALTER TABLE ... DROP ...</code> statement. * * This implementation allows only a single modification. In this case, dropping columns. * There is only one column per <i>ALTER TABLE</i> allowed. * * @author md * * @see StatementValidation */ class AlterTableDropColumnValidation extends BasicValidation { /** Logger. */ private static final transient Logger logger = Logger.getLogger( AlterTableDropColumnValidation.class); /** Pattern unsed for statement recognition. */ private final Pattern ALTER_TABLE_PATTERN = Pattern.compile( "^\\s*alter\\s+table\\s+([^ ]+)\\s+drop\\s+(?:column\\s+)?([^ ,]+)\\s*$", Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.UNICODE_CASE); @Override public boolean validate(String statement, String namePrefix) throws DatabaseScriptException { Matcher matcher = ALTER_TABLE_PATTERN.matcher( statement); if( !matcher.matches()) { if( logger.isInfoEnabled()) logger.info( "Statement does not match regular expression"); return false; } String tableName = matcher.group( 1); String columnName = matcher.group( 2); if( logger.isDebugEnabled()) { logger.debug( "table name: " + tableName); logger.debug( "column name: " + columnName); } if( tableNameHasPluginPrefix( tableName, namePrefix)) { validateTableName( tableName, namePrefix); } else { validateColumnName( columnName, namePrefix); } return true; } }