Package org.springmodules.cache.provider.tangosol

Source Code of org.springmodules.cache.provider.tangosol.CoherenceFacade

/*
* Creted on Jan 25, 2006
*
* 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.
*
* Copyright @2007 the original author or authors.
*/
package org.springmodules.cache.provider.tangosol;

import com.tangosol.net.NamedCache;
import org.springframework.beans.propertyeditors.StringArrayPropertyEditor;
import org.springframework.util.ClassUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.util.ReflectionUtils;
import org.springmodules.cache.CacheException;
import org.springmodules.cache.CachingModel;
import org.springmodules.cache.FatalCacheException;
import org.springmodules.cache.FlushingModel;
import org.springmodules.cache.provider.AbstractCacheProviderFacade;
import org.springmodules.cache.provider.CacheModelValidator;
import org.springmodules.cache.provider.ReflectionCacheModelEditor;

import java.beans.PropertyEditor;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
* Implementation of
* <code>{@link org.springmodules.cache.provider.CacheProviderFacade}</code>
* that uses Tangosol Coherence as the underlying cache implementation.
*
* @author Omar Irbouh
* @author Alex Ruiz
*/
public class CoherenceFacade extends AbstractCacheProviderFacade {

  private static final String CACHE_FACTORY_CLASS_NAME = "com.tangosol.net.CacheFactory";

  private static final String GET_CACHE_METHOD_NAME = "getCache";

  private final Method getCacheMethod;

  private CacheModelValidator cacheModelValidator;

  /**
   * Constructor.
   */
  public CoherenceFacade() {
    try {
      Class clazz = ClassUtils.forName(CACHE_FACTORY_CLASS_NAME);
      this.getCacheMethod = ReflectionUtils.findMethod(clazz, GET_CACHE_METHOD_NAME, new Class[]{String.class});
    } catch (Exception ex) {
      throw new IllegalStateException(
          "Could not initialize CoherenceFacade because Tangosol API classes are not available: " + ex);
    }

    this.cacheModelValidator = new CoherenceModelValidator();
  }

  /**
   * @see org.springmodules.cache.provider.CacheProviderFacade#modelValidator()
   */
  public CacheModelValidator modelValidator() {
    return this.cacheModelValidator;
  }

  /**
   * @see org.springmodules.cache.provider.CacheProviderFacade#getCachingModelEditor()
   */
  public PropertyEditor getCachingModelEditor() {
    ReflectionCacheModelEditor editor = new ReflectionCacheModelEditor();
    editor.setCacheModelClass(CoherenceCachingModel.class);
    return editor;
  }

  /**
   * @see org.springmodules.cache.provider.CacheProviderFacade#getFlushingModelEditor()
   */
  public PropertyEditor getFlushingModelEditor() {
    Map propertyEditors = new HashMap();
    propertyEditors.put("cacheNames", new StringArrayPropertyEditor());

    ReflectionCacheModelEditor editor = new ReflectionCacheModelEditor();
    editor.setCacheModelClass(CoherenceFlushingModel.class);
    editor.setCacheModelPropertyEditors(propertyEditors);
    return editor;
  }

  /**
   * @see AbstractCacheProviderFacade#isSerializableCacheElementRequired()
   */
  protected boolean isSerializableCacheElementRequired() {
    return false;
  }

  /**
   * @see AbstractCacheProviderFacade#onFlushCache(FlushingModel)
   */
  protected void onFlushCache(FlushingModel model) throws CacheException {
    CoherenceFlushingModel coherenceFlushingModel = (CoherenceFlushingModel) model;
    String[] cacheNames = coherenceFlushingModel.getCacheNames();
    if (!ObjectUtils.isEmpty(cacheNames)) {
      int count = cacheNames.length;
      for (int i = 0; i < count; i++) {
        getCache(cacheNames[0]).clear();
      }
    }
  }

  /**
   * @see AbstractCacheProviderFacade#onGetFromCache(Serializable,CachingModel)
   */
  protected Object onGetFromCache(Serializable key, CachingModel model)
      throws CacheException {
    NamedCache cache = getCache(model);
    return cache.get(key);
  }

  /**
   * @see AbstractCacheProviderFacade#onPutInCache(Serializable,CachingModel,
   *Object)
   */
  protected void onPutInCache(Serializable key, CachingModel model, Object obj)
      throws CacheException {
    CoherenceCachingModel coherenceCachingModel = (CoherenceCachingModel) model;
    String name = coherenceCachingModel.getCacheName();
    NamedCache cache = getCache(name);

    Long timeToLive = coherenceCachingModel.getTimeToLive();
    if (timeToLive != null) {
      cache.put(key, obj, timeToLive.longValue());
    } else {
      cache.put(key, obj);
    }
  }

  /**
   * @see AbstractCacheProviderFacade#onRemoveFromCache(Serializable,
   *CachingModel)
   */
  protected void onRemoveFromCache(Serializable key, CachingModel model)
      throws CacheException {
    NamedCache cache = getCache(model);
    cache.remove(key);
  }

  /**
   * @see AbstractCacheProviderFacade#validateCacheManager()
   */
  protected void validateCacheManager() throws FatalCacheException {
    // No implementation.
  }

  /**
   * Returns a Coherence cache from the cache manager.
   *
   * @param model the caching model containing the name of the cache to retrieve
   * @return the cache retrieved from the cache manager
   */
  private NamedCache getCache(CachingModel model) {
    CoherenceCachingModel coherenceCachingModel = (CoherenceCachingModel) model;
    String name = coherenceCachingModel.getCacheName();
    return getCache(name);
  }

  /**
   * Returns a Coherence cache from the cache manager.
   *
   * @param name the name of the cache to retrieve
   * @return the cache retrieved from the cache manager
   */
  private NamedCache getCache(String name) {
    return (NamedCache) ReflectionUtils.invokeMethod(getCacheMethod, null, new String[]{name});
  }

}
TOP

Related Classes of org.springmodules.cache.provider.tangosol.CoherenceFacade

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.