/*
* RHQ Management Platform
* Copyright (C) 2013 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2, as
* published by the Free Software Foundation, and/or the GNU Lesser
* General Public License, version 2.1, also as published by the Free
* Software Foundation.
*
* 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 General Public License and the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* and the GNU Lesser General Public License along with this program;
* if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.rhq.test.arquillian.impl;
import java.io.File;
import java.io.FilenameFilter;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jboss.arquillian.core.api.Instance;
import org.jboss.arquillian.core.api.annotation.Inject;
import org.jboss.arquillian.core.api.annotation.Observes;
import org.jboss.arquillian.test.spi.event.suite.After;
import org.rhq.core.util.file.FileUtil;
import org.rhq.test.arquillian.ClearPersistedData;
import org.rhq.test.arquillian.When;
import org.rhq.test.arquillian.spi.events.PluginContainerDiscovered;
/**
* @author Lukas Krejci
*/
public class DataCleanupExecutor {
private static final String INVENTORY_DAT = "inventory.dat";
private static final Log LOG = LogFactory.getLog(DataCleanupExecutor.class);
@Inject
private Instance<RhqAgentPluginContainer> pcContainer;
public void process(@Observes PluginContainerDiscovered pcDiscovered) {
doCleanup(pcDiscovered.getTestMethod(), true);
}
public void process(@Observes After test) {
doCleanup(test.getTestMethod(), false);
}
private void doCleanup(Method testMethod, boolean isBefore) {
ClearPersistedData clearData = testMethod.getAnnotation(ClearPersistedData.class);
if (clearData != null) {
if (LOG.isDebugEnabled()) {
LOG.debug("Clean up for: " + testMethod);
}
//b a x y
//0 0 0 nogo
//0 0 1 nogo
//0 1 0 go
//0 1 1 nogo
//1 0 0 nogo
//1 0 1 go
//1 1 0 go
//1 1 1 go
EnumSet<When> when = toEnumSet(When.class, clearData.when());
boolean hasBefore = when.contains(When.BEFORE_TEST);
boolean hasAfter = when.contains(When.AFTER_TEST);
if ((!hasBefore && !hasAfter) ||
(!hasBefore && isBefore) ||
(hasBefore && !hasAfter && !isBefore)) {
if (LOG.isDebugEnabled()) {
LOG.debug("Skipping clean up. Currently " + (isBefore ? "before" : "after") + " test but scheduled to run:" + when);
}
return;
}
LOG.info("Stopping Plugin Container to clean up data");
pcContainer.get().stopPc();
File dataDir = pcContainer.get().getConfiguration().getDataDirectory();
File tmpDir = pcContainer.get().getConfiguration().getTemporaryDirectory();
FileUtil.purge(tmpDir, false);
if (LOG.isDebugEnabled()) {
LOG.debug("Purged temp dir");
}
if (clearData.ofInventory()) {
File inventoryDat = new File(dataDir, INVENTORY_DAT);
if (inventoryDat.exists()) {
inventoryDat.delete();
}
if (LOG.isDebugEnabled()) {
LOG.debug("Purged inventory dat");
}
}
if (clearData.ofDrift()) {
FileUtil.purge(new File(dataDir, "changesets"), false);
if (LOG.isDebugEnabled()) {
LOG.debug("Purged drift changesets");
}
}
List<String> plugins = Arrays.asList(clearData.ofPlugins());
if (plugins.contains(ClearPersistedData.ALL_PLUGINS)) {
removeAllDataBut(dataDir, new String[] {"inventory.dat", "changesets"});
} else {
for(String n : plugins) {
FileUtil.purge(new File(dataDir, n), true);
if (LOG.isDebugEnabled()) {
LOG.debug("Purged plugin dir: " + n);
}
}
}
LOG.info("Starting Plugin Container after data cleanup.");
pcContainer.get().startPc();
}
}
private void removeAllDataBut(File dataDir, final String[] excludedNames) {
File[] files = dataDir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
for(String n : excludedNames) {
if (name.equals(n)) {
return false;
}
}
return true;
}
});
for(File f : files) {
FileUtil.purge(f, true);
if (LOG.isDebugEnabled()) {
LOG.debug("Purged dir: " + f.getName());
}
}
}
private <T extends Enum<T>> EnumSet<T> toEnumSet(Class<T> c, T... values) {
EnumSet<T> ret = EnumSet.noneOf(c);
for(T e : values) {
ret.add(e);
}
return ret;
}
}