/**
* This class checks all the PackagedDrug records in the database and ensures that each
* Package's PackagedDrugs have indices numbered from 0,1,..., n-1 where n is number of
* PackagedDrugs in a Package
*/
package org.celllife.idart.misc.task;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.IProgressMonitor;
/**
* @author ilda
*
*/
public class PackagedDrugsIndexCheck extends JDBCTask {
private static Statement statement;
private static ResultSet results;
private static Logger log = Logger.getLogger(PackagedDrugsIndexCheck.class);
@Override
public boolean init(String[] args) {
return true;
}
@Override
public void runTask(IProgressMonitor monitor)
throws TaskException {
try {
statement = getConnection().createStatement();
// fetch all the Packages ids in the database
List<Integer> allPackageIds = new ArrayList<Integer>();
String allPackageIdsQuery = "select distinct id from package";
results = statement.executeQuery(allPackageIdsQuery);
while (results.next()) {
allPackageIds.add(results.getInt("id"));
}
// fetch all the PackagedDrugs indices for each package
List<Integer> packagedDrugIndices;
for (int p : allPackageIds) {
monitor.setTaskName("Checking package indexes: " + p);
packagedDrugIndices = getPackagedDrugsForPackage(p, false);
// check whether this packages's packagedrugs' indices are
// correctly numbered from 0 to n-1, if they are incorrectly
// numbered then reset them
boolean indicesOk = indicesOk(packagedDrugIndices);
if (!indicesOk) {
resetIndices(p);
log.info("Indices reset for package " + p);
packagedDrugIndices = getPackagedDrugsForPackage(p, false);
if (!indicesOk(packagedDrugIndices))
throw new TaskException(
"PackagedDrugsIndexCheck task failed.");
}
}
} catch (SQLException se) {
log.error("PackagedDrugsIndexCheck unsuccessful", se);
throw new TaskException("PackagedDrugsIndexCheck task failed.", se);
}
}
private List<Integer> getPackagedDrugsForPackage(int p, boolean fetchIds)
throws SQLException {
List<Integer> packagedDrugs;
packagedDrugs = new ArrayList<Integer>();
String columnToFetch = fetchIds ? "id" : "packageddrugsindex";
String allPackagedDrugsIndicesQuery = "select " + columnToFetch
+ " from packageddrugs where parentPackage = " + p
+ " order by packageddrugsindex asc";
results = statement.executeQuery(allPackagedDrugsIndicesQuery);
while (results.next()) {
packagedDrugs.add(results.getInt(1));
}
return packagedDrugs;
}
public boolean indicesOk(List<Integer> pdList) {
for (int i = 0; i < pdList.size(); i++) {
if (pdList.get(i) != i)
return false;
}
return true;
}
public void resetIndices(int packageId) throws SQLException {
List<Integer> pdList = getPackagedDrugsForPackage(packageId, true);
for (int i = 0; i < pdList.size(); i++) {
String pdIndexUpdate = "update packageddrugs set packageddrugsindex = "
+ i + " where id = " + pdList.get(i);
statement.executeUpdate(pdIndexUpdate);
}
}
@Override
public String getHelpText() {
return "No arguements required.";
}
@Override
public String getDescription() {
return "checks all the PackagedDrug records in the "
+ "database and ensures their indicies are numbered correctly";
}
}