You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@roller.apache.org by sn...@apache.org on 2005/10/21 23:46:28 UTC

svn commit: r327589 [20/72] - in /incubator/roller/branches/roller_1.x: ./ contrib/ contrib/lib/ contrib/plugins/ contrib/plugins/src/ contrib/plugins/src/org/ contrib/plugins/src/org/roller/ contrib/plugins/src/org/roller/presentation/ contrib/plugins...

Added: incubator/roller/branches/roller_1.x/src/org/roller/business/hibernate/HibernateRefererManagerImpl.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_1.x/src/org/roller/business/hibernate/HibernateRefererManagerImpl.java?rev=327589&view=auto
==============================================================================
--- incubator/roller/branches/roller_1.x/src/org/roller/business/hibernate/HibernateRefererManagerImpl.java (added)
+++ incubator/roller/branches/roller_1.x/src/org/roller/business/hibernate/HibernateRefererManagerImpl.java Fri Oct 21 14:27:36 2005
@@ -0,0 +1,594 @@
+/*
+ * Created on Feb 23, 2003
+ */
+package org.roller.business.hibernate;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+
+import net.sf.hibernate.Criteria;
+import net.sf.hibernate.Hibernate;
+import net.sf.hibernate.HibernateException;
+import net.sf.hibernate.Session;
+import net.sf.hibernate.expression.Expression;
+import net.sf.hibernate.expression.Junction;
+import net.sf.hibernate.expression.Order;
+import net.sf.hibernate.type.Type;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.roller.RollerException;
+import org.roller.business.PersistenceStrategy;
+import org.roller.business.RefererManagerImpl;
+import org.roller.config.RollerRuntimeConfig;
+import org.roller.model.RefererManager;
+import org.roller.pojos.RefererData;
+import org.roller.pojos.WebsiteData;
+import org.roller.pojos.WebsiteDisplayData;
+
+
+/**
+ * Hibernate queries.
+ * @author David M Johnson
+ */
+public class HibernateRefererManagerImpl extends RefererManagerImpl
+    implements RefererManager
+{
+    static final long serialVersionUID = -4966091850482256435L;
+    
+    private static Log mLogger =
+         LogFactory.getFactory().getInstance(HibernateRefererManagerImpl.class);
+
+    //-------------------------------------------------- Startup and Shutdown
+    public HibernateRefererManagerImpl(PersistenceStrategy support)
+        throws RollerException
+	{
+        super();
+		mStrategy = (HibernateStrategy)support;
+                mLogger.debug("Instantiating Referer Manager");
+	}
+
+    //-----------------------------------------------------------------------
+    /**
+     * Apply ignoreWord/spam filters to all referers in system.
+     */
+    public void applyRefererFilters() throws RollerException
+    {
+        try
+        {
+            Session session = ((HibernateStrategy)mStrategy).getSession();
+            Criteria criteria = session.createCriteria(RefererData.class);
+            
+            String spamwords = RollerRuntimeConfig.getProperty("spam.referers.ignorewords");
+            
+            String[] ignoreWords = StringUtils.split(
+                StringUtils.deleteWhitespace(spamwords),",");
+            Junction or = Expression.disjunction();          
+            for (int i=0; i<ignoreWords.length; i++) 
+            {
+                String ignoreWord = ignoreWords[i].trim();
+                or.add(Expression.ilike("refererUrl","%"+ignoreWord+"%"));
+            }
+            criteria.add(Expression.conjunction()
+                .add(Expression.isNull("excerpt"))
+                .add(or)
+            );
+            
+            Iterator referers = criteria.list().iterator();
+            while (referers.hasNext())
+            {
+                removeReferer( ((RefererData)referers.next()).getId() );
+            }
+        }
+        catch (HibernateException e)
+        {
+            throw new RollerException(e);
+        }
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Apply ignoreWord/spam filters to all referers in website.
+     */
+    public void applyRefererFilters(WebsiteData website) throws RollerException
+    {
+        if (null == website) throw new RollerException("website is null");
+        if (null == website.getIgnoreWords()) return;
+
+        try
+        {
+            Session session = ((HibernateStrategy)mStrategy).getSession();
+            Criteria criteria = session.createCriteria(RefererData.class);
+            
+            String[] ignoreWords = StringUtils.split(
+                StringUtils.deleteWhitespace(website.getIgnoreWords()),",");
+            if (ignoreWords.length == 0) return;
+            
+            Junction or = Expression.disjunction();          
+            for (int i=0; i<ignoreWords.length; i++) 
+            {
+                String ignoreWord = ignoreWords[i].trim();
+                or.add(Expression.ilike("refererUrl","%"+ignoreWord+"%"));
+            }
+            criteria.add(Expression.conjunction()
+                .add(Expression.isNull("excerpt"))
+                .add(Expression.eq("website",website))
+                .add(or)
+            );
+            
+            Iterator referers = criteria.list().iterator();
+            while (referers.hasNext())
+            {
+                removeReferer( ((RefererData)referers.next()).getId() );
+            }
+        }
+        catch (HibernateException e)
+        {
+            throw new RollerException(e);
+        }
+    }
+
+    //-----------------------------------------------------------------------
+
+    /** 
+     * Use Hibernate directly because Roller's Query API does too much allocation.
+     */
+    protected List getExistingReferers(WebsiteData website, String dateString,
+                    String permalink) throws RollerException
+    {
+        Session session = ((HibernateStrategy)mStrategy).getSession();
+        Criteria criteria = session.createCriteria(RefererData.class);
+        criteria.add(Expression.conjunction()
+                        .add(Expression.eq("website",website))
+                        .add(Expression.eq("dateString",dateString))
+                        .add(Expression.eq("refererPermalink",permalink)));
+        try
+        {
+            return criteria.list();
+        }
+        catch (HibernateException e)
+        {
+            throw new RollerException(e);
+        }
+    }
+    
+    //-----------------------------------------------------------------------
+
+    /** 
+     * Use Hibernate directly because Roller's Query API does too much allocation.
+     */
+    protected List getMatchingReferers(WebsiteData website, String requestUrl,
+                    String refererUrl) throws RollerException
+    {
+        Session session = ((HibernateStrategy)mStrategy).getSession();
+        Criteria criteria = session.createCriteria(RefererData.class);
+        criteria.add(Expression.conjunction()
+                        .add(Expression.eq("website",website))
+                        .add(Expression.eq("requestUrl",requestUrl))
+                        .add(Expression.eq("refererUrl",refererUrl)));
+        try
+        {
+            return criteria.list();
+        }
+        catch (HibernateException e)
+        {
+            throw new RollerException(e);
+        }
+    }
+    
+    //-----------------------------------------------------------------------
+
+    /**
+     * Use raw SQL because Hibernate can't handle sorting by sum.
+     */
+    public List getDaysPopularWebsites(int max) throws RollerException
+    {
+        // TODO Hibernate version of getDaysPopularWebsites
+        // TODO Move to full use of mSupport
+        String msg = "Getting popular websites";
+        Session ses = null; // the session will eventually be release by RequestFilter
+        Connection con = null;
+        try
+        {
+            List list = new ArrayList();
+
+            ses = ((HibernateStrategy)mStrategy).getSession();
+            con = ses.connection();
+
+            final PreparedStatement stmt;
+            if (con.getMetaData().getDriverName().startsWith("HSQL"))
+            {
+            		// special handling for HSQLDB
+                stmt = con.prepareStatement(
+                        "select top ? u.username,w.name,w.name,sum(r.dayhits) as s "+
+                        "from rolleruser as u, website as w, referer as r "+
+                        "where r.websiteid=w.id and w.userid=u.id and w.isenabled=? " +
+                        "group by u.username,w.name,w.id order by s desc");
+                stmt.setInt(1, max);
+                stmt.setBoolean(2, true);
+            }
+            else 
+            {
+               stmt = con.prepareStatement(
+                    "select u.username,w.name,w.name,sum(r.dayhits) as s "+
+                    "from rolleruser as u, website as w, referer as r "+
+                    "where r.websiteid=w.id and w.userid=u.id and w.isenabled= ? " +
+                    // Ben Walding (a Postgres SQL user): Basically, you have
+                    // to have all non-aggregated columns that exist in your
+                    // 'SELECT' section, in the 'GROUP BY' section as well:
+                    "group by u.username,w.name,w.id order by s desc limit ?");
+                    // and not this: "group by w.id order by s desc");
+                stmt.setBoolean(1, true);
+                stmt.setInt(2, max);
+            }
+            ResultSet rs = stmt.executeQuery();
+            if ( rs.next() )
+            {
+                do
+                {
+                    String userName = rs.getString(1);
+                    String name = rs.getString(2);
+                    String websiteName = rs.getString(3);
+                    Integer hits = new Integer(rs.getInt(4));
+                    list.add(new WebsiteDisplayData(
+                       name, 
+                       userName, 
+                       websiteName, 
+                       hits));
+                }
+                while ( rs.next() );
+            }
+            return list;
+        }
+        catch (Throwable pe)
+        {
+            mLogger.error(msg, pe);
+            throw new RollerException(msg, pe);
+        }
+        
+// Don't close connection, Hibernate is holding it
+//        finally 
+//        {
+//            try 
+//            {
+//                if (con != null) con.close();
+//            }
+//            catch (Throwable t)
+//            {
+//                mLogger.error("Closing connection",t);
+//            }
+//        }
+        
+    }
+    
+    //-----------------------------------------------------------------------
+
+    /**
+     * Use raw SQL because Hibernate can't handle the query.
+     */
+    protected int getHits(WebsiteData website, String type)
+        throws RollerException
+    {
+        int hits = 0;
+        if (mLogger.isDebugEnabled())
+        {
+            mLogger.debug("getHits: " + website.getName());
+        }
+
+        //Question: why not use website.id instead to reduce joins?
+        Object[] args = { Boolean.TRUE, website.getUser().getUserName() };
+        Type[] types = { Hibernate.BOOLEAN, Hibernate.STRING };
+
+        // For a query like this, Hibernate returns a list of lists
+        Session session = ((HibernateStrategy)mStrategy).getSession();
+        List results;
+        try
+        {
+            results = session.find(
+               "select sum(h.dayHits),sum(h.totalHits) from h in class " +
+               "org.roller.pojos.RefererData " +
+               "where h.website.isEnabled=? and h.website.user.userName=? ",
+               args, types);
+        }
+        catch (HibernateException e)
+        {
+            throw new RollerException(e);
+        }
+        Object[] resultsArray = (Object[]) results.get(0);
+
+        if (resultsArray.length > 0 && type.equals(DAYHITS))
+        {
+            if ( resultsArray[0] != null )
+            {
+                hits = ((Integer) resultsArray[0]).intValue();
+            }
+        }
+        else if ( resultsArray.length > 0 )
+        {
+            if ( resultsArray[0] != null )
+            {
+                hits = ((Integer) resultsArray[1]).intValue();
+            }
+        }
+        else
+        {
+            hits = 0;
+        }
+
+        return hits;
+    }
+    
+    /**
+     * @see org.roller.pojos.RefererManager#getReferers(java.lang.String)
+     */
+    public List getReferers(WebsiteData website) throws RollerException
+    {
+        if (website==null )
+            throw new RollerException("website is null");
+
+        Session session = ((HibernateStrategy)mStrategy).getSession();
+        Criteria criteria = session.createCriteria(RefererData.class);
+        criteria.add(Expression.eq("website",website));
+        criteria.addOrder(Order.desc("totalHits"));
+        try
+        {
+            return criteria.list();
+        }
+        catch (HibernateException e)
+        {
+            throw new RollerException(e);
+        }
+    }
+
+    //-----------------------------------------------------------------------
+
+    /**
+     * @see org.roller.pojos.RefererManager#getTodaysReferers(String)
+     */
+    public List getTodaysReferers(WebsiteData website)
+        throws RollerException
+    {
+        if (website==null )
+            throw new RollerException("website is null");
+
+        Session session = ((HibernateStrategy)mStrategy).getSession();
+        Criteria criteria = session.createCriteria(RefererData.class);
+        criteria.add(Expression.eq("website", website));
+        criteria.add(Expression.gt("dayHits", new Integer(0)));
+        criteria.addOrder(Order.desc("dayHits"));
+        try
+        {
+            return criteria.list();
+        }
+        catch (HibernateException e)
+        {
+            throw new RollerException(e);
+        }
+    }
+
+    //-----------------------------------------------------------------------
+
+    /**
+     * Returns referers for a specified day. Duplicate enties are not
+     * included in this list so the hit counts may not be accurate.
+     * @see org.roller.pojos.RefererManager#getReferersToDate(
+     * org.roller.pojos.WebsiteData, java.lang.String)
+     */
+    public List getReferersToDate(WebsiteData website, String date)
+        throws RollerException
+    {
+        if (website==null )
+            throw new RollerException("website is null");
+
+        if (date==null )
+            throw new RollerException("Date is null");
+
+        Session session = ((HibernateStrategy)mStrategy).getSession();
+        Criteria criteria = session.createCriteria(RefererData.class);
+        criteria.add(Expression.eq("website", website));
+        criteria.add(Expression.eq("dateString", date));
+        criteria.add(Expression.eq("duplicate", Boolean.FALSE));
+        criteria.addOrder(Order.desc("totalHits"));
+        try
+        {
+            return criteria.list();
+        }
+        catch (HibernateException e)
+        {
+            throw new RollerException(e);
+        }
+    }
+
+    //-----------------------------------------------------------------------
+
+    /**
+     * @see org.roller.pojos.RefererManager#getReferersToEntry(
+     * java.lang.String, java.lang.String)
+     */
+    public List getReferersToEntry(String entryid) throws RollerException
+    {
+        if (null == entryid)
+            throw new RollerException("entryid is null");
+
+        try
+        {
+            Session session = ((HibernateStrategy)mStrategy).getSession();
+            Criteria criteria = session.createCriteria(RefererData.class);
+            criteria.createAlias("weblogEntry","e");
+            
+            criteria.add(Expression.eq("e.id", entryid));
+            criteria.add(Expression.isNotNull("title"));
+            criteria.add(Expression.isNotNull("excerpt"));
+            
+            criteria.addOrder(Order.desc("totalHits"));
+        
+            return criteria.list();
+        }
+        catch (HibernateException e)
+        {
+            throw new RollerException(e);
+        }
+    }
+
+    //-----------------------------------------------------------------------
+
+    /**
+     * @see org.roller.pojos.RefererManager#getReferersToEntry(
+     * java.lang.String, java.lang.String)
+     */
+    public void removeReferersForEntry(String entryid) throws RollerException
+    {
+        if (null == entryid)
+            throw new RollerException("entryid is null");
+
+        try
+        {
+            Session session = ((HibernateStrategy)mStrategy).getSession();
+            Criteria criteria = session.createCriteria(RefererData.class);
+            criteria.createAlias("weblogEntry","e");            
+            criteria.add(Expression.eq("e.id", entryid));
+        
+            Iterator referers = criteria.list().iterator();
+            while (referers.hasNext())
+            {
+                removeReferer( ((RefererData)referers.next()).getId() );
+            }
+        }
+        catch (HibernateException e)
+        {
+            throw new RollerException(e);
+        }
+    }
+
+    //-----------------------------------------------------------------------
+
+    /**
+     * Query for collection of referers.
+     */
+    protected List getReferersToWebsite(WebsiteData website, String refererUrl)
+        throws RollerException
+    {
+        Session session = ((HibernateStrategy)mStrategy).getSession();
+        Criteria criteria = session.createCriteria(RefererData.class);
+        criteria.add(Expression.eq("website", website));
+        criteria.add(Expression.eq("refererUrl", refererUrl));
+        try
+        {
+            return criteria.list();
+        }
+        catch (HibernateException e)
+        {
+            throw new RollerException(e);
+        }
+    }
+
+    //-----------------------------------------------------------------------
+
+    /**
+     * Query for collection of referers.
+     */
+    protected List getReferersWithSameTitle(
+        WebsiteData website, 
+        String requestUrl, 
+        String title, 
+        String excerpt)
+        throws RollerException
+    {
+        try
+        {
+            Session session = ((HibernateStrategy)mStrategy).getSession();
+            Criteria criteria = session.createCriteria(RefererData.class);
+            
+            Junction conjunction = Expression.conjunction();
+            conjunction.add(Expression.eq("website", website));
+            conjunction.add(Expression.eq("requestUrl", requestUrl));
+            
+            Junction disjunction = Expression.conjunction();
+            disjunction.add(Expression.eq("title", title));
+            disjunction.add(Expression.eq("excerpt", excerpt));
+        
+            criteria.add(conjunction);
+            criteria.add(disjunction);
+            
+            return criteria.list();
+        }
+        catch (HibernateException e)
+        {
+            throw new RollerException(e);
+        }
+    }
+    
+    /**
+     * Purge referers at midnight. Zero out all dayHits and remove all
+     * referers that do not have excerpts.
+     */
+    public void checkForTurnover( boolean forceTurnover, String websiteId )
+        throws RollerException
+    {
+        // Note, this method doesn't need to be synchronized anymore since
+        // it's called from the timer task now, and will never be executed
+        // by two threads simultaneously.
+        if (mLogger.isDebugEnabled())
+        {
+            mLogger.debug("checkForTurnover");
+        }
+
+        Date now = new Date();
+
+        if (forceTurnover ||
+                !mDateFormat.format(now).equals(mDateFormat.format(mRefDate)))
+        {
+            try
+            {
+                if (websiteId == null) mRefDate = now;
+
+                List refs;
+                try
+                {
+                    Session session = ((HibernateStrategy)mStrategy).getSession();
+                    Criteria criteria = session.createCriteria(RefererData.class);
+                    criteria.add(Expression.gt("dayHits", new Integer(0)));
+                    if (websiteId != null)
+                    {
+                        criteria.add(Expression.eq("website.id", websiteId));
+                    }
+                    refs = criteria.list();
+                }
+                catch (HibernateException e1)
+                {
+                    throw new RollerException(e1);
+                }
+
+                Integer zero = new Integer(0);
+                for (Iterator rdItr = refs.iterator(); rdItr.hasNext();) {
+                    RefererData referer = (RefererData) rdItr.next();
+
+                    if (   (referer.getExcerpt() != null) &&
+                            (referer.getExcerpt().trim().length() > 0))
+                    {
+                        // Zero out dayHits of referers with excerpts
+                        referer.setDayHits(zero);
+                        storeReferer(referer);
+                    }
+                    else
+                    {
+                        // Throw away referers without excerpts
+                        removeReferer(referer.getId());
+                    }
+                }
+            }
+            catch (RollerException e)
+            {
+                mLogger.error("EXCEPTION resetting referers",e);
+            }
+        }
+    }
+
+
+}

Added: incubator/roller/branches/roller_1.x/src/org/roller/business/hibernate/HibernateRollerImpl.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_1.x/src/org/roller/business/hibernate/HibernateRollerImpl.java?rev=327589&view=auto
==============================================================================
--- incubator/roller/branches/roller_1.x/src/org/roller/business/hibernate/HibernateRollerImpl.java (added)
+++ incubator/roller/branches/roller_1.x/src/org/roller/business/hibernate/HibernateRollerImpl.java Fri Oct 21 14:27:36 2005
@@ -0,0 +1,307 @@
+/*
+ * Created on Feb 23, 2003
+ */
+package org.roller.business.hibernate;
+
+import net.sf.hibernate.HibernateException;
+import net.sf.hibernate.SessionFactory;
+import net.sf.hibernate.cfg.Configuration;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.roller.RollerException;
+import org.roller.business.PersistenceStrategy;
+import org.roller.business.utils.UpgradeDatabase;
+import org.roller.model.BookmarkManager;
+import org.roller.model.ConfigManager;
+import org.roller.model.AutoPingManager;
+import org.roller.model.PingQueueManager;
+import org.roller.model.PingTargetManager;
+import org.roller.model.PlanetManager;
+import org.roller.model.PropertiesManager;
+import org.roller.model.RefererManager;
+import org.roller.model.Roller;
+import org.roller.model.UserManager;
+import org.roller.model.WeblogManager;
+import org.roller.pojos.UserData;
+
+import java.sql.Connection;
+
+/**
+ * Implements Roller, the entry point interface for the Roller business tier APIs.
+ * Hibernate specific implementation.
+ *
+ * @author David M Johnson
+ */
+public class HibernateRollerImpl extends org.roller.business.RollerImpl
+{
+    static final long serialVersionUID = 5256135928578074652L;
+
+    private static Log mLogger = 
+        LogFactory.getFactory().getInstance(HibernateRollerImpl.class);
+    
+    protected BookmarkManager mBookmarkManager;   
+    protected ConfigManager   mConfigManager = null;
+    protected PropertiesManager mPropsManager = null;
+    protected PlanetManager   planetManager = null;
+    protected RefererManager  mRefererManager;
+    protected UserManager     mUserManager;
+    protected WeblogManager   mWeblogManager;
+    protected PingQueueManager mPingQueueManager;
+    protected AutoPingManager mAutoPingManager;
+    protected PingTargetManager mPingTargetManager;
+    protected static HibernateRollerImpl me;
+    protected PersistenceStrategy mStrategy = null;
+    protected static SessionFactory mSessionFactory;
+
+
+    protected HibernateRollerImpl() throws RollerException
+    {
+        mLogger.debug("Initializing sessionFactory for Hibernate");
+        
+        try 
+        {
+            Configuration config = new Configuration();
+            config.configure("/hibernate.cfg.xml");
+            mSessionFactory = config.buildSessionFactory();
+        } 
+        catch (HibernateException e) 
+        {
+            mLogger.error("Error Setting up SessionFactory",e);
+            throw new RollerException(e);
+        }
+        
+        mStrategy = new HibernateStrategy(mSessionFactory);    
+    }
+
+    
+    /**
+     * Instantiates and returns an instance of HibernateRollerImpl.
+     * @see org.roller.model.RollerFactory
+     */
+    public static Roller instantiate() throws RollerException
+    {
+        if (me == null) 
+        {
+            mLogger.debug("Instantiating HibernateRollerImpl");
+            me = new HibernateRollerImpl();
+        }
+        
+        return me;
+    }
+    
+
+    public void begin() throws RollerException
+    {
+        mStrategy.begin(UserData.ANONYMOUS_USER);
+    }
+    
+    public void begin(UserData user) throws RollerException
+    {
+        mStrategy.begin(user);
+    }
+    
+    public UserData getUser() throws RollerException
+    {
+        return mStrategy.getUser();
+    }
+    
+    public void setUser(UserData user) throws RollerException
+    {
+        mStrategy.setUser(user);
+    }
+    
+    public void commit() throws RollerException
+    {
+        mStrategy.commit();
+    }
+    
+	public void rollback()
+	{
+		try
+		{
+			mStrategy.rollback();
+		}
+		catch (Exception e)
+		{
+			mLogger.error(e);
+		}
+	}
+
+    /** 
+     * @see org.roller.model.Roller#getUserManager()
+     */
+    public UserManager getUserManager() throws RollerException
+    {
+        if ( mUserManager == null ) 
+        {
+            mUserManager = new HibernateUserManagerImpl(mStrategy);
+        }
+        return mUserManager;
+    }
+
+    /** 
+     * @see org.roller.model.Roller#getBookmarkManager()
+     */
+    public BookmarkManager getBookmarkManager() throws RollerException
+    {
+        if ( mBookmarkManager == null ) 
+        {
+            mBookmarkManager = new HibernateBookmarkManagerImpl(mStrategy);
+        }
+        return mBookmarkManager;
+    }
+
+    /** 
+     * @see org.roller.model.Roller#getWeblogManager()
+     */
+    public WeblogManager getWeblogManager() throws RollerException
+    {
+        if ( mWeblogManager == null ) 
+        {
+            mWeblogManager = new HibernateWeblogManagerImpl(mStrategy);
+        }
+        return mWeblogManager;
+    }
+
+    /** 
+     * @see org.roller.model.Roller#getRefererManager()
+     */
+    public RefererManager getRefererManager() throws RollerException
+    {
+        if ( mRefererManager == null ) 
+        {
+            mRefererManager = new HibernateRefererManagerImpl(mStrategy);
+        }
+        return mRefererManager;
+    }
+
+    /**
+     * @see org.roller.model.Roller#getConfigManager()
+     */
+    public ConfigManager getConfigManager() throws RollerException 
+    {
+        if (mConfigManager == null)
+        {
+            mConfigManager = new HibernateConfigManagerImpl(mStrategy);
+        }
+        return mConfigManager;
+    }
+    
+    /**
+     * @see org.roller.model.Roller#getPropertiesManager()
+     */
+    public PropertiesManager getPropertiesManager() throws RollerException 
+    {
+        if (mPropsManager == null)
+        {
+            mPropsManager = new HibernatePropertiesManagerImpl(mStrategy);
+        }
+        return mPropsManager;
+    }
+
+    /**
+     * @see org.roller.model.Roller#getPingTargetManager()
+     */
+    public PingQueueManager getPingQueueManager() throws RollerException
+    {
+        if (mPingQueueManager == null)
+        {
+            mPingQueueManager = new HibernatePingQueueManagerImpl(mStrategy);
+        }
+        return mPingQueueManager;
+    }
+
+    /**
+     * @see org.roller.model.Roller#getPlanetManager()
+     */
+    public PlanetManager getPlanetManager() throws RollerException
+    {
+        if ( planetManager == null ) 
+        {
+            planetManager = new HibernatePlanetManagerImpl(mStrategy,this);
+        }
+        return planetManager;
+    }
+
+
+    /**
+     * @see org.roller.model.Roller#getPingTargetManager()
+     */
+    public AutoPingManager getAutopingManager() throws RollerException
+    {
+        if (mAutoPingManager == null)
+        {
+            mAutoPingManager = new HibernateAutoPingManagerImpl(mStrategy);
+        }
+        return mAutoPingManager;
+    }
+
+
+    /**
+     * @see org.roller.model.Roller#getPingTargetManager()
+     */
+    public PingTargetManager getPingTargetManager() throws RollerException
+    {
+        if (mPingTargetManager == null)
+        {
+            mPingTargetManager = new HibernatePingTargetManagerImpl(mStrategy);
+        }
+        return mPingTargetManager;
+    }
+
+
+    /**
+     * @see org.roller.model.Roller#getPersistenceStrategy()
+     */
+    public PersistenceStrategy getPersistenceStrategy()
+    {
+        return mStrategy;
+    }
+    
+    /** 
+     * @see org.roller.model.Roller#upgradeDatabase(java.sql.Connection)
+     */
+    public void upgradeDatabase(Connection con) throws RollerException
+    {
+        UpgradeDatabase.upgradeDatabase(con); 
+    }
+
+    public void release()
+    {
+        super.release();
+        
+        if (mBookmarkManager != null) mBookmarkManager.release();
+        if (mConfigManager != null) mConfigManager.release();
+        if (mRefererManager != null) mRefererManager.release();
+        if (mUserManager != null) mUserManager.release();
+        if (mWeblogManager != null) mWeblogManager.release();
+        if (mPingTargetManager != null) mPingTargetManager.release();
+        if (mPingQueueManager != null) mPingQueueManager.release();
+        if (mAutoPingManager != null) mAutoPingManager.release();
+        
+        try
+        {
+            if (mStrategy != null) mStrategy.release(); 
+        }
+        catch (Exception e)
+        {
+            mLogger.error(
+            "Exception with mSupport.release() [" + e + "]", e);
+        }
+    }
+
+    public void shutdown()
+    {
+        super.shutdown();
+        
+        try
+        {
+            release();
+            mSessionFactory.close();
+        }
+        catch (HibernateException e)
+        {
+            mLogger.error("Unable to close SessionFactory", e);
+        }
+    }
+}

Added: incubator/roller/branches/roller_1.x/src/org/roller/business/hibernate/HibernateStrategy.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_1.x/src/org/roller/business/hibernate/HibernateStrategy.java?rev=327589&view=auto
==============================================================================
--- incubator/roller/branches/roller_1.x/src/org/roller/business/hibernate/HibernateStrategy.java (added)
+++ incubator/roller/branches/roller_1.x/src/org/roller/business/hibernate/HibernateStrategy.java Fri Oct 21 14:27:36 2005
@@ -0,0 +1,463 @@
+/*
+ * Created on Mar 7, 2003
+ */
+package org.roller.business.hibernate;
+
+import java.util.List;
+
+import net.sf.hibernate.HibernateException;
+import net.sf.hibernate.ObjectNotFoundException;
+import net.sf.hibernate.Session;
+import net.sf.hibernate.SessionFactory;
+import net.sf.hibernate.type.Type;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.roller.RollerException;
+import org.roller.RollerPermissionsException;
+import org.roller.business.PersistenceStrategy;
+import org.roller.model.PersistenceSession;
+import org.roller.pojos.PersistentObject;
+import org.roller.pojos.UserData;
+
+
+///////////////////////////////////////////////////////////////////////////////
+/**
+ * Reusable Hibernate implementations of CRUD operations.
+ * @author David M Johnson
+ */
+public class HibernateStrategy implements PersistenceStrategy
+{
+    static final long serialVersionUID = 2561090040518169098L;    
+    private static SessionFactory mSessionFactory = null;
+    private static final ThreadLocal mSessionTLS = new ThreadLocal();
+    //private static final ThreadLocal mTransactionTLS = new ThreadLocal();
+
+    private static Log mLogger =
+        LogFactory.getFactory().getInstance(HibernateStrategy.class);
+
+    //-------------------------------------------------------------------------
+    /**
+     * Construct using Hibernate Session Factory.
+     */
+    public HibernateStrategy(SessionFactory factory) throws RollerException
+    {
+        mSessionFactory = factory;
+    }
+
+    //-------------------------------------------------------------------------
+    /** 
+     * Start new Roller persistence session on current thread. 
+     */
+    public void begin(UserData user) throws RollerException
+    {
+        getPersistenceSession(user, true); // force create of new session
+    }
+
+    //-------------------------------------------------------------------------
+    /** 
+     * Start new Roller persistence session on current thread. 
+     */
+    public void setUser(UserData user) throws RollerException
+    {
+        PersistenceSession pses = getPersistenceSession(user, false);
+        pses.setUser(user);
+    }
+
+    //-------------------------------------------------------------------------
+    /** 
+     * Start new Roller persistence session on current thread. 
+     */
+    public UserData getUser() throws RollerException
+    {
+        PersistenceSession pses = getPersistenceSession(null, false);
+        return pses.getUser();
+    }
+
+    //-------------------------------------------------------------------------
+    /** 
+     * Get existing persistence session on current thread. 
+     */
+    public Session getSession() throws RollerException
+    {
+        return (Session)(getPersistenceSession(
+           UserData.ANONYMOUS_USER, false).getSessionObject());
+    }
+    
+    //-------------------------------------------------------------------------
+    /** 
+     * Get existing or open new persistence session for current thread 
+     * @param createNew True if existing session on thread is an warn condition.
+     */
+    public PersistenceSession getPersistenceSession(UserData user, boolean createNew) 
+        throws RollerException
+    {
+        PersistenceSession ses = (PersistenceSession)mSessionTLS.get();
+        if (createNew && ses != null)
+        {
+            mLogger.warn("TLS not empty at beginnng of request");
+            release();
+            ses = null;
+        }
+        if (ses == null && user != null)
+        {
+            try
+            {
+                Session hses = mSessionFactory.openSession();
+                ses = new HibernatePersistenceSession(user, hses);
+            }
+            catch (Exception e)
+            {
+                mLogger.error(Messages.getString(
+                    "HibernateStrategy.exceptionOpeningSession"));
+                throw new RuntimeException();
+            }
+            mSessionTLS.set(ses);
+        }
+        else if (ses == null)
+        {
+            throw new RollerException(
+                "MUST specify user for new persistence session");
+        }
+        return ses;
+    }
+
+    //-------------------------------------------------------------------------
+    /** 
+     * This is called on error to start a new Hibernate session.
+     * Gavin: "make sure you never catch + handle an exception and
+     * then keep using the session (ObjectNotFoundException included!)
+     */
+    private void newSession()  throws RollerException
+    {
+        PersistenceSession pses = getPersistenceSession(null, false);       
+        UserData user = pses.getUser();
+        release();
+        getPersistenceSession(user, true);
+    }
+    
+    //-------------------------------------------------------------------------
+    /** 
+     * Release database session, rolls back any uncommitted changes. 
+     */
+    public void release() throws RollerException
+    {
+        PersistenceSession pses = (PersistenceSession)mSessionTLS.get();
+        if ( null == pses ) return; // there is no session to release
+        mSessionTLS.set(null); // sets thread's session to null
+        Session ses = (Session)pses.getSessionObject();
+        if (ses != null)
+        {
+            try
+            {
+                if (ses.isOpen())
+                {
+                    ses.close();   
+                }               
+            }
+            catch (Throwable he)
+            {
+            	    mLogger.error("ERROR cleaning up Hibernate session", he);
+            }
+        }
+        ses = null;
+    }
+
+    //-------------------------------------------------------------------------
+    /**
+     * Remove object from persistence storage.
+     * @param clazz Class of object to remove.
+     * @param id Id of object to remove.
+     * @throws RollerException Error deleting object.
+     */
+    public void remove( String id, Class clazz ) throws RollerException
+    {
+        if ( id == null )
+        {
+            throw new RollerException(Messages.getString(
+                "HibernateStrategy.nullNotValidId"));
+        }
+        if ( clazz == null )
+        {
+            throw new RollerException(Messages.getString(
+                "HibernateStrategy.nullNotValidClass"));
+        }
+
+        // Create persistent instance and delete it
+        PersistentObject obj;
+        try
+        {
+            obj = (PersistentObject)getSession().load(clazz,id);
+            if (obj.canSave()) 
+            {
+                getSession().delete(obj);
+            }
+            else
+            {
+                throw new RollerPermissionsException("DENIED: cannot remove");
+            }
+        }
+        catch (HibernateException e)
+        {
+            String msg = Messages.formatString(
+                "HibernateStrategy.exceptionRemoving",id,clazz.getName());
+            mLogger.error(msg, e);
+
+            newSession();
+            throw new RollerException(e);
+        }
+    }
+
+    //-------------------------------------------------------------------------
+    /**
+     * Remove object from persistence storage.
+     */
+    public void remove(PersistentObject po) throws RollerException
+    {
+        if (!po.canSave())
+        {
+            throw new RollerPermissionsException(
+                "DENIED: cannot remove: "+po.toString());
+        }
+        try
+        {
+            if (po.getId() != null) // no need to delete transient object
+            {
+                getSession().delete(po);
+            }
+        }
+        catch (HibernateException e)
+        {
+            String msg = Messages.formatString(
+                "HibernateStrategy.exceptionRemoving",po.getId());
+            mLogger.error(msg, e);
+            newSession();
+            throw new RollerException(e);
+        }
+    }
+
+    //-------------------------------------------------------------------------
+    /**
+     * Retrieve object, begins and ends its own transaction.
+     * @param clazz Class of object to retrieve.
+     * @param id Id of object to retrieve.
+     * @return Object Object retrieved.
+     * @throws RollerException Error retrieving object.
+     */
+    public PersistentObject load(String id, Class clazz)
+        throws RollerException
+    {
+        if ( id == null )
+        {
+            throw new RollerException(Messages.getString(
+                "HibernateStrategy.nullNotValidId"));
+        }
+
+        if ( clazz == null )
+        {
+            throw new RollerException(Messages.getString(
+                "HibernateStrategy.nullNotValidClass"));
+        }
+
+        Object obj = null;
+        Session ses = getSession();
+        try
+        {
+            obj = (PersistentObject)ses.load( clazz, id );
+        }
+        catch (Exception e)
+        {
+            if (mLogger.isDebugEnabled())
+            {
+                if (e instanceof ObjectNotFoundException)
+                {
+                    mLogger.debug("No " + clazz.getName() + " found for ID:" + id);
+                }
+                else
+                {
+                    String msg = Messages.formatString(
+                     "HibernateStrategy.exceptionRetrieving", id, clazz.getName());
+                    mLogger.debug(msg, e);
+                }
+            }
+            newSession();
+        }
+        return (PersistentObject)obj;
+    }
+
+    //-------------------------------------------------------------------------
+    /**
+     * Store object using an existing transaction.
+     */
+    public PersistentObject store(PersistentObject obj)
+        throws RollerException
+    {
+        if ( obj == null )
+        {
+            throw new RollerException(Messages.getString(
+                "HibernateStrategy.nullPassedIn"));
+        }
+        if (!obj.canSave())
+        {
+            throw new RollerPermissionsException(
+                "DENIED: cannot save: "+obj.toString());
+        }
+        Session ses = getSession();
+        try
+        {
+            // TODO: better to use ses.saveOrUpdate() here, if possible
+            if ( obj.getId() == null || obj.getId().trim().equals("") )
+            {
+                // Object has never been written to database, so save it.
+                // This makes obj into a persistent instance.
+                ses.save(obj);
+            }
+
+            if ( !ses.contains(obj) )
+            {
+                // Object has been written to database, but instance passed in
+                // is not a persistent instance, so must be loaded into session.
+                PersistentObject vo =
+                    (PersistentObject)ses.load(obj.getClass(),obj.getId());
+                vo.setData(obj);
+                obj = vo;
+            }
+        }
+        catch (HibernateException e)
+        {
+            String msg = Messages.formatString(
+                "HibernateStrategy.exceptionStoring",obj.getId());
+            mLogger.error(msg, e);
+            newSession();
+            throw new RollerException(msg,e);
+        }
+        return obj;
+    }
+
+    //-------------------------------------------------------------------------
+    /** 
+     * Execute Hibernate HSQL query 
+     */
+    public List query( String query, Object[] args, Object[] types)
+        throws RollerException
+    {
+        return query(query, args, (Type[])types);
+    }
+
+    //-------------------------------------------------------------------------
+    /** 
+     * Execute Hibernate HSQL query 
+     */
+    public List query( String query, Object[] args, Type[] types )
+        throws RollerException
+    {
+        if ( query == null )
+          {
+              throw new RollerException(Messages.getString(
+                "HibernateStrategy.nullNotValidQuery"));
+          }
+
+          if ( args == null )
+          {
+              throw new RollerException(Messages.getString(
+                "HibernateStrategy.nullNotValidArgArray"));
+          }
+
+          if ( types == null )
+          {
+              throw new RollerException(Messages.getString(
+                "HibernateStrategy.nullNotValidArrayType"));
+          }
+
+          try
+          {
+              if (query.indexOf("$") > -1)
+              {
+                  query = query.replaceAll("\\$\\d+", "\\?");
+              }
+              return getSession().find(query,args,types);
+          }
+          catch (Exception e)
+          {
+              String msg = Messages.getString("HibernateStrategy.duringQuery");
+              mLogger.error(msg, e);
+              newSession();
+              throw new RollerException(msg,e);
+          }
+    }
+
+    //-------------------------------------------------------------------------
+    /** 
+     * Execute Hibernate HSQL query 
+     */
+    public List query( String query )
+        throws RollerException
+    {
+        try
+        {
+            if (query.indexOf("$") > -1)
+            {
+                query = query.replaceAll("\\$\\d+", "\\?");
+            }
+            return getSession().find(query);
+        }
+        catch (Exception e)
+        {
+            String msg = Messages.getString("HibernateStrategy.duringQuery");
+            mLogger.error(msg, e);
+            newSession();
+            throw new RollerException(msg,e);
+        }
+    }
+
+    //-------------------------------------------------------------------------
+    /** 
+     * Commits current transaction, if there is one, does not release session. 
+     */
+    public void commit() throws RollerException
+    {
+        try
+        {
+            if (mSessionTLS.get()!=null)
+            {
+                getSession().flush();
+
+                // can't call commit when autocommit is true
+                if (!getSession().connection().getAutoCommit())
+                {
+                    getSession().connection().commit();
+                }
+            }
+        }
+        catch (Exception he) // HibernateExeption or SQLException
+        {
+            newSession();
+            throw new RollerException(he);
+        }
+    }
+
+    //-------------------------------------------------------------------------
+    /** 
+     * Rollback uncommitted changes, does not release session. 
+     */
+    public void rollback() throws RollerException
+    {
+        // Can't call rollback when autoCommit=true
+        try
+        {
+            if (!getSession().connection().getAutoCommit())
+            {
+                getSession().connection().rollback();
+            }
+        }
+        catch (Exception he)
+        {
+            newSession();            
+            if (mLogger.isDebugEnabled())
+            {
+                mLogger.debug("ERROR during rollback",he);
+            }
+        }
+    }
+}
+

Added: incubator/roller/branches/roller_1.x/src/org/roller/business/hibernate/HibernateUserManagerImpl.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller_1.x/src/org/roller/business/hibernate/HibernateUserManagerImpl.java?rev=327589&view=auto
==============================================================================
--- incubator/roller/branches/roller_1.x/src/org/roller/business/hibernate/HibernateUserManagerImpl.java (added)
+++ incubator/roller/branches/roller_1.x/src/org/roller/business/hibernate/HibernateUserManagerImpl.java Fri Oct 21 14:27:36 2005
@@ -0,0 +1,432 @@
+/*
+ * Created on Jun 16, 2004
+ */
+package org.roller.business.hibernate;
+
+import net.sf.hibernate.Criteria;
+import net.sf.hibernate.HibernateException;
+import net.sf.hibernate.Session;
+import net.sf.hibernate.expression.Expression;
+import net.sf.hibernate.expression.EqExpression;
+import net.sf.hibernate.expression.Order;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.roller.RollerException;
+import org.roller.business.PersistenceStrategy;
+import org.roller.business.UserManagerImpl;
+import org.roller.model.BookmarkManager;
+import org.roller.model.RollerFactory;
+import org.roller.model.WeblogManager;
+import org.roller.model.AutoPingManager;
+import org.roller.model.PingTargetManager;
+import org.roller.model.PingQueueManager;
+import org.roller.pojos.FolderData;
+import org.roller.pojos.WeblogTemplate;
+import org.roller.pojos.RefererData;
+import org.roller.pojos.RoleData;
+import org.roller.pojos.UserCookieData;
+import org.roller.pojos.UserData;
+import org.roller.pojos.WeblogCategoryData;
+import org.roller.pojos.WeblogEntryData;
+import org.roller.pojos.WebsiteData;
+import org.roller.util.StringUtils;
+import org.roller.util.Utilities;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Hibernate queries.
+ * @author David M Johnson
+ */
+public class HibernateUserManagerImpl extends UserManagerImpl
+{
+    static final long serialVersionUID = -5128460637997081121L;
+    
+    private static Log mLogger =
+        LogFactory.getFactory().getInstance(HibernateUserManagerImpl.class);
+    
+    /**
+     * @param strategy
+     */
+    public HibernateUserManagerImpl(PersistenceStrategy strategy)
+    {
+        super(strategy);
+        mLogger.debug("Instantiating User Manager");
+    }
+    
+    /** 
+     * Use Hibernate directly because Roller's Query API does too much allocation.
+     */
+    public WeblogTemplate getPageByLink(WebsiteData website, String pagelink)
+                    throws RollerException
+    {
+        if (website == null)
+            throw new RollerException("userName is null");
+                                   
+        if (pagelink == null)
+            throw new RollerException("Pagelink is null");
+                                                                      
+        Session session = ((HibernateStrategy)mStrategy).getSession();
+        Criteria criteria = session.createCriteria(WeblogTemplate.class);
+        criteria.add(Expression.eq("website",website));
+        criteria.add(Expression.eq("link",pagelink));        
+        criteria.setMaxResults(1);
+        try
+        {
+            List list = criteria.list();
+            return list.size()!=0 ? (WeblogTemplate)list.get(0) : null;
+        }
+        catch (HibernateException e)
+        {
+            throw new RollerException(e);
+        }
+    }
+    
+    /** 
+     * Use Hibernate directly because Roller's Query API does too much allocation.
+     */
+    public WebsiteData getWebsite(String userName, boolean enabledOnly)
+                    throws RollerException
+    {
+        if (userName==null )
+            throw new RollerException("userName is null");
+
+        try
+        {
+            Session session = ((HibernateStrategy)mStrategy).getSession();
+            Criteria criteria = session.createCriteria(WebsiteData.class);
+            criteria.createAlias("user","u");
+    
+            if (enabledOnly) 
+            {
+                criteria.add(
+                   Expression.conjunction()
+                       .add(new EqExpression("u.userName",userName,true))
+                       .add(Expression.eq("isEnabled",Boolean.TRUE)));
+            }
+            else
+            {
+                criteria.add(
+                    Expression.conjunction()
+                       .add(new EqExpression("u.userName",userName,true)));
+            }
+        
+            List list = criteria.list();
+            return list.size()!=0 ? (WebsiteData)list.get(0) : null;
+        }
+        catch (HibernateException e)
+        {
+            throw new RollerException(e);
+        }
+    }
+    
+    /**
+     * @see org.roller.model.UserManager#removeLoginCookies(java.lang.String)
+     */
+    public void removeLoginCookies(String username) throws RollerException
+    {
+        Session session = ((HibernateStrategy)mStrategy).getSession();
+        Criteria criteria = session.createCriteria(UserCookieData.class); 
+        criteria.add(Expression.eq("username", username));        
+        List list;
+        try
+        {
+            list = criteria.list();
+        }
+        catch (HibernateException e)
+        {
+            throw new RollerException(e);
+        }
+        for (Iterator it = list.iterator(); it.hasNext();)
+        {
+            String id = ((UserCookieData) it.next()).getId();
+            mStrategy.remove(id, UserCookieData.class);
+        }        
+    }
+    
+    /**
+     * @see org.roller.model.UserManager#checkLoginCookie(java.lang.String)
+     */
+    public String checkLoginCookie(String value) throws RollerException 
+    {
+        try 
+        {
+            value = Utilities.decodeString(value);
+        } 
+        catch (IOException io) 
+        {
+            mLogger.warn("Failed to decode rememberMe cookieString");
+            return null;
+        }
+        
+        String[] values = StringUtils.split(value, "|");
+
+        if (mLogger.isDebugEnabled()) 
+        {
+            mLogger.debug("looking up cookieId: " + values[1]);
+        }
+
+        Session session = ((HibernateStrategy)mStrategy).getSession();
+        Criteria criteria = session.createCriteria(UserCookieData.class); 
+        criteria.add(Expression.eq("username", values[0]));
+        criteria.add(Expression.eq("cookieId", values[1])); 
+               
+        List list;
+        try
+        {
+            list = criteria.list();
+        }
+        catch (HibernateException e)
+        {
+            throw new RollerException(e);
+        }
+        UserCookieData cookie = (list.size() > 0) ? (UserCookieData)list.get(0) : null;
+
+        if (cookie != null) 
+        {
+            if (mLogger.isDebugEnabled()) 
+            {
+                mLogger.debug("cookieId lookup succeeded, generating new cookieId");
+            }
+            return saveLoginCookie(cookie);
+        } 
+        else 
+        {
+            if (mLogger.isDebugEnabled()) 
+            {
+                mLogger.debug("cookieId lookup failed, returning null");
+            }
+
+            return null;
+        }
+    }
+    
+    //------------------------------------------------------------------------    
+    /** 
+     * @see org.roller.model.UserManager#getPages(WebsiteData)
+     */
+    public List getPages(WebsiteData website) throws RollerException
+    {
+        if (website == null)
+            throw new RollerException("website is null");
+                                                                      
+        Session session = ((HibernateStrategy)mStrategy).getSession();
+        Criteria criteria = session.createCriteria(WeblogTemplate.class);
+        criteria.add(Expression.eq("website",website)); 
+        criteria.addOrder(Order.asc("name"));
+        try
+        {
+            return criteria.list();
+        }
+        catch (HibernateException e)
+        {
+            throw new RollerException(e);
+        }
+    }
+    
+    /** 
+     * @see org.roller.model.UserManager#getPageByName(WebsiteData, java.lang.String)
+     */
+    public WeblogTemplate getPageByName(WebsiteData website, String pagename) 
+        throws RollerException
+    {
+        if (website == null)
+            throw new RollerException("website is null");
+                                   
+        if (pagename == null)
+            throw new RollerException("Page name is null");
+                                   
+        Session session = ((HibernateStrategy)mStrategy).getSession();
+        Criteria criteria = session.createCriteria(WeblogTemplate.class);
+        criteria.add(Expression.eq("website", website));
+        criteria.add(Expression.eq("name", pagename));
+        criteria.setMaxResults(1);
+        try
+        {
+            List list = criteria.list();
+            return list.size()!=0 ? (WeblogTemplate)list.get(0) : null;
+        }
+        catch (HibernateException e)
+        {
+            throw new RollerException(e);
+        }
+    }
+    
+    /* 
+     * @see org.roller.business.UserManagerBase#getRoles(org.roller.pojos.UserData)
+     */
+    public List getUserRoles(UserData user) throws RollerException
+    {
+        
+        Session session = ((HibernateStrategy)mStrategy).getSession();
+        Criteria criteria = session.createCriteria(RoleData.class);
+        criteria.add(Expression.eq("user", user));
+        try
+        {
+            return criteria.list();
+        }
+        catch (HibernateException e)
+        {
+            throw new RollerException(e);
+        }
+    }
+
+    public List getUsers(boolean enabledOnly) throws RollerException
+    {
+        Session session = ((HibernateStrategy)mStrategy).getSession();
+        if (enabledOnly)
+        {
+            Criteria criteria = session.createCriteria(WebsiteData.class);            
+            criteria.add(Expression.eq("isEnabled", Boolean.TRUE));
+            try
+            {
+                List users = new ArrayList();
+                Iterator websites = criteria.list().iterator();
+                while (websites.hasNext())
+                {
+                    WebsiteData website = (WebsiteData) websites.next();
+                    users.add(website.getUser());
+                }
+                return users;
+            }
+            catch (HibernateException e)
+            {
+                throw new RollerException(e);
+            }
+        }
+        else
+        {
+            Criteria criteria = session.createCriteria(UserData.class);            
+            try
+            {
+                return criteria.list();
+            }
+            catch (HibernateException e)
+            {
+                throw new RollerException(e);
+            }
+        }
+    }
+
+    /** 
+     * @see org.roller.model.UserManager#removeUserWebsites(org.roller.pojos.UserData)
+     */
+    public void removeUserWebsites(UserData user) throws RollerException
+    {
+        Session session = ((HibernateStrategy)mStrategy).getSession();
+        Criteria criteria = session.createCriteria(WebsiteData.class);
+        criteria.add(Expression.eq("user", user));
+        try
+        {
+            List websites = criteria.list();
+            for (Iterator iter = websites.iterator(); iter.hasNext();) 
+            {
+                WebsiteData website = (WebsiteData)iter.next();
+                website.remove();
+            }            
+        }
+        catch (HibernateException e)
+        {
+            throw new RollerException(e);
+        }
+    }
+
+    /** 
+     * @see org.roller.model.UserManager#removeWebsiteContents(org.roller.pojos.WebsiteData)
+     */
+    public void removeWebsiteContents(WebsiteData website) 
+        throws RollerException
+    {
+        try
+        {
+            Session session = ((HibernateStrategy)mStrategy).getSession();
+
+            //UserManager umgr = RollerFactory.getRoller().getUserManager();
+            BookmarkManager bmgr = RollerFactory.getRoller().getBookmarkManager();
+            WeblogManager wmgr = RollerFactory.getRoller().getWeblogManager();
+            //PersistenceStrategy pstrat = RollerFactory.getRoller().getPersistenceStrategy();
+            //QueryFactory factory = pstrat.getQueryFactory();
+            
+            // remove folders (takes bookmarks with it)
+            FolderData rootFolder = bmgr.getRootFolder(website);
+            if (null != rootFolder)
+            { 
+                rootFolder.remove();
+                // Still cannot get all Bookmarks cleared!                
+//                Iterator allFolders = bmgr.getAllFolders(website).iterator();
+//                while (allFolders.hasNext()) 
+//                {
+//                    FolderData aFolder = (FolderData)allFolders.next();
+//                    bmgr.deleteFolderContents(aFolder);
+//                    aFolder.remove();
+//                }
+            }
+                        
+            // remove entries
+            Criteria entryQuery = session.createCriteria(WeblogEntryData.class);
+            entryQuery.add(Expression.eq("website", website));
+            List entries = entryQuery.list();
+            for (Iterator iter = entries.iterator(); iter.hasNext();) 
+            {
+                WeblogEntryData entry = (WeblogEntryData) iter.next();
+                entry.remove();
+            }
+            
+            // remove associated pages
+            Criteria pageQuery = session.createCriteria(WeblogTemplate.class);
+            pageQuery.add(Expression.eq("website", website));
+            List pages = pageQuery.list();
+            for (Iterator iter = pages.iterator(); iter.hasNext();) 
+            {
+                WeblogTemplate page = (WeblogTemplate) iter.next();
+                page.remove();
+            }
+            
+            // remove associated referers
+            Criteria refererQuery = session.createCriteria(RefererData.class);
+            refererQuery.add(Expression.eq("website", website));
+            List referers = refererQuery.list();
+            for (Iterator iter = referers.iterator(); iter.hasNext();) 
+            {
+                RefererData referer = (RefererData) iter.next();
+                referer.remove();
+            }
+            
+            // remove categories
+            WeblogCategoryData rootCat = wmgr.getRootWeblogCategory(website);
+            if (null != rootCat)
+            {
+                rootCat.remove();
+                Iterator it = wmgr.getWeblogCategories(website).iterator();
+                while (it.hasNext()) 
+                {
+                     ((WeblogCategoryData)it.next()).remove();
+                }
+            }
+
+            // Remove the website's ping queue entries
+            PingQueueManager pingQueueMgr = RollerFactory.getRoller().getPingQueueManager();
+            pingQueueMgr.removeQueueEntriesByWebsite(website);
+
+            // Remove the website's custom ping targets
+            PingTargetManager pingTargetMgr = RollerFactory.getRoller().getPingTargetManager();
+            pingTargetMgr.removeCustomPingTargets(website);
+
+            // Remove the website's auto ping configurations
+            AutoPingManager autoPingMgr = RollerFactory.getRoller().getAutopingManager();
+            List autopings = autoPingMgr.getAutoPingsByWebsite(website);
+            autoPingMgr.removeAutoPings(autopings);
+
+        }
+        catch (HibernateException e)
+        {
+            throw new RollerException(e);
+        }
+    }
+
+}
+