You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@roller.apache.org by ag...@apache.org on 2006/04/09 00:36:28 UTC

svn commit: r392618 [3/5] - in /incubator/roller/branches/roller-newbackend/src/org/roller/business: ./ hibernate/ search/operations/

Modified: incubator/roller/branches/roller-newbackend/src/org/roller/business/hibernate/HibernateRefererManagerImpl.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller-newbackend/src/org/roller/business/hibernate/HibernateRefererManagerImpl.java?rev=392618&r1=392617&r2=392618&view=diff
==============================================================================
--- incubator/roller/branches/roller-newbackend/src/org/roller/business/hibernate/HibernateRefererManagerImpl.java (original)
+++ incubator/roller/branches/roller-newbackend/src/org/roller/business/hibernate/HibernateRefererManagerImpl.java Sat Apr  8 15:36:25 2006
@@ -6,10 +6,11 @@
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
-
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -23,8 +24,6 @@
 import org.hibernate.criterion.Order;
 import org.hibernate.type.Type;
 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;
@@ -38,34 +37,182 @@
 import org.hibernate.dialect.SQLServerDialect;
 import org.hibernate.engine.SessionFactoryImplementor;
 import org.hibernate.dialect.Dialect;
+import org.roller.model.Roller;
+import org.roller.model.RollerFactory;
+import org.roller.model.UserManager;
+import org.roller.model.WeblogManager;
+import org.roller.util.DateUtil;
+import org.roller.util.LinkbackExtractor;
+import org.roller.util.Utilities;
 
 
 /**
- * Hibernate queries.
- * @author David M Johnson
+ * Hibernate implementation of the RefererManager.
  */
-public class HibernateRefererManagerImpl extends RefererManagerImpl
-        implements RefererManager {
+public class HibernateRefererManagerImpl implements RefererManager {
+    
     static final long serialVersionUID = -4966091850482256435L;
     
-    private static Log mLogger =
-            LogFactory.getFactory().getInstance(HibernateRefererManagerImpl.class);
+    private static Log log = LogFactory.getLog(HibernateRefererManagerImpl.class);
+    
+    protected static final String DAYHITS = "dayHits";
+    protected static final String TOTALHITS = "totalHits";
+    
+    private HibernatePersistenceStrategy strategy = null;
+    private Date mRefDate = new Date();
+    private SimpleDateFormat mDateFormat = DateUtil.get8charDateFormat();
     
-    //-------------------------------------------------- Startup and Shutdown
-    public HibernateRefererManagerImpl(PersistenceStrategy support)
-    throws RollerException {
-        super();
-        mStrategy = (HibernateStrategy)support;
-        mLogger.debug("Instantiating Referer Manager");
+    
+    public HibernateRefererManagerImpl(HibernatePersistenceStrategy strat) {
+        
+        log.debug("Instantiating Hibernate Referer Manager");
+        
+        strategy = strat;
     }
     
-    //-----------------------------------------------------------------------
+    
+    /**
+     * @see org.roller.pojos.RefererManager#storeReferer(org.roller.pojos.RefererData)
+     */
+    public void storeReferer(RefererData referer) throws RollerException {
+        strategy.storeAndCommit(referer);
+    }
+    
+    
+    /**
+     * @see org.roller.pojos.RefererManager#removeReferer(java.lang.String)
+     */
+    public void removeReferer(String id) throws RollerException {
+        strategy.removeAndCommit(id, RefererData.class);
+    }
+    
+    
+    // convenience method for removing a list of referers
+    private void removeReferers(List referers) throws RollerException {
+        
+        try {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            // just go through the list and remove each auto ping
+            Iterator referer = referers.iterator();
+            while (referer.hasNext()) {
+                    this.strategy.remove((RefererData) referer.next());
+            }
+            
+            // commit changes
+            this.strategy.getSession().getTransaction().commit();
+        } catch (HibernateException ex) {
+            
+            try {
+                this.strategy.getSession().getTransaction().rollback();
+            } catch(HibernateException he) {
+                log.error("Error doing rollback", he);
+            }
+            
+            strategy.release();
+            
+            throw new RollerException(ex);
+        }
+    }
+    
+    
+    /**
+     * @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 {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            Session session = ((HibernatePersistenceStrategy)strategy).getSession();
+            Criteria criteria = session.createCriteria(RefererData.class);
+            criteria.createAlias("weblogEntry","e");
+            criteria.add(Expression.eq("e.id", entryid));
+            this.removeReferers(criteria.list());
+        } catch (HibernateException e) {
+            throw new RollerException(e);
+        }
+    }
+    
+    
+    /**
+     * Clear referrer dayhits and remove referrers without excerpts.
+     *
+     * TODO: do we really need dialect specific queries?
+     */
+    public void clearReferrers() throws RollerException {
+        
+        if (log.isDebugEnabled()) {
+            log.debug("clearReferrers");
+        }
+        try {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            Session session = ((HibernatePersistenceStrategy)strategy).getSession();
+            Dialect currentDialect = ((SessionFactoryImplementor)session.getSessionFactory()).getDialect();
+            String reset = "update RefererData set dayHits=0";
+            session.createQuery(reset).executeUpdate();
+            String delete = null;
+            if ( currentDialect instanceof SQLServerDialect || currentDialect instanceof OracleDialect ){
+                delete = "delete RefererData where excerpt is null or excerpt like ''";
+            } else {
+                delete = "delete RefererData where excerpt is null or excerpt=''";
+            }
+            session.createQuery(delete).executeUpdate();
+        } catch (Exception e) {
+            log.error("EXCEPTION resetting referers",e);
+        }
+    }
+    
+    
+    /**
+     * Clear referrer dayhits and remove referrers without excerpts.
+     *
+     * TODO: do we really need dialect specific queries?
+     */
+    public void clearReferrers(WebsiteData website) throws RollerException {
+        
+        if (log.isDebugEnabled()) {
+            log.debug("clearReferrers");
+        }
+        try {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            Session session = ((HibernatePersistenceStrategy)strategy).getSession();
+            Dialect currentDialect = ((SessionFactoryImplementor)session.getSessionFactory()).getDialect();
+            String reset = "update RefererData set dayHits=0 where website=:site";
+            session.createQuery(reset)
+            .setParameter("site",website).executeUpdate();
+            String delete = null;
+            if ( currentDialect instanceof SQLServerDialect || currentDialect instanceof OracleDialect ){
+                delete = "delete RefererData where website=:site and (excerpt is null or excerpt like '')";
+            } else {
+                delete = "delete RefererData where website=:site and (excerpt is null or excerpt='')";
+            }
+            session.createQuery(delete)
+            .setParameter("site",website).executeUpdate();
+        } catch (Exception e) {
+            log.error("EXCEPTION resetting referers",e);
+        }
+    }
+    
+    
     /**
      * Apply ignoreWord/spam filters to all referers in system.
      */
     public void applyRefererFilters() throws RollerException {
         try {
-            Session session = ((HibernateStrategy)mStrategy).getSession();
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            Session session = ((HibernatePersistenceStrategy)strategy).getSession();
             Criteria criteria = session.createCriteria(RefererData.class);
             
             String spamwords = RollerRuntimeConfig.getProperty("spam.blacklist");
@@ -82,16 +229,14 @@
             .add(or)
             );
             
-            Iterator referers = criteria.list().iterator();
-            while (referers.hasNext()) {
-                removeReferer( ((RefererData)referers.next()).getId() );
-            }
+            this.removeReferers(criteria.list());
+            
         } catch (HibernateException e) {
             throw new RollerException(e);
         }
     }
     
-    //-----------------------------------------------------------------------
+    
     /**
      * Apply ignoreWord/spam filters to all referers in website.
      */
@@ -100,7 +245,10 @@
         if (null == website.getBlacklist()) return;
         
         try {
-            Session session = ((HibernateStrategy)mStrategy).getSession();
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            Session session = ((HibernatePersistenceStrategy)strategy).getSession();
             Criteria criteria = session.createCriteria(RefererData.class);
             
             String[] blacklist = StringUtils.split(
@@ -118,62 +266,67 @@
             .add(or)
             );
             
-            Iterator referers = criteria.list().iterator();
-            while (referers.hasNext()) {
-                removeReferer( ((RefererData)referers.next()).getId() );
-            }
+            this.removeReferers(criteria.list());
         } 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 {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            Session session = ((HibernatePersistenceStrategy)strategy).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)));
+            
             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 {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            Session session = ((HibernatePersistenceStrategy)strategy).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)));
+            
             return criteria.list();
         } catch (HibernateException e) {
             throw new RollerException(e);
         }
     }
     
-    //-----------------------------------------------------------------------
     
     /**
      * Use raw SQL because Hibernate can't handle sorting by sum.
+     *
+     * TODO: do we really need raw sql?  can't hibernate do this?
      */
     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
@@ -181,7 +334,7 @@
         try {
             List list = new ArrayList();
             
-            ses = ((HibernateStrategy)mStrategy).getSession();
+            ses = ((HibernatePersistenceStrategy)strategy).getSession();
             con = ses.connection();
             
             final PreparedStatement stmt;
@@ -191,57 +344,57 @@
             if (currentDialect instanceof HSQLDialect) {
                 // special handling for HSQLDB
                 stmt = con.prepareStatement(
-                    "select top ? w.id, w.name, w.handle, sum(r.dayhits) as s "+
-                    "from website as w, referer as r "+
-                    "where r.websiteid=w.id and w.isenabled=? and w.isactive=? " +
-                    "group by w.name, w.handle, w.id order by s desc");
+                        "select top ? w.id, w.name, w.handle, sum(r.dayhits) as s "+
+                        "from website as w, referer as r "+
+                        "where r.websiteid=w.id and w.isenabled=? and w.isactive=? " +
+                        "group by w.name, w.handle, w.id order by s desc");
                 stmt.setInt(1, max);
                 stmt.setBoolean(2, true);
                 stmt.setBoolean(3, true);
             } else if(currentDialect instanceof DerbyDialect) {
-	           // special handling for Derby
-				stmt = con.prepareStatement(
-				    "select w.id, w.name, w.handle, sum(r.dayhits) as s "+
-				    "from website as w, referer as r "+
-				    "where r.websiteid=w.id and w.isenabled=? and w.isactive=? " +
-				    "group by w.name, w.handle, w.id order by s desc");                      
-				stmt.setBoolean(1, true);				
+                // special handling for Derby
+                stmt = con.prepareStatement(
+                        "select w.id, w.name, w.handle, sum(r.dayhits) as s "+
+                        "from website as w, referer as r "+
+                        "where r.websiteid=w.id and w.isenabled=? and w.isactive=? " +
+                        "group by w.name, w.handle, w.id order by s desc");
+                stmt.setBoolean(1, true);
                 stmt.setBoolean(2, true);
                 stmt.setMaxRows(max);
             } else if(currentDialect instanceof DB2Dialect) {
                 // special handling for IBM DB2
                 stmt = con.prepareStatement(
-                    "select w.id, w.name, w.handle, sum(r.dayhits) as s "+
-                    "from website as w, referer as r "+
-                    "where r.websiteid=w.id and w.isenabled=? and w.isactive=? " +
-                    "group by w.name, w.handle, w.id order by s desc fetch first " +
-                    Integer.toString(max) + " rows only");
+                        "select w.id, w.name, w.handle, sum(r.dayhits) as s "+
+                        "from website as w, referer as r "+
+                        "where r.websiteid=w.id and w.isenabled=? and w.isactive=? " +
+                        "group by w.name, w.handle, w.id order by s desc fetch first " +
+                        Integer.toString(max) + " rows only");
                 stmt.setBoolean(1, true);
                 stmt.setBoolean(2, true);
             } else if (currentDialect instanceof OracleDialect) {
-				stmt = con.prepareStatement(
-                    "select w.id, w.name, w.handle, sum(r.dayhits) as s "+
-                    "from website w, referer r "+
-                    "where r.websiteid=w.id and w.isenabled=? and w.isactive=? and rownum <= ? " +
-                    "group by w.name, w.handle, w.id order by s desc");
-				stmt.setBoolean(1, true);
-				stmt.setBoolean(2, true);
-				stmt.setInt(3, max );
+                stmt = con.prepareStatement(
+                        "select w.id, w.name, w.handle, sum(r.dayhits) as s "+
+                        "from website w, referer r "+
+                        "where r.websiteid=w.id and w.isenabled=? and w.isactive=? and rownum <= ? " +
+                        "group by w.name, w.handle, w.id order by s desc");
+                stmt.setBoolean(1, true);
+                stmt.setBoolean(2, true);
+                stmt.setInt(3, max );
             } else if (currentDialect instanceof SQLServerDialect) {
-            	stmt = con.prepareStatement("select top " + max + " w.id, w.name, w.handle, sum(r.dayhits) as s " +
-            	     "from website as w, referer as r where r.websiteid=w.id and w.isenabled=? and w.isactive=? " +
-            	     "group by w.name, w.handle, w.id order by s desc");
-            	stmt.setBoolean(1, true);
+                stmt = con.prepareStatement("select top " + max + " w.id, w.name, w.handle, sum(r.dayhits) as s " +
+                        "from website as w, referer as r where r.websiteid=w.id and w.isenabled=? and w.isactive=? " +
+                        "group by w.name, w.handle, w.id order by s desc");
+                stmt.setBoolean(1, true);
                 stmt.setBoolean(2, true);
             } else { // for MySQL and PostgreSQL
                 stmt = con.prepareStatement(
-                    "select w.id, w.name, w.handle, sum(r.dayhits) as s "+
-                    "from website as w, referer as r "+
-                    "where r.websiteid=w.id and w.isenabled= ? and w.isactive=? " +
-                    // 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 w.name, w.handle, w.id order by s desc limit ?");
+                        "select w.id, w.name, w.handle, sum(r.dayhits) as s "+
+                        "from website as w, referer as r "+
+                        "where r.websiteid=w.id and w.isenabled= ? and w.isactive=? " +
+                        // 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 w.name, w.handle, w.id order by s desc limit ?");
                 stmt.setBoolean(1, true);
                 stmt.setBoolean(2, true);
                 stmt.setInt(3, max);
@@ -260,38 +413,39 @@
                             websiteHandle,
                             hits));
                     if(list.size() >= max) {
-                    	rs.close();
-                    	break;
+                        rs.close();
+                        break;
                     }
                 }
                 while ( rs.next() );
             }
             return list;
         } catch (Throwable pe) {
-            mLogger.error(msg, pe);
+            log.error(msg, pe);
             throw new RollerException(msg, pe);
-        }        
+        }
     }
     
-    //-----------------------------------------------------------------------
     
     /**
      * Use raw SQL because Hibernate can't handle the query.
      */
-    protected int getHits(WebsiteData website, String type)
-    throws RollerException {
+    protected int getHits(WebsiteData website, String type) throws RollerException {
         int hits = 0;
-        if (mLogger.isDebugEnabled()) {
-            mLogger.debug("getHits: " + website.getName());
+        if (log.isDebugEnabled()) {
+            log.debug("getHits: " + website.getName());
         }
         
         Object[] args = { Boolean.TRUE, website.getId() };
         Type[] types = { Hibernate.BOOLEAN, Hibernate.STRING };
         
         // For a query like this, Hibernate returns a list of lists
-        Session session = ((HibernateStrategy)mStrategy).getSession();
+        Session session = ((HibernatePersistenceStrategy)strategy).getSession();
         List results;
         try {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
             Query q = session.createQuery(
                     "select sum(h.dayHits),sum(h.totalHits) from h in class " +
                     "org.roller.pojos.RefererData " +
@@ -318,6 +472,7 @@
         return hits;
     }
     
+    
     /**
      * @see org.roller.pojos.RefererManager#getReferers(java.lang.String)
      */
@@ -325,40 +480,45 @@
         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 {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            Session session = ((HibernatePersistenceStrategy)strategy).getSession();
+            Criteria criteria = session.createCriteria(RefererData.class);
+            criteria.add(Expression.eq("website",website));
+            criteria.addOrder(Order.desc("totalHits"));
+            
             return criteria.list();
         } catch (HibernateException e) {
             throw new RollerException(e);
         }
     }
-        
-    //-----------------------------------------------------------------------
+    
     
     /**
      * @see org.roller.pojos.RefererManager#getTodaysReferers(String)
      */
-    public List getTodaysReferers(WebsiteData website)
-    throws RollerException {
+    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 {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            Session session = ((HibernatePersistenceStrategy)strategy).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"));
+            
             return criteria.list();
         } catch (HibernateException e) {
             throw new RollerException(e);
         }
     }
     
-    //-----------------------------------------------------------------------
     
     /**
      * Returns referers for a specified day. Duplicate enties are not
@@ -367,27 +527,30 @@
      * org.roller.pojos.WebsiteData, java.lang.String)
      */
     public List getReferersToDate(WebsiteData website, String date)
-    throws RollerException {
+            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 {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            Session session = ((HibernatePersistenceStrategy)strategy).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"));
+            
             return criteria.list();
         } catch (HibernateException e) {
             throw new RollerException(e);
         }
     }
     
-    //-----------------------------------------------------------------------
     
     /**
      * @see org.roller.pojos.RefererManager#getReferersToEntry(
@@ -398,7 +561,10 @@
             throw new RollerException("entryid is null");
         
         try {
-            Session session = ((HibernateStrategy)mStrategy).getSession();
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            Session session = ((HibernatePersistenceStrategy)strategy).getSession();
             Criteria criteria = session.createCriteria(RefererData.class);
             criteria.createAlias("weblogEntry","e");
             
@@ -414,62 +580,42 @@
         }
     }
     
-    //-----------------------------------------------------------------------
     
     /**
-     * @see org.roller.pojos.RefererManager#getReferersToEntry(
-     * java.lang.String, java.lang.String)
+     * Query for collection of referers.
      */
-    public void removeReferersForEntry(String entryid) throws RollerException {
-        if (null == entryid)
-            throw new RollerException("entryid is null");
+    protected List getReferersToWebsite(WebsiteData website, String refererUrl)
+            throws RollerException {
         
         try {
-            Session session = ((HibernateStrategy)mStrategy).getSession();
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            Session session = ((HibernatePersistenceStrategy)strategy).getSession();
             Criteria criteria = session.createCriteria(RefererData.class);
-            criteria.createAlias("weblogEntry","e");
-            criteria.add(Expression.eq("e.id", entryid));
+            criteria.add(Expression.eq("website", website));
+            criteria.add(Expression.eq("refererUrl", refererUrl));
             
-            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)
+    protected List getReferersWithSameTitle(WebsiteData website,
+                                            String requestUrl,
+                                            String title,
+                                            String excerpt)
             throws RollerException {
         try {
-            Session session = ((HibernateStrategy)mStrategy).getSession();
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            Session session = ((HibernatePersistenceStrategy)strategy).getSession();
             Criteria criteria = session.createCriteria(RefererData.class);
             
             Junction conjunction = Expression.conjunction();
@@ -489,57 +635,308 @@
         }
     }
     
+    
+    public int getDayHits(WebsiteData website) throws RollerException {
+        return getHits(website, DAYHITS);
+    }
+    
+    
+    public int getTotalHits(WebsiteData website) throws RollerException {
+        return getHits(website, TOTALHITS);
+    }
+    
+    
     /**
-     * Clear referrer dayhits and remove referrers without excerpts.
+     * @see org.roller.pojos.RefererManager#retrieveReferer(java.lang.String)
      */
-    public void clearReferrers() throws RollerException {
-
-        if (mLogger.isDebugEnabled()) {
-            mLogger.debug("clearReferrers");
-        }       
+    public RefererData retrieveReferer(String id) throws RollerException {
+        return (RefererData)strategy.load(id,RefererData.class);
+    }
+    
+    
+    public List getEntryReferers(String entryId, boolean authorized)
+            throws RollerException {
+        //TODO: Redesign this so this is performed using the DB query, and
+        // not in java code for perf/memory reasons
+        List authorizedvisible = new ArrayList();
+        List referers = getReferersToEntry(entryId);
+        for (Iterator rItr = referers.iterator(); rItr.hasNext();) {
+            RefererData referer = (RefererData) rItr.next();
+            if ( referer.getVisible().booleanValue() || authorized ) {
+                authorizedvisible.add( referer );
+            }
+        }
+        
+        return authorizedvisible;
+    }
+    
+    
+    public void processReferrer(String requestUrl,
+                                String referrerUrl,
+                                String weblogHandle,
+                                String entryAnchor,
+                                String dateString) {
+        
+        log.debug("processing referrer ["+referrerUrl+
+                "] accessing ["+requestUrl+"]");
+        
+        if (weblogHandle == null)
+            return;
+        
+        String selfSiteFragment = "/page/"+weblogHandle;
+        WebsiteData weblog = null;
+        WeblogEntryData entry = null;
+        
+        // lookup the weblog now
         try {
-            Session session = ((HibernateStrategy)mStrategy).getSession();
-            Dialect currentDialect = ((SessionFactoryImplementor)session.getSessionFactory()).getDialect();
-            String reset = "update RefererData set dayHits=0";
-            session.createQuery(reset).executeUpdate();
-            String delete = null;
-            if ( currentDialect instanceof SQLServerDialect || currentDialect instanceof OracleDialect ){
-            	delete = "delete RefererData where excerpt is null or excerpt like ''";
+            UserManager userMgr = RollerFactory.getRoller().getUserManager();
+            weblog = userMgr.getWebsiteByHandle(weblogHandle);
+            if (weblog == null) return;
+            
+            // now lookup weblog entry if possible
+            if (entryAnchor != null) {
+                WeblogManager weblogMgr = RollerFactory.getRoller().getWeblogManager();
+                entry = weblogMgr.getWeblogEntryByAnchor(weblog, entryAnchor);
+            }
+        } catch (RollerException re) {
+            // problem looking up website, gotta bail
+            log.error("Error looking up website object", re);
+            return;
+        }
+        
+        try {
+            List matchRef = null;
+            
+            // try to find existing RefererData for referrerUrl
+            if (referrerUrl == null || referrerUrl.trim().length() < 8) {
+                referrerUrl = "direct";
+                
+                // Get referer specified by referer URL of direct
+                matchRef = getReferersToWebsite(weblog, referrerUrl);
             } else {
-            	delete = "delete RefererData where excerpt is null or excerpt=''";	
+                referrerUrl = Utilities.stripJsessionId(referrerUrl);
+                
+                // Query for referer with same referer and request URLs
+                matchRef = getMatchingReferers(weblog, requestUrl, referrerUrl);
+                
+                // If referer was not found, try adding or leaving off 'www'
+                if ( matchRef.size() == 0 ) {
+                    String secondTryUrl = null;
+                    if ( referrerUrl.startsWith("http://www") ) {
+                        secondTryUrl = "http://"+referrerUrl.substring(11);
+                    } else {
+                        secondTryUrl = "http://www"+referrerUrl.substring(7);
+                    }
+                    
+                    matchRef = getMatchingReferers(weblog, requestUrl, secondTryUrl);
+                    if ( matchRef.size() == 1 ) {
+                        referrerUrl = secondTryUrl;
+                    }
+                }
             }
-            session.createQuery(delete).executeUpdate();
-        } catch (Exception e) {
-            mLogger.error("EXCEPTION resetting referers",e);
+            
+            if (matchRef.size() == 1) {
+                // Referer was found in database, so bump up hit count
+                RefererData ref = (RefererData)matchRef.get(0);
+                
+                ref.setDayHits(new Integer(ref.getDayHits().intValue() + 1));
+                ref.setTotalHits(new Integer(ref.getTotalHits().intValue() + 1));
+                
+                log.debug("Incrementing hit count on existing referer: "+referrerUrl);
+                
+                storeReferer(ref);
+                
+            } else if (matchRef.size() == 0) {
+                
+                // Referer was not found in database, so new Referer object
+                Integer one = new Integer(1);
+                RefererData ref =
+                        new RefererData(
+                        null,
+                        weblog,
+                        entry,
+                        dateString,
+                        referrerUrl,
+                        null,
+                        requestUrl,
+                        null,
+                        "", // Read comment above regarding Derby bug
+                        Boolean.FALSE,
+                        Boolean.FALSE,
+                        one,
+                        one);
+                
+                if (log.isDebugEnabled()) {
+                    log.debug("newReferer="+ref.getRefererUrl());
+                }
+                
+                String refurl = ref.getRefererUrl();
+                
+                // If not a direct or search engine then search for linkback
+                boolean doLinkbackExtraction =
+                        RollerRuntimeConfig.getBooleanProperty("site.linkbacks.enabled");
+                if (doLinkbackExtraction
+                        && entry != null
+                        && !refurl.equals("direct")
+                        && !refurl.startsWith("http://google")
+                        && !refurl.startsWith("http://www.google")
+                        && !refurl.startsWith("http://search.netscape")
+                        && !refurl.startsWith("http://www.blinkpro")
+                        && !refurl.startsWith("http://search.msn")
+                        && !refurl.startsWith("http://search.yahoo")
+                        && !refurl.startsWith("http://uk.search.yahoo")
+                        && !refurl.startsWith("http://www.javablogs.com")
+                        && !refurl.startsWith("http://www.teoma")
+                        ) {
+                    // Launch thread to extract referer linkback
+                    
+                    try {
+                        Roller mRoller = RollerFactory.getRoller();
+                        mRoller.getThreadManager().executeInBackground(
+                                new LinkbackExtractorRunnable(ref));
+                    } catch (InterruptedException e) {
+                        log.warn("Interrupted during linkback extraction",e);
+                    }
+                } else {
+                    storeReferer(ref);
+                }
+            }
+        } catch (RollerException pe) {
+            log.error(pe);
+        } catch (NullPointerException npe) {
+            log.error(npe);
         }
-    }  
+    }
+    
     
     /**
-     * Clear referrer dayhits and remove referrers without excerpts.
-     */
-    public void clearReferrers(WebsiteData website) throws RollerException {
-
-        if (mLogger.isDebugEnabled()) {
-            mLogger.debug("clearReferrers");
-        }       
-        try {
-            Session session = ((HibernateStrategy)mStrategy).getSession();
-            Dialect currentDialect = ((SessionFactoryImplementor)session.getSessionFactory()).getDialect();
-            String reset = "update RefererData set dayHits=0 where website=:site";
-            session.createQuery(reset)
-                .setParameter("site",website).executeUpdate();
-            String delete = null;
-            if ( currentDialect instanceof SQLServerDialect || currentDialect instanceof OracleDialect ){
-            	delete = "delete RefererData where website=:site and (excerpt is null or excerpt like '')";
-            } else {
-            	delete = "delete RefererData where website=:site and (excerpt is null or excerpt='')";            	
+     * Use LinkbackExtractor to parse title and excerpt from referer
+     */
+    class LinkbackExtractorRunnable implements Runnable {
+        
+        private RefererData mReferer = null;
+        
+        public LinkbackExtractorRunnable( RefererData referer) {
+            mReferer = referer;
+        }
+        
+        public void run() {
+            
+            try {
+                LinkbackExtractor lb = new LinkbackExtractor(
+                        mReferer.getRefererUrl(),mReferer.getRequestUrl());
+                
+                if ( lb.getTitle()!=null && lb.getExcerpt()!=null ) {
+                    mReferer.setTitle(lb.getTitle());
+                    mReferer.setExcerpt(lb.getExcerpt());
+                    
+                    if ( lb.getPermalink() != null ) {
+                        // The presence of a permalink indicates that this
+                        // linkback was parsed out of an RSS feed and is
+                        // presumed to be a good linkback.
+                        
+                        mReferer.setRefererPermalink(lb.getPermalink());
+                        
+                        // See if this request/permalink is in the DB
+                        List matchRef = getExistingReferers(
+                                mReferer.getWebsite(),
+                                mReferer.getDateString(),
+                                mReferer.getRefererPermalink());
+                        
+                        // If it is the first, then set it to be visible
+                        if ( matchRef.size() == 0 ) {
+                            mReferer.setVisible(Boolean.TRUE);
+                        } else {
+                            // We can't throw away duplicates or we will
+                            // end up reparsing them everytime a hit comes
+                            // in from one of them, but we can mark them
+                            // as duplicates.
+                            mReferer.setDuplicate(Boolean.TRUE);
+                        }
+                        
+                        storeReferer(mReferer);
+                        
+                    }
+                    
+                    else {
+                        // Store the new referer
+                        storeReferer(mReferer);
+                        
+                        // Hacky Referer URL weighting kludge:
+                        //
+                        // If there are multple referers to a request URL,
+                        // then we want to pick the best one. The others
+                        // are marked as duplicates. To do this we use a
+                        // weight. The weight formula is:
+                        //
+                        // w = URL length + (100 if URL contains anchor)
+                        
+                        // LOOP: find the referer with the highest weight
+                        Boolean visible = Boolean.FALSE;
+                        List refs= getReferersWithSameTitle(
+                                mReferer.getWebsite(),
+                                mReferer.getRequestUrl(),
+                                lb.getTitle(),
+                                lb.getExcerpt());
+                        RefererData chosen = null;
+                        int maxweight = 0;
+                        for (Iterator rdItr = refs.iterator();rdItr.hasNext();) {
+                            RefererData referer = (RefererData) rdItr.next();
+                            
+                            int weight = referer.getRefererUrl().length();
+                            if (referer.getRefererUrl().indexOf('#') != -1) {
+                                weight += 100;
+                            }
+                            
+                            if ( weight > maxweight ) {
+                                chosen = referer;
+                                maxweight = weight;
+                            }
+                            
+                            if (referer.getVisible().booleanValue()) {
+                                // If any are visible then chosen
+                                // replacement must be visible as well.
+                                visible = Boolean.TRUE;
+                            }
+                            
+                        }
+                        
+                        // LOOP: to mark all of the lower weight ones
+                        // as duplicates
+                        for (Iterator rdItr = refs.iterator();rdItr.hasNext();) {
+                            RefererData referer = (RefererData) rdItr.next();
+                            
+                            if (referer != chosen) {
+                                referer.setDuplicate(Boolean.TRUE);
+                            } else {
+                                referer.setDuplicate(Boolean.FALSE);
+                                referer.setVisible(visible);
+                            }
+                            storeReferer(referer);
+                        }
+                        
+                        
+                    }
+                } else {
+                    // It is not a linkback, but store it anyway
+                    storeReferer(mReferer);
+                    
+                    log.info("No excerpt found at refering URL "
+                            + mReferer.getRefererUrl());
+                }
+            } catch (Exception e) {
+                log.error("Processing linkback",e);
+            } finally {
+                strategy.release();
             }
-            session.createQuery(delete)
-                .setParameter("site",website).executeUpdate();
-        } catch (Exception e) {
-            mLogger.error("EXCEPTION resetting referers",e);
+            
         }
-    }  
+        
+    }
+    
+    
+    public void release() {}
+    
 }
 
 

Modified: incubator/roller/branches/roller-newbackend/src/org/roller/business/hibernate/HibernateRollerImpl.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller-newbackend/src/org/roller/business/hibernate/HibernateRollerImpl.java?rev=392618&r1=392617&r2=392618&view=diff
==============================================================================
--- incubator/roller/branches/roller-newbackend/src/org/roller/business/hibernate/HibernateRollerImpl.java (original)
+++ incubator/roller/branches/roller-newbackend/src/org/roller/business/hibernate/HibernateRollerImpl.java Sat Apr  8 15:36:25 2006
@@ -3,14 +3,10 @@
  */
 package org.roller.business.hibernate;
 
-import org.hibernate.HibernateException;
-import org.hibernate.SessionFactory;
-import org.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.business.RollerImpl;
 import org.roller.model.BookmarkManager;
 import org.roller.model.ConfigManager;
 import org.roller.model.AutoPingManager;
@@ -22,66 +18,51 @@
 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
+ * A Hibernate specific implementation of the Roller business layer.
  */
-public class HibernateRollerImpl extends org.roller.business.RollerImpl
-{
+public class HibernateRollerImpl extends 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);
+    private static Log mLogger = LogFactory.getLog(HibernateRollerImpl.class);
+    
+    // our singleton instance
+    private static HibernateRollerImpl me = null;
+    
+    // a persistence utility class
+    private HibernatePersistenceStrategy strategy = null;
+    
+    // references to the managers we maintain
+    private BookmarkManager bookmarkManager = null;
+    private ConfigManager configManager = null;
+    private PropertiesManager propertiesManager = null;
+    private PlanetManager planetManager = null;
+    private RefererManager refererManager = null;
+    private UserManager userManager = null;
+    private WeblogManager weblogManager = null;
+    private PingQueueManager pingQueueManager = null;
+    private AutoPingManager autoPingManager = null;
+    private PingTargetManager pingTargetManager = null;
+    
+    
+    protected HibernateRollerImpl() throws RollerException {
+        try {
+            strategy = new HibernatePersistenceStrategy();
+        } catch(Throwable t) {
+            // if this happens then we are screwed
+            throw new RollerException(t);
         }
-        
-        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) 
-        {
+    public static Roller instantiate() throws RollerException {
+        if (me == null) {
             mLogger.debug("Instantiating HibernateRollerImpl");
             me = new HibernateRollerImpl();
         }
@@ -89,219 +70,145 @@
         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 {
+        //strategy.commit();
     }
     
-    public void commit() throws RollerException
-    {
-        mStrategy.commit();
-    }
     
-	public void rollback()
-	{
-		try
-		{
-			mStrategy.rollback();
-		}
-		catch (Throwable e)
-		{
-			mLogger.error(e);
-		}
-	}
-
-    /** 
+    /**
      * @see org.roller.model.Roller#getUserManager()
      */
-    public UserManager getUserManager() throws RollerException
-    {
-        if ( mUserManager == null ) 
-        {
-            mUserManager = new HibernateUserManagerImpl(mStrategy);
+    public UserManager getUserManager() throws RollerException {
+        if ( userManager == null ) {
+            userManager = new HibernateUserManagerImpl(strategy);
         }
-        return mUserManager;
+        return userManager;
     }
-
-    /** 
+    
+    /**
      * @see org.roller.model.Roller#getBookmarkManager()
      */
-    public BookmarkManager getBookmarkManager() throws RollerException
-    {
-        if ( mBookmarkManager == null ) 
-        {
-            mBookmarkManager = new HibernateBookmarkManagerImpl(mStrategy);
+    public BookmarkManager getBookmarkManager() throws RollerException {
+        if ( bookmarkManager == null ) {
+            bookmarkManager = new HibernateBookmarkManagerImpl(strategy);
         }
-        return mBookmarkManager;
+        return bookmarkManager;
     }
-
-    /** 
+    
+    /**
      * @see org.roller.model.Roller#getWeblogManager()
      */
-    public WeblogManager getWeblogManager() throws RollerException
-    {
-        if ( mWeblogManager == null ) 
-        {
-            mWeblogManager = new HibernateWeblogManagerImpl(mStrategy);
+    public WeblogManager getWeblogManager() throws RollerException {
+        if ( weblogManager == null ) {
+            weblogManager = new HibernateWeblogManagerImpl(strategy);
         }
-        return mWeblogManager;
+        return weblogManager;
     }
-
-    /** 
+    
+    /**
      * @see org.roller.model.Roller#getRefererManager()
      */
-    public RefererManager getRefererManager() throws RollerException
-    {
-        if ( mRefererManager == null ) 
-        {
-            mRefererManager = new HibernateRefererManagerImpl(mStrategy);
+    public RefererManager getRefererManager() throws RollerException {
+        if ( refererManager == null ) {
+            refererManager = new HibernateRefererManagerImpl(strategy);
         }
-        return mRefererManager;
+        return refererManager;
     }
-
+    
     /**
      * @see org.roller.model.Roller#getConfigManager()
      */
-    public ConfigManager getConfigManager() throws RollerException 
-    {
-        if (mConfigManager == null)
-        {
-            mConfigManager = new HibernateConfigManagerImpl(mStrategy);
+    public ConfigManager getConfigManager() throws RollerException {
+        if (configManager == null) {
+            configManager = new HibernateConfigManagerImpl(strategy);
         }
-        return mConfigManager;
+        return configManager;
     }
     
     /**
      * @see org.roller.model.Roller#getPropertiesManager()
      */
-    public PropertiesManager getPropertiesManager() throws RollerException 
-    {
-        if (mPropsManager == null)
-        {
-            mPropsManager = new HibernatePropertiesManagerImpl(mStrategy);
+    public PropertiesManager getPropertiesManager() throws RollerException {
+        if (propertiesManager == null) {
+            propertiesManager = new HibernatePropertiesManagerImpl(strategy);
         }
-        return mPropsManager;
+        return propertiesManager;
     }
-
+    
     /**
      * @see org.roller.model.Roller#getPingTargetManager()
      */
-    public PingQueueManager getPingQueueManager() throws RollerException
-    {
-        if (mPingQueueManager == null)
-        {
-            mPingQueueManager = new HibernatePingQueueManagerImpl(mStrategy);
+    public PingQueueManager getPingQueueManager() throws RollerException {
+        if (pingQueueManager == null) {
+            pingQueueManager = new HibernatePingQueueManagerImpl(strategy);
         }
-        return mPingQueueManager;
+        return pingQueueManager;
     }
-
+    
     /**
      * @see org.roller.model.Roller#getPlanetManager()
      */
-    public PlanetManager getPlanetManager() throws RollerException
-    {
-        if ( planetManager == null ) 
-        {
-            planetManager = new HibernatePlanetManagerImpl(mStrategy,this);
+    public PlanetManager getPlanetManager() throws RollerException {
+        if ( planetManager == null ) {
+            planetManager = new HibernatePlanetManagerImpl(strategy,this);
         }
         return planetManager;
     }
-
-
+    
+    
     /**
      * @see org.roller.model.Roller#getPingTargetManager()
      */
-    public AutoPingManager getAutopingManager() throws RollerException
-    {
-        if (mAutoPingManager == null)
-        {
-            mAutoPingManager = new HibernateAutoPingManagerImpl(mStrategy);
+    public AutoPingManager getAutopingManager() throws RollerException {
+        if (autoPingManager == null) {
+            autoPingManager = new HibernateAutoPingManagerImpl(strategy);
         }
-        return mAutoPingManager;
+        return autoPingManager;
     }
-
-
+    
+    
     /**
      * @see org.roller.model.Roller#getPingTargetManager()
      */
-    public PingTargetManager getPingTargetManager() throws RollerException
-    {
-        if (mPingTargetManager == null)
-        {
-            mPingTargetManager = new HibernatePingTargetManagerImpl(mStrategy);
+    public PingTargetManager getPingTargetManager() throws RollerException {
+        if (pingTargetManager == null) {
+            pingTargetManager = new HibernatePingTargetManagerImpl(strategy);
         }
-        return mPingTargetManager;
-    }
-
-
-    /**
-     * @see org.roller.model.Roller#getPersistenceStrategy()
-     */
-    public PersistenceStrategy getPersistenceStrategy()
-    {
-        return mStrategy;
+        return pingTargetManager;
     }
     
-    /** 
-     * @see org.roller.model.Roller#upgradeDatabase(java.sql.Connection)
-     */
-    public void upgradeDatabase(Connection con) throws RollerException
-    {
-        UpgradeDatabase.upgradeDatabase(con); 
-    }
-
-    public void release()
-    {
-        super.release();
+    
+    public void 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();
+        // release our own stuff first
+        if (bookmarkManager != null) bookmarkManager.release();
+        if (configManager != null) configManager.release();
+        if (refererManager != null) refererManager.release();
+        if (userManager != null) userManager.release();
+        if (weblogManager != null) weblogManager.release();
+        if (pingTargetManager != null) pingTargetManager.release();
+        if (pingQueueManager != null) pingQueueManager.release();
+        if (autoPingManager != null) autoPingManager.release();
         
-        try
-        {
-            if (mStrategy != null) mStrategy.release(); 
-        }
-        catch (Throwable e)
-        {
-            mLogger.error(
-            "Exception with mSupport.release() [" + e + "]", e);
+        try {
+            if (strategy != null) strategy.release();
+        } catch (Throwable e) {
+            mLogger.error("Error calling Roller.release()", e);
         }
+        
+        // then let parent do its thing
+        super.release();
     }
-
-    public void shutdown()
-    {
-        super.shutdown();
+    
+    
+    public void shutdown() {
         
-        try
-        {
-            release();
-            mSessionFactory.close();
-        }
-        catch (HibernateException e)
-        {
-            mLogger.error("Unable to close SessionFactory", e);
-        }
+        // do our own shutdown first
+        this.release();
+        
+        // then let parent do its thing
+        super.shutdown();
     }
+    
 }