Package org.ngrinder.infra.init

Source Code of org.ngrinder.infra.init.LockExDatabaseChangeLogGenerator

/*
* Licensed under the Apache License, Version 2.0 (the "License");
*  you may not use this file except in compliance with the License.
*  You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.ngrinder.infra.init;

import java.net.InetAddress;
import java.sql.Timestamp;

import liquibase.database.Database;
import liquibase.database.core.CUBRIDDatabase;
import liquibase.database.typeconversion.TypeConverterFactory;
import liquibase.exception.UnexpectedLiquibaseException;
import liquibase.exception.ValidationErrors;
import liquibase.sql.Sql;
import liquibase.sqlgenerator.SqlGeneratorChain;
import liquibase.sqlgenerator.SqlGeneratorFactory;
import liquibase.sqlgenerator.core.AbstractSqlGenerator;
import liquibase.statement.core.LockExDatabaseChangeLogStatement;
import liquibase.statement.core.UpdateStatement;
import liquibase.util.NetUtil;

/**
* Customized {@link liquibase.sqlgenerator.core.LockDatabaseChangeLogGenerator}. <br/>
* previous {@link liquibase.sqlgenerator.core.LockDatabaseChangeLogGenerator} runs update sql
* which only checks if the lock status equals to BooleanType true value.
* It does not work if the prevous field type is changed due to
* hibernate dialect changes.
*
* @author JunHo Yoon
* @since 3.0
*/
public class LockExDatabaseChangeLogGenerator extends
        AbstractSqlGenerator<LockExDatabaseChangeLogStatement> {

  /*
   * (non-Javadoc)
   *
   * @see liquibase.sqlgenerator.SqlGenerator#validate(liquibase.statement.SqlStatement,
   * liquibase.database.Database, liquibase.sqlgenerator.SqlGeneratorChain)
   */
  @Override
  public ValidationErrors validate(LockExDatabaseChangeLogStatement statement, Database database,
          SqlGeneratorChain sqlGeneratorChain) {
    return new ValidationErrors();
  }

  /*
   * (non-Javadoc)
   *
   * @see liquibase.sqlgenerator.SqlGenerator#generateSql(liquibase.statement.SqlStatement,
   * liquibase.database.Database, liquibase.sqlgenerator.SqlGeneratorChain)
   */
  @Override
  public Sql[] generateSql(LockExDatabaseChangeLogStatement statement, Database database,
          SqlGeneratorChain sqlGeneratorChain) {
    String liquibaseSchema = null;
    liquibaseSchema = database.getLiquibaseSchemaName();

    InetAddress localHost;
    try {
      localHost = NetUtil.getLocalHost();
    } catch (Exception e) {
      throw new UnexpectedLiquibaseException(e);
    }

    UpdateStatement updateStatement = new UpdateStatement(liquibaseSchema,
            database.getDatabaseChangeLogLockTableName());
    updateStatement.addNewColumnValue("LOCKED", true);
    updateStatement.addNewColumnValue("LOCKGRANTED", new Timestamp(new java.util.Date().getTime()));
    updateStatement.addNewColumnValue("LOCKEDBY", localHost.getHostName()
            + " (" + localHost.getHostAddress() + ")");
    String whereClause = database.escapeColumnName(liquibaseSchema,
            database.getDatabaseChangeLogTableName(), "ID")
            + " = 1 AND ";

    if (database instanceof CUBRIDDatabase) {
      whereClause = whereClause
              + "( "
              + database.escapeColumnName(liquibaseSchema,
                      database.getDatabaseChangeLogTableName(),
                      "LOCKED")
              + " = "
              + TypeConverterFactory.getInstance().findTypeConverter(database).getBooleanType()
                      .getFalseBooleanValue()
              + " OR "
              + database.escapeColumnName(liquibaseSchema,
                      database.getDatabaseChangeLogTableName(),
                      "LOCKED") + " = '0')";
    } else {
      whereClause = whereClause
              + database.escapeColumnName(liquibaseSchema,
                      database.getDatabaseChangeLogTableName(),
                      "LOCKED")
              + " = "
              + TypeConverterFactory.getInstance().findTypeConverter(database).getBooleanType()
                      .getFalseBooleanValue();
    }
    updateStatement.setWhereClause(whereClause);

    return SqlGeneratorFactory.getInstance().generateSql(updateStatement, database);

  }
}
TOP

Related Classes of org.ngrinder.infra.init.LockExDatabaseChangeLogGenerator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.