/*
* Data Hub Service (DHuS) - For Space data distribution.
* Copyright (C) 2013,2014,2015 GAEL Systems
*
* This file is part of DHuS software sources.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.gael.dhus.database.liquibase;
import liquibase.change.custom.CustomTaskChange;
import liquibase.database.Database;
import liquibase.database.jvm.JdbcConnection;
import liquibase.exception.CustomChangeException;
import liquibase.exception.DatabaseException;
import liquibase.exception.SetupException;
import liquibase.exception.ValidationErrors;
import liquibase.resource.ResourceAccessor;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Corrects invalid ingestion dates in database.
*/
public class CorrectsIngestionDate implements CustomTaskChange
{
/**
* Logger of this class.
*/
private static final Logger LOGGER = LogManager.getLogger(CorrectsIngestionDate.class);
@Override
public void execute (Database database) throws CustomChangeException
{
SimpleDateFormat metaSdf =
new SimpleDateFormat ("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
SimpleDateFormat productSdf =
new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss.SSS");
String query =
"SELECT p.ID, m.VALUE, p.INGESTIONDATE " +
"FROM PRODUCTS p LEFT OUTER JOIN " +
"METADATA_INDEXES m ON p.ID = m.PRODUCT_ID " +
"WHERE m.NAME = 'Ingestion Date'";
try
{
JdbcConnection connection = (JdbcConnection) database.getConnection ();
PreparedStatement statement = connection.prepareStatement (query);
ResultSet result = statement.executeQuery ();
while (result.next ())
{
Date validIngestionDate = metaSdf.parse (result.getString (2));
Date ingestionDate = productSdf.parse (result.getString (3));
long diffMilli =
validIngestionDate.getTime () - ingestionDate.getTime ();
long diffHour = diffMilli / (1000 * 60 * 60);
if (diffHour >= 11.0)
{
StringBuilder sb = new StringBuilder ();
sb.append ("UPDATE PRODUCTS ");
sb.append ("SET INGESTIONDATE = '").append (
productSdf.format (validIngestionDate)).append ("' ");
sb.append ("WHERE ID = ").append (result.getLong (1));
PreparedStatement update =
connection.prepareStatement (sb.toString ());
if (update.executeUpdate () != 1)
{
LOGGER.warn("Cannot change ingestion date for product#" +
result.getLong (1));
}
}
}
result.close ();
statement.close ();
}
catch (DatabaseException | SQLException | ParseException e)
{
throw new CustomChangeException (
"An error occurred during liquibase execution: ", e);
}
}
@Override
public String getConfirmationMessage ()
{
return null;
}
@Override
public void setUp () throws SetupException
{
}
@Override
public void setFileOpener (ResourceAccessor resource_accessor)
{
}
@Override
public ValidationErrors validate (Database database)
{
return null;
}
}