com.enonic.cms.framework.blob.gc.GarbageCollector.java Source code

Java tutorial

Introduction

Here is the source code for com.enonic.cms.framework.blob.gc.GarbageCollector.java

Source

/*
 * Copyright 2000-2011 Enonic AS
 * http://www.enonic.com/license
 */
package com.enonic.cms.framework.blob.gc;

import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.collect.Sets;

import com.enonic.cms.framework.blob.BlobKey;
import com.enonic.cms.framework.blob.BlobStore;

public final class GarbageCollector {
    private final static Logger LOG = LoggerFactory.getLogger(GarbageCollector.class);

    private BlobStore store;

    private UsedBlobKeyFinder finder;

    private boolean running;

    public void setStore(final BlobStore store) {
        this.store = store;
    }

    public void setFinder(final UsedBlobKeyFinder finder) {
        this.finder = finder;
    }

    private int deleteUnused() throws Exception {
        final Set<BlobKey> keys = Sets.newHashSet(this.store.getAllKeys());
        keys.removeAll(this.finder.findKeys());

        for (final BlobKey key : keys) {
            this.store.deleteRecord(key);
        }

        return keys.size();
    }

    public void process() {
        if (this.running) {
            return;
        }

        this.running = true;

        try {
            doProcess();
        } catch (Exception e) {
            LOG.error("Failed to run blob store garbage collect", e);
        } finally {
            this.running = false;
        }
    }

    private synchronized void doProcess() throws Exception {
        final long now = System.currentTimeMillis();
        LOG.debug("Starting blob store garbage collect");

        final int deleted = deleteUnused();
        LOG.debug("Deleted " + deleted + " blob(s) that was not in use");

        final long totalTime = System.currentTimeMillis() - now;
        LOG.info("Garbage collected " + deleted + " blob(s) in " + totalTime + " ms");
    }
}