/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU General Public License, version 2 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/gpl-2.0.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*
* Copyright 2006 - 2013 Pentaho Corporation. All rights reserved.
*/
package org.pentaho.platform.engine.core.system;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.pentaho.platform.api.engine.ICacheManager;
import org.pentaho.platform.api.engine.IPentahoSession;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
/**
*
*
* @author rmansoor
*
*/
public class SimpleMapCacheManager implements ICacheManager {
protected static final Log logger = LogFactory.getLog( SimpleMapCacheManager.class );
private final Map simpleMap;
private static SimpleMapCacheManager _instance = new SimpleMapCacheManager();
public static SimpleMapCacheManager getInstance() {
return ( _instance );
}
public SimpleMapCacheManager() {
simpleMap = Collections.synchronizedMap( new HashMap() );
PentahoSystem.addLogoutListener( this );
} // ctor
public void cacheStop() {
}
public boolean cacheEnabled( String region ) {
return true;
}
public void onLogout( final IPentahoSession session ) {
removeRegionCache( session.getName() );
}
public boolean addCacheRegion( String region, Properties cacheProperties ) {
return true;
}
public boolean addCacheRegion( String region ) {
return true;
}
public void clearRegionCache( String region ) {
removeFromMap( region );
}
public void removeRegionCache( String region ) {
removeFromMap( region );
}
public void putInRegionCache( String region, Object key, Object value ) {
simpleMap.put( getCorrectedKey( region, key ), value );
}
public Object getFromRegionCache( String region, Object key ) {
return simpleMap.get( getCorrectedKey( region, key ) );
}
public Set getAllEntriesFromRegionCache( String region ) {
if ( simpleMap != null ) {
return simpleMap.entrySet();
} else {
return null;
}
}
public Set getAllKeysFromRegionCache( String region ) {
if ( simpleMap != null ) {
return simpleMap.keySet();
} else {
return null;
}
}
public List getAllValuesFromRegionCache( String region ) {
return getFromMap( region );
}
public void removeFromRegionCache( String region, Object key ) {
simpleMap.remove( getCorrectedKey( region, key ) );
}
public boolean cacheEnabled() {
return true;
}
public void clearCache() {
simpleMap.clear();
}
public Object getFromGlobalCache( Object key ) {
return getFromRegionCache( GLOBAL, key );
}
public Object getFromSessionCache( IPentahoSession session, String key ) {
return getFromRegionCache( SESSION, getCorrectedKey( session, key ) );
}
public void killSessionCache( IPentahoSession session ) {
removeFromMap( session.getId() );
}
public void killSessionCaches() {
removeRegionCache( SESSION );
}
public void putInGlobalCache( Object key, Object value ) {
putInRegionCache( GLOBAL, key, value );
}
public void putInSessionCache( IPentahoSession session, String key, Object value ) {
putInRegionCache( SESSION, getCorrectedKey( session, key ), value );
}
public void removeFromGlobalCache( Object key ) {
removeFromRegionCache( GLOBAL, key );
}
public void removeFromSessionCache( IPentahoSession session, String key ) {
removeFromRegionCache( SESSION, getCorrectedKey( session, key ) );
}
private String getCorrectedKey( final IPentahoSession session, final String key ) {
String sessionId = session.getId();
String newKey = null;
if ( sessionId != null ) {
newKey = sessionId + "\t" + key; //$NON-NLS-1$
}
return newKey;
}
private String getCorrectedKey( final String region, final Object key ) {
return region + "\t" + key; //$NON-NLS-1$
}
private List getFromMap( String id ) {
List list = new ArrayList();
if ( simpleMap != null ) {
String keyId = id + "\t";
Iterator it = simpleMap.entrySet().iterator();
while ( it.hasNext() ) {
Map.Entry entry = (Map.Entry) it.next();
String key = ( entry.getKey() != null ) ? entry.getKey().toString() : ""; //$NON-NLS-1$
if ( key.startsWith( keyId ) ) {
list.add( entry.getValue() );
}
}
}
return list;
}
private void removeFromMap( String id ) {
if ( simpleMap != null ) {
Iterator it = simpleMap.entrySet().iterator();
String keyId = id + "\t";
while ( it.hasNext() ) {
Map.Entry entry = (Map.Entry) it.next();
String key = entry.getKey() != null ? (String) entry.getKey() : ""; //$NON-NLS-1$
if ( key.startsWith( keyId ) ) {
it.remove();
}
}
}
}
@Override
public long getElementCountInRegionCache( String region ) {
long cnt = 0;
String regionKey = region + "\t";
Iterator it = simpleMap.entrySet().iterator();
while ( it.hasNext() ) {
Map.Entry entry = (Map.Entry) it.next();
String key = entry.getKey() != null ? (String) entry.getKey() : ""; //$NON-NLS-1$
if ( key.startsWith( regionKey ) ) {
cnt++;
}
}
return cnt;
}
@Override
public long getElementCountInSessionCache() {
return getElementCountInRegionCache( SESSION );
}
@Override
public long getElementCountInGlobalCache() {
return getElementCountInRegionCache( GLOBAL );
}
}