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();
}
+
}