org.rhq.test.arquillian.impl.DataCleanupExecutor.java Source code

Java tutorial

Introduction

Here is the source code for org.rhq.test.arquillian.impl.DataCleanupExecutor.java

Source

/*
 * 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;
    }
}