All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.wisdom.cache.ehcache.EhCacheService Maven / Gradle / Ivy

/*
 * #%L
 * Wisdom-Framework
 * %%
 * Copyright (C) 2013 - 2014 Wisdom Framework
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * #L%
 */
package org.wisdom.cache.ehcache;

import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
import org.apache.felix.ipojo.annotations.*;
import org.joda.time.Duration;
import org.wisdom.api.cache.Cache;
import org.wisdom.api.configuration.ApplicationConfiguration;

import java.io.File;
import java.net.URL;

/**
 * An implementation of the cache service based on EhCache.
 */
@Component(immediate = true)
@Provides
@Instantiate
public class EhCacheService implements Cache {

    private static final String WISDOM_KEY = "wisdom";

    /**
     * The custom configuration path.
     * To customize the ehcache configuration, creates the 'ehcache.xml' file in the 'conf' directory of the Wisdom
     * server, or in the 'src/main/configuration' directory of your project.
     */
    public static final String CUSTOM_CONFIGURATION = "conf/ehcache.xml";

    /**
     * The path to the internal configuration.
     */
    public static final String INTERNAL_CONFIGURATION = "org/wisdom/cache/ehcache/ehcache-default.xml";

    private net.sf.ehcache.Cache cache;
    private CacheManager manager;

    @Requires ApplicationConfiguration configuration;

    /**
     * Creates the EhCache-based implementation of the Cache Service.
     */
    @Validate
    public void start() {
        File config = new File(configuration.getBaseDir(), CUSTOM_CONFIGURATION);
        final ClassLoader original = Thread.currentThread().getContextClassLoader();
        try {
            Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
            if (config.isFile()) {
                manager = CacheManager.create(config.getAbsolutePath());
            } else {
                URL url = EhCacheService.class.getClassLoader().getResource(INTERNAL_CONFIGURATION);
                if (url != null) {
                    manager = CacheManager.create(url);
                } else {
                    throw new ExceptionInInitializerError("Cannot instantiate EhCache, " +
                            "cannot load " + INTERNAL_CONFIGURATION + " file");
                }
            }
            manager.addCache(WISDOM_KEY);
            cache = manager.getCache(WISDOM_KEY);
        } finally {
            Thread.currentThread().setContextClassLoader(original);
        }
    }


    /**
     * Cleans up everything.
     */
    @Invalidate
    public void stop() {
        manager.removeCache(WISDOM_KEY);
    }

    /**
     * Adds an entry in the cache.
     *
     * @param key        Item key.
     * @param value      Item value.
     * @param expiration Expiration time in seconds (0 second means eternity).
     */
    @Override
    public void set(String key, Object value, int expiration) {
        Element element = new Element(key, value);
        if (expiration == 0) {
            element.setEternal(true);
        }
        element.setTimeToLive(expiration);
        cache.put(element);
    }

    /**
     * Adds an entry in the cache.
     *
     * @param key        Item key.
     * @param value      Item value.
     * @param expiration Expiration time.
     */
    @Override
    public void set(String key, Object value, Duration expiration) {
        Element element = new Element(key, value);
        if (expiration == null) {
            element.setEternal(true);
        } else {
            element.setTimeToLive((int) expiration.getStandardSeconds());
        }
        cache.put(element);
    }

    /**
     * Gets an entry from the cache.
     *
     * @param key Item key.
     * @return the stored object, {@literal null} if none of expired.
     */
    @Override
    public Object get(String key) {
        Element element = cache.get(key);
        if (element != null) {
            return element.getObjectValue();
        }
        return null;
    }

    /**
     * Removes an object from the cache.
     *
     * @param key Item key
     * @return {@literal true} if the object was removed, {@literal false} otherwise.
     */
    @Override
    public boolean remove(String key) {
        return cache.remove(key);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy