hibernatereferermanagerimpl.java

来自「这个weblogging 设计得比较精巧」· Java 代码 · 共 595 行 · 第 1/2 页

JAVA
595
字号
/* * Created on Feb 23, 2003 */package org.roller.business.hibernate;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.ArrayList;import java.util.Date;import java.util.Iterator;import java.util.List;import net.sf.hibernate.Criteria;import net.sf.hibernate.Hibernate;import net.sf.hibernate.HibernateException;import net.sf.hibernate.Session;import net.sf.hibernate.expression.Expression;import net.sf.hibernate.expression.Junction;import net.sf.hibernate.expression.Order;import net.sf.hibernate.type.Type;import org.apache.commons.lang.StringUtils;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.roller.RollerException;import org.roller.business.PersistenceStrategy;import org.roller.business.RefererManagerImpl;import org.roller.config.RollerRuntimeConfig;import org.roller.model.RefererManager;import org.roller.pojos.RefererData;import org.roller.pojos.WebsiteData;import org.roller.pojos.WebsiteDisplayData;/** * Hibernate queries. * @author David M Johnson */public class HibernateRefererManagerImpl extends RefererManagerImpl    implements RefererManager{    static final long serialVersionUID = -4966091850482256435L;        private static Log mLogger =         LogFactory.getFactory().getInstance(HibernateRefererManagerImpl.class);    //-------------------------------------------------- Startup and Shutdown    public HibernateRefererManagerImpl(PersistenceStrategy support)        throws RollerException	{        super();		mStrategy = (HibernateStrategy)support;                mLogger.debug("Instantiating Referer Manager");	}    //-----------------------------------------------------------------------    /**     * Apply ignoreWord/spam filters to all referers in system.     */    public void applyRefererFilters() throws RollerException    {        try        {            Session session = ((HibernateStrategy)mStrategy).getSession();            Criteria criteria = session.createCriteria(RefererData.class);                        String spamwords = RollerRuntimeConfig.getProperty("spam.referers.ignorewords");                        String[] ignoreWords = StringUtils.split(                StringUtils.deleteWhitespace(spamwords),",");            Junction or = Expression.disjunction();                      for (int i=0; i<ignoreWords.length; i++)             {                String ignoreWord = ignoreWords[i].trim();                or.add(Expression.ilike("refererUrl","%"+ignoreWord+"%"));            }            criteria.add(Expression.conjunction()                .add(Expression.isNull("excerpt"))                .add(or)            );                        Iterator referers = criteria.list().iterator();            while (referers.hasNext())            {                removeReferer( ((RefererData)referers.next()).getId() );            }        }        catch (HibernateException e)        {            throw new RollerException(e);        }    }    //-----------------------------------------------------------------------    /**     * Apply ignoreWord/spam filters to all referers in website.     */    public void applyRefererFilters(WebsiteData website) throws RollerException    {        if (null == website) throw new RollerException("website is null");        if (null == website.getIgnoreWords()) return;        try        {            Session session = ((HibernateStrategy)mStrategy).getSession();            Criteria criteria = session.createCriteria(RefererData.class);                        String[] ignoreWords = StringUtils.split(                StringUtils.deleteWhitespace(website.getIgnoreWords()),",");            if (ignoreWords.length == 0) return;                        Junction or = Expression.disjunction();                      for (int i=0; i<ignoreWords.length; i++)             {                String ignoreWord = ignoreWords[i].trim();                or.add(Expression.ilike("refererUrl","%"+ignoreWord+"%"));            }            criteria.add(Expression.conjunction()                .add(Expression.isNull("excerpt"))                .add(Expression.eq("website",website))                .add(or)            );                        Iterator referers = criteria.list().iterator();            while (referers.hasNext())            {                removeReferer( ((RefererData)referers.next()).getId() );            }        }        catch (HibernateException e)        {            throw new RollerException(e);        }    }    //-----------------------------------------------------------------------    /**      * Use Hibernate directly because Roller's Query API does too much allocation.     */    protected List getExistingReferers(WebsiteData website, String dateString,                    String permalink) throws RollerException    {        Session session = ((HibernateStrategy)mStrategy).getSession();        Criteria criteria = session.createCriteria(RefererData.class);        criteria.add(Expression.conjunction()                        .add(Expression.eq("website",website))                        .add(Expression.eq("dateString",dateString))                        .add(Expression.eq("refererPermalink",permalink)));        try        {            return criteria.list();        }        catch (HibernateException e)        {            throw new RollerException(e);        }    }        //-----------------------------------------------------------------------    /**      * Use Hibernate directly because Roller's Query API does too much allocation.     */    protected List getMatchingReferers(WebsiteData website, String requestUrl,                    String refererUrl) throws RollerException    {        Session session = ((HibernateStrategy)mStrategy).getSession();        Criteria criteria = session.createCriteria(RefererData.class);        criteria.add(Expression.conjunction()                        .add(Expression.eq("website",website))                        .add(Expression.eq("requestUrl",requestUrl))                        .add(Expression.eq("refererUrl",refererUrl)));        try        {            return criteria.list();        }        catch (HibernateException e)        {            throw new RollerException(e);        }    }        //-----------------------------------------------------------------------    /**     * Use raw SQL because Hibernate can't handle sorting by sum.     */    public List getDaysPopularWebsites(int max) throws RollerException    {        // TODO Hibernate version of getDaysPopularWebsites        // TODO Move to full use of mSupport        String msg = "Getting popular websites";        Session ses = null; // the session will eventually be release by RequestFilter        Connection con = null;        try        {            List list = new ArrayList();            ses = ((HibernateStrategy)mStrategy).getSession();            con = ses.connection();            final PreparedStatement stmt;            if (con.getMetaData().getDriverName().startsWith("HSQL"))            {            		// special handling for HSQLDB                stmt = con.prepareStatement(                        "select top ? u.username,w.name,w.name,sum(r.dayhits) as s "+                        "from rolleruser as u, website as w, referer as r "+                        "where r.websiteid=w.id and w.userid=u.id and w.isenabled=? " +                        "group by u.username,w.name,w.id order by s desc");                stmt.setInt(1, max);                stmt.setBoolean(2, true);            }            else             {               stmt = con.prepareStatement(                    "select u.username,w.name,w.name,sum(r.dayhits) as s "+                    "from rolleruser as u, website as w, referer as r "+                    "where r.websiteid=w.id and w.userid=u.id and w.isenabled= ? " +                    // Ben Walding (a Postgres SQL user): Basically, you have                    // to have all non-aggregated columns that exist in your                    // 'SELECT' section, in the 'GROUP BY' section as well:                    "group by u.username,w.name,w.id order by s desc limit ?");                    // and not this: "group by w.id order by s desc");                stmt.setBoolean(1, true);                stmt.setInt(2, max);            }            ResultSet rs = stmt.executeQuery();            if ( rs.next() )            {                do                {                    String userName = rs.getString(1);                    String name = rs.getString(2);                    String websiteName = rs.getString(3);                    Integer hits = new Integer(rs.getInt(4));                    list.add(new WebsiteDisplayData(                       name,                        userName,                        websiteName,                        hits));                }                while ( rs.next() );            }            return list;        }        catch (Throwable pe)        {            mLogger.error(msg, pe);            throw new RollerException(msg, pe);        }        // Don't close connection, Hibernate is holding it//        finally //        {//            try //            {//                if (con != null) con.close();//            }//            catch (Throwable t)//            {//                mLogger.error("Closing connection",t);//            }//        }            }        //-----------------------------------------------------------------------    /**     * Use raw SQL because Hibernate can't handle the query.     */    protected int getHits(WebsiteData website, String type)        throws RollerException    {        int hits = 0;        if (mLogger.isDebugEnabled())        {            mLogger.debug("getHits: " + website.getName());        }        //Question: why not use website.id instead to reduce joins?        Object[] args = { Boolean.TRUE, website.getUser().getUserName() };        Type[] types = { Hibernate.BOOLEAN, Hibernate.STRING };        // For a query like this, Hibernate returns a list of lists        Session session = ((HibernateStrategy)mStrategy).getSession();        List results;        try        {            results = session.find(               "select sum(h.dayHits),sum(h.totalHits) from h in class " +               "org.roller.pojos.RefererData " +               "where h.website.isEnabled=? and h.website.user.userName=? ",               args, types);        }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?