/**
* Copyright (c) 2008--2012 Red Hat, Inc.
*
* This software is licensed to you under the GNU General Public License,
* version 2 (GPLv2). There is NO WARRANTY for this software, express or
* implied, including the implied warranties of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
* along with this software; if not, see
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
*
* Red Hat trademarks are not licensed under GPLv2. No permission is
* granted to use or replicate Red Hat trademarks that are incorporated
* in this software or its documentation.
*/
package com.redhat.satellite.search;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import com.redhat.satellite.search.db.DatabaseManager;
import com.redhat.satellite.search.db.WriteQuery;
import com.redhat.satellite.search.config.Configuration;
/**
* Reindex - cleans up indexes on filesystem and database so reindexing will occur
* @version $Rev: 1 $
*/
public class DeleteIndexes {
private static Logger log = Logger.getLogger(DeleteIndexes.class);
private DeleteIndexes() {
}
protected static boolean deleteDirectory(File dir) {
File[] files = dir.listFiles();
boolean warning = true;
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
deleteDirectory(files[i]);
}
if (files[i].delete()) {
log.debug("Deleted: " + files[i].getAbsolutePath());
}
else {
log.warn("*ERROR* unable to delete: " + files[i].getAbsolutePath());
warning = false;
}
}
if (!dir.delete()) {
log.warn("*ERROR* unable to delete: " + dir.getAbsolutePath());
warning = false;
}
return warning;
}
protected static boolean deleteIndexPath(String path) {
File dir = new File(path);
if ("/".equals(dir.getAbsolutePath())) {
log.warn("Error, passed in path is <" + path + "> this looks wrong");
return false;
}
if (!dir.exists()) {
log.debug("Path <" + dir.getAbsolutePath() + "> doesn't exist");
return true; // dir doesn't exist, so just as good as deleted
}
if (!dir.isDirectory()) {
log.warn("Error, passed in path <" + path + "> is not a directory");
return false;
}
log.info("Attempting to delete " + dir.getAbsolutePath());
return deleteDirectory(dir);
}
protected static void deleteQuery(DatabaseManager databaseManager,
String queryName) throws SQLException {
WriteQuery query = null;
log.info("Running query: " + queryName);
query = databaseManager.getWriterQuery(queryName);
query.delete(null);
query.close();
}
/**
* @param args
*/
public static void main(String[] args) {
try {
Configuration config = new Configuration();
DatabaseManager databaseManager = new DatabaseManager(config);
String indexWorkDir = config.getString("search.index_work_dir", null);
if (StringUtils.isBlank(indexWorkDir)) {
log.warn("Couldn't find path for where index files are stored.");
log.warn("Looked in config for property: search.index_work_dir");
return;
}
List<IndexInfo> indexes = new ArrayList<IndexInfo>();
indexes.add(new IndexInfo("deleteLastErrata",
indexWorkDir + File.separator + "errata"));
indexes.add(new IndexInfo("deleteLastPackage",
indexWorkDir + File.separator + "package"));
indexes.add(new IndexInfo("deleteLastServer",
indexWorkDir + File.separator + "server"));
indexes.add(new IndexInfo("deleteLastHardwareDevice",
indexWorkDir + File.separator + "hwdevice"));
indexes.add(new IndexInfo("deleteLastSnapshotTag",
indexWorkDir + File.separator + "snapshotTag"));
indexes.add(new IndexInfo("deleteLastServerCustomInfo",
indexWorkDir + File.separator + "serverCustomInfo"));
indexes.add(new IndexInfo("deleteLastXccdfIdent",
indexWorkDir + File.separator + "xccdfIdent"));
for (IndexInfo info : indexes) {
deleteQuery(databaseManager, info.getQueryName());
if (!deleteIndexPath(info.getDirPath())) {
log.warn("Failed to delete index for " + info.getDirPath());
}
}
}
catch (SQLException e) {
log.error("Caught Exception: ", e);
if (e.getErrorCode() == 17002) {
log.error("Unable to establish database connection.");
log.error("Ensure database is available and connection details are " +
"correct, then retry");
}
System.exit(1);
}
catch (IOException e) {
log.error("Caught Exception: ", e);
System.exit(1);
}
log.info("Index files have been deleted and database has been cleaned up, " +
"ready to reindex");
}
/**
* IndexInfo
*/
protected static class IndexInfo {
protected String queryName;
protected String dirPath;
/**
*
* @param query query name to delete all records
* @param path string pointing to where index files reside
*/
public IndexInfo(String query, String path) {
queryName = query;
dirPath = path;
}
/**
* Set the query name to delete all records for this index
* @param queryNameIn name of the query
*/
public void setQueryName(String queryNameIn) {
queryName = queryNameIn;
}
/**
* Returns the query name
* @return
*/
public String getQueryName() {
return queryName;
}
/**
* Set the path where the index files exist
* @param path String which points to index files
*/
public void setDirPath(String path) {
dirPath = path;
}
/**
* Returns the path
* @return a string which points to the index files
*/
public String getDirPath() {
return dirPath;
}
}
}