LQMGChangeExecListener.java

/*
 * Copyright (C) 2011 Everit Kft. (http://www.everit.biz)
 *
 * 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.everit.persistence.lqmg.internal.liquibase;

import java.util.Map;

import org.everit.persistence.liquibase.ext.osgi.EOSGiResourceAccessor;
import org.everit.persistence.lqmg.LQMG;
import org.everit.persistence.lqmg.LQMGException;
import org.everit.persistence.lqmg.internal.ConfigPath;
import org.everit.persistence.lqmg.internal.ConfigurationContainer;
import org.osgi.framework.Bundle;

import liquibase.change.AbstractChange;
import liquibase.change.Change;
import liquibase.changelog.ChangeSet;
import liquibase.changelog.ChangeSet.ExecType;
import liquibase.changelog.ChangeSet.RunStatus;
import liquibase.changelog.DatabaseChangeLog;
import liquibase.changelog.visitor.ChangeExecListener;
import liquibase.database.Database;
import liquibase.exception.PreconditionErrorException;
import liquibase.exception.PreconditionFailedException;
import liquibase.osgi.OSGiResourceAccessor;
import liquibase.precondition.core.PreconditionContainer.ErrorOption;
import liquibase.precondition.core.PreconditionContainer.FailOption;
import liquibase.resource.ResourceAccessor;

public class LQMGChangeExecListener implements ChangeExecListener {

  private final ConfigurationContainer configurationContainer;

  public LQMGChangeExecListener(final ConfigurationContainer configurationContainer) {
    this.configurationContainer = configurationContainer;
  }

  @Override
  public void preconditionErrored(final PreconditionErrorException error,
      final ErrorOption onError) {
  }

  @Override
  public void preconditionFailed(final PreconditionFailedException error, final FailOption onFail) {
  }

  @Override
  public void ran(final Change change, final ChangeSet changeSet, final DatabaseChangeLog changeLog,
      final Database database) {
    if (!(change instanceof AbstractChange)) {
      throw new LQMGException(
          "Change must be a descendant of AbstractChange: " + change.getClass().getName(),
          null);
    }
    AbstractChange abstractChange = (AbstractChange) change;
    ResourceAccessor resourceAccessor = abstractChange.getResourceAccessor();
    if (!(resourceAccessor instanceof OSGiResourceAccessor)) {
      throw new LQMGException("Resource accessor must have type OSGiResourceAccessor: "
          + resourceAccessor.getClass().getName(), null);
    }

    EOSGiResourceAccessor osgiResourceAccessor = (EOSGiResourceAccessor) resourceAccessor;

    Bundle bundle = osgiResourceAccessor.getBundle();
    Map<String, Object> attributes = osgiResourceAccessor.getAttributes();

    String configPath = (String) attributes.get(LQMG.CAPABILITY_LQMG_CONFIG_RESOURCE);
    if (configPath != null) {
      configurationContainer.addConfiguration(new ConfigPath(bundle, configPath));
    }
  }

  @Override
  public void ran(final ChangeSet changeSet, final DatabaseChangeLog databaseChangeLog,
      final Database database,
      final ExecType execType) {
  }

  @Override
  public void rolledBack(final ChangeSet changeSet, final DatabaseChangeLog databaseChangeLog,
      final Database database) {
  }

  @Override
  public void runFailed(final ChangeSet changeSet, final DatabaseChangeLog databaseChangeLog,
      final Database database,
      final Exception exception) {

  }

  @Override
  public void willRun(final Change change, final ChangeSet changeSet,
      final DatabaseChangeLog changeLog,
      final Database database) {
  }

  @Override
  public void willRun(final ChangeSet changeSet, final DatabaseChangeLog databaseChangeLog,
      final Database database,
      final RunStatus runStatus) {
  }

}