/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.test.cluster.web;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import javax.management.ObjectName;
import org.jboss.cache.Cache;
import org.jboss.cache.CacheManager;
import org.jboss.cache.CacheStatus;
import org.jboss.cache.Fqn;
import org.jboss.cache.Node;
import org.jboss.cache.buddyreplication.BuddyManager;
import org.jboss.ha.framework.server.CacheManagerLocator;
import org.jboss.ha.framework.server.PojoCacheManager;
import org.jboss.ha.framework.server.PojoCacheManagerLocator;
import org.jboss.mx.util.ObjectNameFactory;
import org.jboss.system.ServiceMBeanSupport;
/**
* Helper class to locate and invoke methods on the cache mbeans used by JBossWeb.
*
* TODO. Update the DistributedCacheManager SPI to provide the data we use
* here and use a factory to create the SPI impl rather than directly accessing
* the cache.
*
* @author Ben Wang Date: Aug 16, 2005
* @author Brian Stansberry
*
* @version $Id: CacheHelper.java 87304 2009-04-14 18:26:35Z bstansberry@jboss.com $
*/
public class CacheHelper
extends ServiceMBeanSupport
implements CacheHelperMBean
{
public static final String CACHE_CONFIG_PROP = "jbosstest.cluster.web.cache.config";
public static final String CACHE_TYPE_PROP = "jbosstest.cluster.web.cache.pojo";
public static final ObjectName OBJECT_NAME =
ObjectNameFactory.create("jboss.test:service=WebTestCacheHelper");
public static final Integer VERSION_KEY = new Integer(0);
private String cacheConfigName;
private Cache cache;
private boolean usePojoCache;
public CacheHelper()
{
}
public static Cache getCacheInstance(String cacheConfig, boolean usePojoCache)
{
try
{
if (usePojoCache)
{
PojoCacheManager cm = PojoCacheManagerLocator.getCacheManagerLocator().getCacheManager(null);
return cm.getPojoCache(cacheConfig, true).getCache();
}
else
{
CacheManager cm = CacheManagerLocator.getCacheManagerLocator().getCacheManager(null);
return cm.getCache(cacheConfig, true);
}
}
catch (RuntimeException re)
{
throw re;
}
catch (Exception e)
{
throw new RuntimeException("getCacheInstance: Exception: " +e);
}
}
public void setCacheConfigName(String cacheConfigName, boolean usePojoCache)
{
if (this.cacheConfigName == null || !this.cacheConfigName.equals(cacheConfigName))
releaseCache();
this.cacheConfigName = cacheConfigName;
this.usePojoCache = usePojoCache;
getCache();
}
public Object getSessionVersion(String sessionFqn)
{
return getCache().get(Fqn.fromString(sessionFqn), VERSION_KEY);
}
public Object getBuddySessionVersion(String sessionFqn) throws Exception
{
Object result = null;
Fqn fqn = Fqn.fromString(sessionFqn);
Set buddies = getBuddyBackupRoots();
for (Iterator iter = buddies.iterator(); iter.hasNext();)
{
Node buddy = (Node) iter.next();
Node session = buddy.getChild(fqn);
if (session != null)
{
result = (Integer) session.get(VERSION_KEY);
break;
}
}
return result;
}
public Set getSessionIds(String warFqn) throws Exception
{
return getSessionIds(warFqn, true);
}
public Set getSessionIds(String warFqn, boolean includeBuddies) throws Exception
{
Set result = new HashSet();
Fqn fqn = Fqn.fromString(warFqn);
Node main = getCache().getRoot().getChild(fqn);
if (main != null)
{
result.addAll(main.getChildrenNames());
}
if (includeBuddies)
{
// Check in the buddy backup tree
Set buddies = getBuddyBackupRoots();
for (Iterator iter = buddies.iterator(); iter.hasNext();)
{
Node buddy = (Node) iter.next();
Node warRoot = buddy.getChild(fqn);
if (warRoot != null)
{
result.addAll(warRoot.getChildrenNames());
}
}
}
return result;
}
public Set getSSOIds() throws Exception
{
Set result = new HashSet();
Fqn fqn = Fqn.fromString("/SSO");
Node main = getCache().getRoot().getChild(fqn);
if (main != null)
{
result.addAll(main.getChildrenNames());
}
// Check in the buddy backup tree
Set buddies = getBuddyBackupRoots();
for (Iterator iter = buddies.iterator(); iter.hasNext();)
{
Node buddy = (Node) iter.next();
Node ssoRoot = buddy.getChild(fqn);
if (ssoRoot != null)
{
result.addAll(ssoRoot.getChildrenNames());
}
}
return result;
}
public boolean getCacheHasSSO(String ssoId) throws Exception
{
Fqn fqn = Fqn.fromString("/SSO/" + ssoId);
Node main = getCache().getRoot().getChild(fqn);
if (main != null)
return true;
// Check in the buddy backup tree
Set buddies = getBuddyBackupRoots();
for (Iterator iter = buddies.iterator(); iter.hasNext();)
{
Node buddy = (Node) iter.next();
Node ssoRoot = buddy.getChild(fqn);
if (ssoRoot != null)
{
return true;
}
}
return false;
}
public void startService() throws Exception
{
super.startService();
cacheConfigName = System.getProperty(CACHE_CONFIG_PROP);
String pojo = System.getProperty(CACHE_TYPE_PROP, "false");
usePojoCache = Boolean.parseBoolean(pojo);
getLog().debug("cacheConfigName=" + cacheConfigName +
" and usePojoCache=" + usePojoCache);
// Force a gc to try to clear weak refs that screw up pojocache tests
if (usePojoCache)
System.gc();
}
public void stopService() throws Exception
{
super.stopService();
releaseCache();
}
private void releaseCache()
{
if (cache != null && cacheConfigName != null)
{
if (usePojoCache)
{
PojoCacheManager cm = PojoCacheManagerLocator.getCacheManagerLocator().getCacheManager(null);
cm.releaseCache(cacheConfigName);
}
else
{
CacheManager cm = CacheManagerLocator.getCacheManagerLocator().getCacheManager(null);
cm.releaseCache(cacheConfigName);
}
cache = null;
}
}
private Set getBuddyBackupRoots()
{
Set buddies = null;
Node buddyRoot = getCache().getRoot().getChild(BuddyManager.BUDDY_BACKUP_SUBTREE_FQN);
if (buddyRoot != null)
{
buddies = buddyRoot.getChildren();
}
else
{
buddies = Collections.EMPTY_SET;
}
return buddies;
}
private Cache getCache()
{
if (cache == null)
{
getLog().debug("Getting cache: cacheConfigName=" + cacheConfigName +
" and usePojoCache=" + usePojoCache);
cache = getCacheInstance(cacheConfigName, usePojoCache);
if (cache.getCacheStatus() != CacheStatus.STARTED)
cache.start();
}
return cache;
}
}