@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
/ *
* Copyright 2002 - 2011 the original author or authors .
* Copyright 2002 - 2013 the original author or authors .
*
* Licensed under the Apache License , Version 2 . 0 ( the "License" ) ;
* you may not use this file except in compliance with the License .
@ -18,9 +18,12 @@ package org.springframework.cache.ehcache;
@@ -18,9 +18,12 @@ package org.springframework.cache.ehcache;
import java.io.IOException ;
import java.io.InputStream ;
import java.lang.reflect.Method ;
import net.sf.ehcache.CacheException ;
import net.sf.ehcache.CacheManager ;
import net.sf.ehcache.config.Configuration ;
import net.sf.ehcache.config.ConfigurationFactory ;
import org.apache.commons.logging.Log ;
import org.apache.commons.logging.LogFactory ;
@ -28,6 +31,8 @@ import org.springframework.beans.factory.DisposableBean;
@@ -28,6 +31,8 @@ import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.FactoryBean ;
import org.springframework.beans.factory.InitializingBean ;
import org.springframework.core.io.Resource ;
import org.springframework.util.ClassUtils ;
import org.springframework.util.ReflectionUtils ;
/ * *
* { @link FactoryBean } that exposes an EHCache { @link net . sf . ehcache . CacheManager }
@ -54,6 +59,10 @@ import org.springframework.core.io.Resource;
@@ -54,6 +59,10 @@ import org.springframework.core.io.Resource;
* /
public class EhCacheManagerFactoryBean implements FactoryBean < CacheManager > , InitializingBean , DisposableBean {
// Check whether EHCache 2.1+ CacheManager.create(Configuration) method is available...
private static final Method createWithConfiguration =
ClassUtils . getMethodIfAvailable ( CacheManager . class , "create" , Configuration . class ) ;
protected final Log logger = LogFactory . getLog ( getClass ( ) ) ;
private Resource configLocation ;
@ -98,20 +107,41 @@ public class EhCacheManagerFactoryBean implements FactoryBean<CacheManager>, Ini
@@ -98,20 +107,41 @@ public class EhCacheManagerFactoryBean implements FactoryBean<CacheManager>, Ini
public void afterPropertiesSet ( ) throws IOException , CacheException {
logger . info ( "Initializing EHCache CacheManager" ) ;
if ( this . configLocation ! = null ) {
InputStream is = this . configLocation . getInputStream ( ) ;
try {
this . cacheManager = ( this . shared ? CacheManager . create ( is ) : new CacheManager ( is ) ) ;
InputStream is = ( this . configLocation ! = null ? this . configLocation . getInputStream ( ) : null ) ;
try {
// A bit convoluted for EHCache 1.x/2.0 compatibility.
// To be much simpler once we require EHCache 2.1+
if ( this . cacheManagerName ! = null ) {
if ( this . shared & & createWithConfiguration = = null ) {
// No CacheManager.create(Configuration) method available before EHCache 2.1;
// can only set CacheManager name after creation.
this . cacheManager = ( is ! = null ? CacheManager . create ( is ) : CacheManager . create ( ) ) ;
this . cacheManager . setName ( this . cacheManagerName ) ;
}
else {
Configuration configuration = ( is ! = null ? ConfigurationFactory . parseConfiguration ( is ) :
ConfigurationFactory . parseConfiguration ( ) ) ;
configuration . setName ( this . cacheManagerName ) ;
if ( this . shared ) {
this . cacheManager = ( CacheManager ) ReflectionUtils . invokeMethod ( createWithConfiguration , null , configuration ) ;
}
else {
this . cacheManager = new CacheManager ( configuration ) ;
}
}
}
finally {
is . close ( ) ;
// For strict backwards compatibility: use simplest possible constructors...
else if ( this . shared ) {
this . cacheManager = ( is ! = null ? CacheManager . create ( is ) : CacheManager . create ( ) ) ;
}
else {
this . cacheManager = ( is ! = null ? new CacheManager ( is ) : new CacheManager ( ) ) ;
}
}
else {
this . cacheManager = ( this . shared ? CacheManager . create ( ) : new CacheManager ( ) ) ;
}
if ( this . cacheManagerName ! = null ) {
this . cacheManager . setName ( this . cacheManagerName ) ;
finally {
if ( is ! = null ) {
is . close ( ) ;
}
}
}