Package org.jboss.seam.wiki.core.cache

Source Code of org.jboss.seam.wiki.core.cache.PageFragmentCache

/*
* JBoss, Home of Professional Open Source
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.jboss.seam.wiki.core.cache;

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
import org.jboss.seam.Component;
import org.jboss.seam.ScopeType;
import org.jboss.seam.wiki.core.plugin.PluginRegistry;
import org.jboss.seam.wiki.core.plugin.metamodel.Plugin;
import org.jboss.seam.wiki.core.plugin.metamodel.PluginModule;
import org.jboss.seam.annotations.Create;
import org.jboss.seam.annotations.intercept.BypassInterceptors;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.log.LogProvider;
import org.jboss.seam.log.Logging;

import java.util.*;

/**
* Override Seam built-in pojoCache component with EHCache implementation.
* <p>
* This component creates cache regions on startup. The regions are obtained from the
* <tt>pluginRegistry</tt> and each plugin module. If desired, individual
* </p>
*
* @author Christian Bauer
*/
@BypassInterceptors
public class PageFragmentCache {

    private static final LogProvider log = Logging.getLogProvider(PageFragmentCache.class);

    // This is threadsafe
    Map<String, Cache> caches = new HashMap<String, Cache>();

    List<String> cacheRegions;

    public List<String> getCacheRegions() {
        return cacheRegions;
    }

    public void setCacheRegions(List<String> cacheRegions) {
        this.cacheRegions = cacheRegions;
    }

    @Create
    public void startup() throws Exception {

        log.info("starting wiki page fragment cache regions");
        try {
            CacheManager manager = EHCacheManager.instance();

            Set<String> requiredCacheRegions = new HashSet<String>();

            if (cacheRegions != null) {
                requiredCacheRegions.addAll(cacheRegions);
            }

            PluginRegistry pluginRegistry = PluginRegistry.instance();
            for (Plugin plugin : pluginRegistry.getPlugins()) {
                for (PluginModule pluginModule : plugin.getModules()) {
                    if (pluginModule.getFragmentCacheRegions() != null)
                        requiredCacheRegions.addAll(pluginModule.getFragmentCacheRegions());
                }
            }

            for (String cacheRegion : requiredCacheRegions) {
                Cache cache = EHCacheManager.instance().getCache(cacheRegion);
                if (cache == null) {
                    log.info("using default configuration for region '" + cacheRegion + "'");
                    manager.addCache(cacheRegion);
                    cache = manager.getCache(cacheRegion);
                    log.debug("started EHCache region: " + cacheRegion);
                }
                caches.put(cacheRegion, cache);
            }

        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }

    public void put(String region, String key, String content) {
        if (!caches.containsKey(region))
            throw new IllegalStateException("can't put into uninitialized cache region: " + region);
        caches.get(region).put(new Element(key, content));
    }

    public String get(String region, String key) {
        if (!caches.containsKey(region))
            throw new IllegalStateException("can't get from uninitialized cache region: " + region);
        Element result = caches.get(region).get(key);
        return result != null ? (String)result.getValue() : null;
    }

    public void remove(String region, String key) {
        if (!caches.containsKey(region))
            throw new IllegalStateException("can't remove from uninitialized cache region: " + region);
        caches.get(region).remove(key);
    }

    public void removeAll(String region) {
        if (!caches.containsKey(region))
            throw new IllegalStateException("can't remove all from uninitialized cache region: " + region);
        caches.get(region).removeAll();
    }

    public static PageFragmentCache instance() {
        if (!Contexts.isApplicationContextActive()) {
            throw new IllegalStateException("No active application scope");
        }
        return (PageFragmentCache) Component.getInstance("pageFragmentCache", ScopeType.APPLICATION);
    }

}
TOP

Related Classes of org.jboss.seam.wiki.core.cache.PageFragmentCache

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.