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 [4/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/HibernateUserManagerImpl.java
URL: http://svn.apache.org/viewcvs/incubator/roller/branches/roller-newbackend/src/org/roller/business/hibernate/HibernateUserManagerImpl.java?rev=392618&r1=392617&r2=392618&view=diff
==============================================================================
--- incubator/roller/branches/roller-newbackend/src/org/roller/business/hibernate/HibernateUserManagerImpl.java (original)
+++ incubator/roller/branches/roller-newbackend/src/org/roller/business/hibernate/HibernateUserManagerImpl.java Sat Apr  8 15:36:25 2006
@@ -4,28 +4,30 @@
 package org.roller.business.hibernate;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
-
+import java.util.Map;
 import org.hibernate.Criteria;
 import org.hibernate.HibernateException;
 import org.hibernate.Session;
 import org.hibernate.criterion.Expression;
 import org.hibernate.criterion.MatchMode;
 import org.hibernate.criterion.Order;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.hibernate.criterion.SimpleExpression;
 import org.roller.RollerException;
-import org.roller.business.PersistenceStrategy;
-import org.roller.business.UserManagerImpl;
+import org.roller.config.RollerConfig;
 import org.roller.model.AutoPingManager;
 import org.roller.model.BookmarkManager;
 import org.roller.model.PingQueueManager;
 import org.roller.model.PingTargetManager;
+import org.roller.model.Roller;
 import org.roller.model.RollerFactory;
+import org.roller.model.UserManager;
 import org.roller.model.WeblogManager;
+import org.roller.pojos.BookmarkData;
 import org.roller.pojos.FolderData;
 import org.roller.pojos.WeblogTemplate;
 import org.roller.pojos.PermissionsData;
@@ -35,502 +37,902 @@
 import org.roller.pojos.WeblogCategoryData;
 import org.roller.pojos.WeblogEntryData;
 import org.roller.pojos.WebsiteData;
+import org.roller.util.Utilities;
+
 
 /**
- * Hibernate queries.
- * @author David M Johnson
+ * Hibernate implementation of the UserManager.
  */
-public class HibernateUserManagerImpl extends UserManagerImpl
-{
+public class HibernateUserManagerImpl implements UserManager {
+    
     static final long serialVersionUID = -5128460637997081121L;
     
-    private static Log mLogger =
-        LogFactory.getFactory().getInstance(HibernateUserManagerImpl.class);
-        
-    /** Doesn't seem to be any other way to get ignore case w/o QBE */
-    class IgnoreCaseEqExpression extends SimpleExpression {
-        public IgnoreCaseEqExpression(String property, Object value) {
-            super(property, value, "=", true);
-        }
-    }
+    private static Log log = LogFactory.getLog(HibernateUserManagerImpl.class);
+    
+    private HibernatePersistenceStrategy strategy = null;
+    
     
     /**
      * @param strategy
      */
-    public HibernateUserManagerImpl(PersistenceStrategy strategy)
-    {
-        super(strategy);
-        mLogger.debug("Instantiating User Manager");
+    public HibernateUserManagerImpl(HibernatePersistenceStrategy strat) {
+        log.debug("Instantiating Hibernate User Manager");
+        
+        this.strategy = strat;
     }
     
-    /**
-     * Get websites of a user
+    
+       /**
+     * @see org.roller.model.UserManager#storeWebsite(org.roller.pojos.WebsiteData)
      */
-    public List getWebsites(UserData user, Boolean enabled, Boolean active)  throws RollerException
-    {
-        try
-        {
-            Session session = ((HibernateStrategy)mStrategy).getSession();
-            Criteria criteria = session.createCriteria(WebsiteData.class);
-            if (user != null) 
-            {
-                criteria.createAlias("permissions","permissions");
-                criteria.add(Expression.eq("permissions.user", user));
-                criteria.add(Expression.eq("permissions.pending", Boolean.FALSE));
+    public void storeWebsite(WebsiteData data) throws RollerException {
+        this.strategy.storeAndCommit(data);
+    }
+    
+    
+    public void removeWebsite(String id) throws RollerException {
+        
+        try {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            // load the weblog first
+            WebsiteData weblog = (WebsiteData) this.strategy.load(id, WebsiteData.class);
+            
+            // remove contents first, then remove website
+            this.removeWebsiteContents(weblog);
+            this.strategy.remove(weblog);
+            
+            // commit changes
+            this.strategy.getSession().getTransaction().commit();
+        } catch (Exception ex) {
+            
+            try {
+                this.strategy.getSession().getTransaction().rollback();
+            } catch(HibernateException he) {
+                log.error("Error doing rollback", he);
             }
-            if (enabled != null)
-            {
-                criteria.add(Expression.eq("enabled", enabled));
+            
+            strategy.release();
+            
+            throw new RollerException(ex);
+        }
+    }
+    
+    
+    public void removeWebsite(WebsiteData weblog) throws RollerException {
+        
+        try {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            // remove contents first, then remove website
+            this.removeWebsiteContents(weblog);
+            this.strategy.remove(weblog);
+            
+            // commit changes
+            this.strategy.getSession().getTransaction().commit();
+        } catch (Exception ex) {
+            
+            try {
+                this.strategy.getSession().getTransaction().rollback();
+            } catch(HibernateException he) {
+                log.error("Error doing rollback", he);
             }
-            if (active != null)
-            {
-                criteria.add(Expression.eq("active", active));
+            
+            strategy.release();
+            
+            throw new RollerException(ex);
+        }
+    }
+    
+    
+    /**
+     * convenience method for removing contents of a weblog.
+     *
+     * TODO: we may be able to do this faster using Hibernate delete statements.
+     */
+    private void removeWebsiteContents(WebsiteData website) 
+            throws HibernateException, RollerException {
+        
+        Session session = this.strategy.getSession();
+        
+        BookmarkManager bmgr = RollerFactory.getRoller().getBookmarkManager();
+        WeblogManager wmgr = RollerFactory.getRoller().getWeblogManager();
+        
+//        // TODO: backend refactoring, tidy up ping removals
+//        // Remove the website's ping queue entries
+//        PingQueueManager pingQueueMgr = RollerFactory.getRoller().getPingQueueManager();
+//        pingQueueMgr.removeQueueEntriesByWebsite(website);
+//        
+//        // Remove the website's custom ping targets
+//        PingTargetManager pingTargetMgr = RollerFactory.getRoller().getPingTargetManager();
+//        pingTargetMgr.removeCustomPingTargets(website);
+//        
+//        // Remove the website's auto ping configurations
+//        AutoPingManager autoPingMgr = RollerFactory.getRoller().getAutopingManager();
+//        List autopings = autoPingMgr.getAutoPingsByWebsite(website);
+//        autoPingMgr.removeAutoPings(autopings);
+        
+//        // remove entries
+//        Criteria entryQuery = session.createCriteria(WeblogEntryData.class);
+//        entryQuery.add(Expression.eq("website", website));
+//        List entries = entryQuery.list();
+//        for (Iterator iter = entries.iterator(); iter.hasNext();) {
+//            WeblogEntryData entry = (WeblogEntryData) iter.next();
+//            
+//            this.strategy.remove(entry);
+//        }
+//        
+//        // remove associated pages
+//        Criteria pageQuery = session.createCriteria(WeblogTemplate.class);
+//        pageQuery.add(Expression.eq("website", website));
+//        List pages = pageQuery.list();
+//        for (Iterator iter = pages.iterator(); iter.hasNext();) {
+//            WeblogTemplate page = (WeblogTemplate) iter.next();
+//            this.strategy.remove(page);
+//        }
+//        
+//        // remove associated referers
+//        Criteria refererQuery = session.createCriteria(RefererData.class);
+//        refererQuery.add(Expression.eq("website", website));
+//        List referers = refererQuery.list();
+//        for (Iterator iter = referers.iterator(); iter.hasNext();) {
+//            RefererData referer = (RefererData) iter.next();
+//            this.strategy.remove(referer);
+//        }
+        
+        // remove folders (including bookmarks)
+        FolderData rootFolder = bmgr.getRootFolder(website);
+        if (null != rootFolder) {
+            this.strategy.remove(rootFolder);
+            
+            // Still cannot get all Bookmarks cleared!
+            Iterator allFolders = bmgr.getAllFolders(website).iterator();
+            while (allFolders.hasNext()) {
+                FolderData aFolder = (FolderData)allFolders.next();
+                // TODO: backend refactoring, how do we do this?
+                bmgr.deleteFolderContents(aFolder);
+                this.strategy.remove(aFolder);
             }
-            return criteria.list();
         }
-        catch (HibernateException e)
-        {
-            throw new RollerException(e);
+        
+        // remove categories
+        WeblogCategoryData rootCat = wmgr.getRootWeblogCategory(website);
+        if (null != rootCat) {
+            this.strategy.remove(rootCat);
         }
+        
+    }
+    
+    
+    public void storeUser(UserData data) throws RollerException {
+        this.strategy.storeAndCommit(data);
     }
     
+    
+    public void removeUser(UserData user) throws RollerException {
+        this.strategy.removeAndCommit(user);
+    }
+    
+    
+    public void removeUser(String id) throws RollerException {
+        this.strategy.removeAndCommit(id,UserData.class);
+    }
+    
+    
+    public void storePermissions(PermissionsData perms) throws RollerException {
+        this.strategy.storeAndCommit(perms);
+    }
+    
+    
+    public void removePermissions(PermissionsData perms) throws RollerException {
+        this.strategy.removeAndCommit(perms);
+    }
+    
+    
     /**
-     * Get users of a website
+     * @see org.roller.model.UserManager#storePage(org.roller.pojos.WeblogTemplate)
      */
-    public List getUsers(WebsiteData website, Boolean enabled) 
-        throws RollerException
-    {
-        try
-        {
-            Session session = ((HibernateStrategy)mStrategy).getSession();
-            Criteria criteria = session.createCriteria(UserData.class);
-            if (website != null) 
-            {
-                criteria.createAlias("permissions","permissions");
-                criteria.add(Expression.eq("permissions.website", website));
+    public void storePage(WeblogTemplate data) throws RollerException {
+        this.strategy.storeAndCommit(data);
+    }
+    
+    
+    public void removePage(String id) throws RollerException {
+        this.strategy.removeAndCommit(id,WeblogTemplate.class);
+    }
+    
+    
+    // TODO: EOL this method, logic about safe pages goes outside the persistence layer
+    public void removePageSafely(String id) throws RollerException {
+        
+        // TODO: rewrite using page.isRequired()
+        WeblogTemplate pd = retrievePageReadOnly(id);
+        if (pd == null) return;
+        
+        WebsiteData wd = pd.getWebsite();
+        if (pd.getId() == wd.getDefaultPageId()) {
+            log.error(
+                    "Refusing to remove default page from website with handle: "
+                    +  wd.getHandle());
+            throw new RollerException(
+                    new IllegalArgumentException("Page is default page of website."));
+        }
+        removePage(id);
+    }
+    
+    
+    /**
+     * TODO: EOL this method?  doesn't seem to be used
+     */
+    public String fixPageLink(WeblogTemplate data) throws RollerException {
+        String link = Utilities.removeHTML(data.getName());
+        link = Utilities.removeNonAlphanumeric(link);
+        
+        data.setLink(link);
+        this.strategy.storeAndCommit(data);
+        
+        return link;
+    }
+    
+    
+    /**
+     * Add a new Roller user.
+     *
+     * TODO: do we really need this method?  probably better if roles are added
+     *       elsewhere and then we just use storeUser().
+     */
+    public void addUser(UserData ud) throws RollerException {
+        
+        if(getUser(ud.getUserName()) != null || 
+                getUser(ud.getUserName().toLowerCase()) != null) {
+            throw new RollerException("error.add.user.userNameInUse");
+        }
+        
+        // TODO: we must do this in a better fashion, like getUserCnt()?
+        boolean adminUser = false;
+        List users = this.getUsers();
+        if (users.size() == 0) {
+            // Make first user an admin
+            adminUser = true;
+        }
+        
+        try {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            // add user
+            this.strategy.store(ud);
+            
+            // and roles
+            RoleData editorRole = new RoleData(null, ud, "editor");
+            this.strategy.store(editorRole);
+            
+            if (adminUser) {
+                RoleData adminRole = new RoleData(null, ud, "admin");
+                this.strategy.store(adminRole);
             }
-            if (enabled != null)
-            {
-                criteria.add(Expression.eq("enabled", enabled));
+
+            // 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);
             }
-            return criteria.list();
+            
+            strategy.release();
+            
+            throw new RollerException(ex);
         }
-        catch (HibernateException e)
-        {
-            throw new RollerException(e);
+        
+    }
+    
+    
+    public void createWebsite(WebsiteData newWebsite) throws RollerException {
+        
+        UserManager umgr = RollerFactory.getRoller().getUserManager();
+        WeblogManager wmgr = RollerFactory.getRoller().getWeblogManager();
+        
+        try {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            // store the new weblog
+            this.strategy.store(newWebsite);
+            
+            // grant weblog creator ADMIN permissions
+            PermissionsData perms = new PermissionsData();
+            perms.setUser(newWebsite.getCreator());
+            perms.setWebsite(newWebsite);
+            perms.setPending(false);
+            perms.setPermissionMask(PermissionsData.ADMIN);
+            this.strategy.store(perms);
+            
+            // add default categories
+            WeblogCategoryData rootCat = wmgr.createWeblogCategory(
+                    newWebsite, // newWebsite
+                    null,   // parent
+                    "root",  // name
+                    "root",  // description
+                    null ); // image
+            this.strategy.store(rootCat);
+            
+            String cats = RollerConfig.getProperty("newuser.categories");
+            if (cats != null) {
+                String[] splitcats = cats.split(",");
+                for (int i=0; i<splitcats.length; i++) {
+                    WeblogCategoryData c = wmgr.createWeblogCategory(
+                            newWebsite,         // newWebsite
+                            rootCat,         // parent
+                            splitcats[i],    // name
+                            splitcats[i],    // description
+                            null );          // image
+                    this.strategy.store(c);
+                }
+            }
+            newWebsite.setBloggerCategory(rootCat);
+            newWebsite.setDefaultCategory(rootCat);
+            this.strategy.store(newWebsite);
+            
+            // add default bookmarks
+            BookmarkManager bmgr = RollerFactory.getRoller().getBookmarkManager();
+            FolderData root = bmgr.createFolder(
+                    null, "root", "root", newWebsite);
+            this.strategy.store(root);
+            
+            Integer zero = new Integer(0);
+            String blogroll = RollerConfig.getProperty("newuser.blogroll");
+            if (blogroll != null) {
+                String[] splitroll = blogroll.split(",");
+                for (int i=0; i<splitroll.length; i++) {
+                    String[] rollitems = splitroll[i].split("\\|");
+                    if (rollitems != null && rollitems.length > 1) {
+                        BookmarkData b = bmgr.createBookmark(
+                                root,                // parent
+                                rollitems[0],        // name
+                                "",                  // description
+                                rollitems[1].trim(), // url
+                                null,                // feedurl
+                                zero,                // weight
+                                zero,                // priority
+                                null);               // image
+                        this.strategy.store(b);
+                    }
+                }
+            }
+            
+            // 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);
         }
     }
     
-    /** 
-     * Use Hibernate directly because Roller's Query API does too much allocation.
+    
+    /**
+     * The old createWebsite() method.
      */
-    public WeblogTemplate getPageByLink(WebsiteData website, String pagelink)
-        throws RollerException
-    {
-        if (website == null)
-            throw new RollerException("userName is null");
-                                   
-        if (pagelink == null)
-            throw new RollerException("Pagelink is null");
-                                                                      
-        Session session = ((HibernateStrategy)mStrategy).getSession();
-        Criteria criteria = session.createCriteria(WeblogTemplate.class);
-        criteria.add(Expression.eq("website",website));
-        criteria.add(Expression.eq("link",pagelink));        
-        criteria.setMaxResults(1);
-        try
-        {
-            List list = criteria.list();
-            return list.size()!=0 ? (WeblogTemplate)list.get(0) : null;
-        }
-        catch (HibernateException e)
-        {
-            throw new RollerException(e);
+    public WebsiteData createWebsite(UserData user, Map pages, String handle,
+                                     String name, String description, 
+                                     String email, String theme, String locale, 
+                                     String timeZone) throws RollerException {
+        
+        WebsiteData website = new WebsiteData(
+                    null,                // id
+                    name,                // name
+                    handle,              // handle
+                    description,         // description
+                    user,                // userId
+                    "dummy",             // defaultPageId
+                    "dummy",             // weblogDayPageId
+                    Boolean.TRUE,        // enableBloggerApi
+                    null,                // bloggerCategory
+                    null,                // defaultCategory
+                    "editor-text.jsp",   // editorPage
+                    "",                  // blacklist
+                    Boolean.TRUE,        // allowComments
+                    Boolean.FALSE,       // emailComments
+                    "",                  // emailFromAddress
+                    Boolean.TRUE,        // isEnabled
+                    email,               // emailAddress
+                    new Date(),          // dateCreated
+                    Boolean.TRUE,        // defaultAllowComments
+                    0,                   // defaultCommentDays
+                    Boolean.FALSE);      // moderateComments
+            website.setEditorTheme(theme);
+            website.setLocale(locale);
+            website.setTimeZone(timeZone);
+            
+            this.createWebsite(website);
+            
+            return website;
+    }
+    
+    /**
+     * Creates and stores a pending PermissionsData for user and website specified.
+     *
+     * TODO: do we really need this?  can't we just use storePermissions()?
+     */
+    public PermissionsData inviteUser(WebsiteData website,
+            UserData user, short mask) throws RollerException {
+        
+        if (website == null) throw new RollerException("Website cannot be null");
+        if (user == null) throw new RollerException("User cannot be null");
+        
+        PermissionsData perms = new PermissionsData();
+        perms.setWebsite(website);
+        perms.setUser(user);
+        perms.setPermissionMask(mask);
+        this.strategy.storeAndCommit(perms);
+        
+        return perms;
+    }
+    
+    
+    /**
+     * Remove user permissions from a website.
+     */
+    public void retireUser(WebsiteData website, UserData user) throws RollerException {
+        
+        if (website == null) throw new RollerException("Website cannot be null");
+        if (user == null) throw new RollerException("User cannot be null");
+        
+        Iterator perms = website.getPermissions().iterator();
+        PermissionsData target = null;
+        while (perms.hasNext()) {
+            PermissionsData pd = (PermissionsData)perms.next();
+            if (pd.getUser().getId().equals(user.getId())) {
+                target = pd;
+                break;
+            }
         }
+        if (target == null) throw new RollerException("User not member of website");
+        
+        website.removePermission(target);
+        this.strategy.removeAndCommit(target);
     }
-
-    /** 
+    
+    
+    public WebsiteData retrieveWebsite(String id) throws RollerException {
+        return (WebsiteData)this.strategy.load(id,WebsiteData.class);
+    }
+    
+    
+    public WebsiteData getWebsiteByHandle(String handle) throws RollerException {
+        return getWebsiteByHandle(handle, Boolean.TRUE);
+    }
+    
+    
+    /**
      * Return website specified by handle.
      */
     public WebsiteData getWebsiteByHandle(String handle, Boolean enabled)
-                    throws RollerException
-    {
+            throws RollerException {
+        
         if (handle==null )
             throw new RollerException("Handle cannot be null");
-
-        try
-        {
-            Session session = ((HibernateStrategy)mStrategy).getSession();
+        
+        try {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            Session session = ((HibernatePersistenceStrategy)this.strategy).getSession();
             Criteria criteria = session.createCriteria(WebsiteData.class);
-            if (enabled != null)
-            {
+            if (enabled != null) {
                 criteria.add(
-                   Expression.conjunction()
-                       .add(new IgnoreCaseEqExpression("handle", handle))
-                       .add(Expression.eq("enabled", enabled)));
-            }
-            else
-            {
+                        Expression.conjunction()
+                        .add(new IgnoreCaseEqExpression("handle", handle))
+                        .add(Expression.eq("enabled", enabled)));
+            } else {
                 criteria.add(
-                    Expression.conjunction()
+                        Expression.conjunction()
                         .add(Expression.eq("handle", handle)));
-            }        
+            }
             WebsiteData website = (WebsiteData)criteria.uniqueResult();
             return website;
+        } catch (HibernateException e) {
+            throw new RollerException(e);
         }
-        catch (HibernateException e)
-        {
+    }
+    
+    
+    /**
+     * Get websites of a user
+     */
+    public List getWebsites(UserData user, Boolean enabled, Boolean active)  throws RollerException {
+        
+        try {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            Session session = ((HibernatePersistenceStrategy)this.strategy).getSession();
+            Criteria criteria = session.createCriteria(WebsiteData.class);
+            if (user != null) {
+                criteria.createAlias("permissions","permissions");
+                criteria.add(Expression.eq("permissions.user", user));
+                criteria.add(Expression.eq("permissions.pending", Boolean.FALSE));
+            }
+            if (enabled != null) {
+                criteria.add(Expression.eq("enabled", enabled));
+            }
+            if (active != null) {
+                criteria.add(Expression.eq("active", active));
+            }
+            return criteria.list();
+        } catch (HibernateException e) {
             throw new RollerException(e);
         }
     }
     
-    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -     
-    public UserData getUser(String userName, Boolean enabled) 
-        throws RollerException
-    {
+    
+    public UserData retrieveUser(String id) throws RollerException {
+        return (UserData)this.strategy.load(id,UserData.class);
+    }
+    
+    
+    public UserData getUser(String userName) throws RollerException {
+        return getUser(userName, Boolean.TRUE);
+    }
+    
+    
+    public UserData getUser(String userName, Boolean enabled)
+            throws RollerException {
+        
         if (userName==null )
             throw new RollerException("userName cannot be null");
-
-        try
-        {
-            Session session = ((HibernateStrategy)mStrategy).getSession();
+        
+        try {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            Session session = ((HibernatePersistenceStrategy)this.strategy).getSession();
             Criteria criteria = session.createCriteria(UserData.class);
-            if (enabled != null) 
-            {
+            if (enabled != null) {
                 criteria.add(
-                   Expression.conjunction()
-                       .add(Expression.eq("userName", userName))
-                       .add(Expression.eq("enabled", enabled)));
-            }
-            else
-            {
+                        Expression.conjunction()
+                        .add(Expression.eq("userName", userName))
+                        .add(Expression.eq("enabled", enabled)));
+            } else {
                 criteria.add(
-                    Expression.conjunction()
+                        Expression.conjunction()
                         .add(Expression.eq("userName", userName)));
-            }        
+            }
             return (UserData)criteria.uniqueResult();
+        } catch (HibernateException e) {
+            throw new RollerException(e);
         }
-        catch (HibernateException e)
-        {
+    }
+    
+    
+    public List getUsers() throws RollerException {
+        return getUsers(Boolean.TRUE);
+    }
+    
+    
+    public List getUsers(Boolean enabled) throws RollerException {
+        
+        try {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            Session session = ((HibernatePersistenceStrategy)this.strategy).getSession();
+            Criteria criteria = session.createCriteria(UserData.class);
+            if (enabled != null) {
+                criteria.add(Expression.eq("enabled", enabled));
+            }
+            
+            return criteria.list();
+        } catch (HibernateException e) {
             throw new RollerException(e);
         }
     }
     
-    //------------------------------------------------------------------------    
-    /** 
-     * @see org.roller.model.UserManager#getPages(WebsiteData)
+    
+    /**
+     * Get users of a website
      */
-    public List getPages(WebsiteData website) throws RollerException
-    {
-        if (website == null)
-            throw new RollerException("website is null");
-                                                                      
-        Session session = ((HibernateStrategy)mStrategy).getSession();
-        Criteria criteria = session.createCriteria(WeblogTemplate.class);
-        criteria.add(Expression.eq("website",website)); 
-        criteria.addOrder(Order.asc("name"));
-        try
-        {
+    public List getUsers(WebsiteData website, Boolean enabled) throws RollerException {
+        
+        try {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            Session session = ((HibernatePersistenceStrategy)this.strategy).getSession();
+            Criteria criteria = session.createCriteria(UserData.class);
+            if (website != null) {
+                criteria.createAlias("permissions","permissions");
+                criteria.add(Expression.eq("permissions.website", website));
+            }
+            if (enabled != null) {
+                criteria.add(Expression.eq("enabled", enabled));
+            }
             return criteria.list();
+        } catch (HibernateException e) {
+            throw new RollerException(e);
         }
-        catch (HibernateException e)
-        {
+    }
+    
+    
+    public List getUsersStartingWith(String startsWith,
+            int offset, int length, Boolean enabled) throws RollerException {
+        
+        List rawresults = new ArrayList();
+        List results = new ArrayList();
+        try {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            Session session = ((HibernatePersistenceStrategy)this.strategy).getSession();
+            Criteria criteria = session.createCriteria(UserData.class);
+            
+            if (enabled != null) {
+                criteria.add(Expression.eq("enabled", enabled));
+            }
+            if (startsWith != null) {
+                criteria.add(Expression.disjunction()
+                .add(Expression.like("userName", startsWith, MatchMode.START))
+                .add(Expression.like("emailAddress", startsWith, MatchMode.START)));
+            }
+            
+            rawresults = criteria.list();
+        } catch (HibernateException e) {
             throw new RollerException(e);
         }
+        int pos = 0;
+        int count = 0;
+        Iterator iter = rawresults.iterator();
+        while (iter.hasNext() && count < length) {
+            UserData user = (UserData)iter.next();
+            if (pos++ >= offset) {
+                results.add(user);
+                count++;
+            }
+        }
+        return results;
     }
     
-    /** 
-     * @see org.roller.model.UserManager#getPageByName(WebsiteData, java.lang.String)
+    
+    public WeblogTemplate retrievePage(String id) throws RollerException {
+        // Don't hit database for templates stored on disk
+        if (id != null && id.endsWith(".vm")) return null;
+        
+        return (WeblogTemplate)this.strategy.load(id,WeblogTemplate.class);
+    }
+    
+    
+    /**
+     * @see org.roller.model.UserManager#retrievePage(java.lang.String)
+     *
+     * TODO: EOL this method, it is useless
+     */
+    public WeblogTemplate retrievePageReadOnly(String id) throws RollerException {
+        // Don't hit database for templates stored on disk
+        if (id != null && id.endsWith(".vm")) return null;
+        
+        // Hibernate has a read-only flag: LockMode.READ
+        return (WeblogTemplate)this.strategy.load(id,WeblogTemplate.class);
+    }
+    
+    
+    /**
+     * Use Hibernate directly because Roller's Query API does too much allocation.
      */
-    public WeblogTemplate getPageByName(WebsiteData website, String pagename) 
-        throws RollerException
-    {
+    public WeblogTemplate getPageByLink(WebsiteData website, String pagelink)
+            throws RollerException {
+        
         if (website == null)
-            throw new RollerException("website is null");
-                                   
-        if (pagename == null)
-            throw new RollerException("Page name is null");
-                                   
-        Session session = ((HibernateStrategy)mStrategy).getSession();
-        Criteria criteria = session.createCriteria(WeblogTemplate.class);
-        criteria.add(Expression.eq("website", website));
-        criteria.add(Expression.eq("name", pagename));
-        criteria.setMaxResults(1);
-        try
-        {
+            throw new RollerException("userName is null");
+        
+        if (pagelink == null)
+            throw new RollerException("Pagelink is null");
+        
+        try {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            Session session = ((HibernatePersistenceStrategy)this.strategy).getSession();
+            Criteria criteria = session.createCriteria(WeblogTemplate.class);
+            criteria.add(Expression.eq("website",website));
+            criteria.add(Expression.eq("link",pagelink));
+            criteria.setMaxResults(1);
+            
             List list = criteria.list();
             return list.size()!=0 ? (WeblogTemplate)list.get(0) : null;
-        }
-        catch (HibernateException e)
-        {
+        } catch (HibernateException e) {
             throw new RollerException(e);
         }
     }
     
-    /* 
-     * @see org.roller.business.UserManagerBase#getRoles(org.roller.pojos.UserData)
+    
+    /**
+     * @see org.roller.model.UserManager#getPageByName(WebsiteData, java.lang.String)
      */
-    public List getUserRoles(UserData user) throws RollerException
-    {
+    public WeblogTemplate getPageByName(WebsiteData website, String pagename)
+            throws RollerException {
         
-        Session session = ((HibernateStrategy)mStrategy).getSession();
-        Criteria criteria = session.createCriteria(RoleData.class);
-        criteria.add(Expression.eq("user", user));
-        try
-        {
-            return criteria.list();
-        }
-        catch (HibernateException e)
-        {
-            throw new RollerException(e);
-        }
-    }
-
-    public List getUsers(Boolean enabled) throws RollerException
-    {
-        Session session = ((HibernateStrategy)mStrategy).getSession();
-        Criteria criteria = session.createCriteria(UserData.class);            
-        if (enabled != null)
-        {
-            criteria.add(Expression.eq("enabled", enabled));
-        }
-        try
-        {
-            return criteria.list();
-        }
-        catch (HibernateException e)
-        {
+        if (website == null)
+            throw new RollerException("website is null");
+        
+        if (pagename == null)
+            throw new RollerException("Page name is null");
+        
+        try {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            Session session = ((HibernatePersistenceStrategy)this.strategy).getSession();
+            Criteria criteria = session.createCriteria(WeblogTemplate.class);
+            criteria.add(Expression.eq("website", website));
+            criteria.add(Expression.eq("name", pagename));
+            criteria.setMaxResults(1);
+            
+            List list = criteria.list();
+            return list.size()!=0? (WeblogTemplate)list.get(0) : null;
+        } catch (HibernateException e) {
             throw new RollerException(e);
         }
     }
-
-    /** 
-     * @see org.roller.model.UserManager#removeWebsiteContents(org.roller.pojos.WebsiteData)
+    
+    
+    /**
+     * @see org.roller.model.UserManager#getPages(WebsiteData)
      */
-    public void removeWebsiteContents(WebsiteData website) 
-        throws RollerException
-    {
-        try
-        {
-            Session session = ((HibernateStrategy)mStrategy).getSession();
-
-            //UserManager umgr = RollerFactory.getRoller().getUserManager();
-            BookmarkManager bmgr = RollerFactory.getRoller().getBookmarkManager();
-            WeblogManager wmgr = RollerFactory.getRoller().getWeblogManager();
+    public List getPages(WebsiteData website) throws RollerException {
+        
+        if (website == null)
+            throw new RollerException("website is null");
+        
+        try {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
             
-            // remove entries
-            Criteria entryQuery = session.createCriteria(WeblogEntryData.class);
-            entryQuery.add(Expression.eq("website", website));
-            List entries = entryQuery.list();
-            for (Iterator iter = entries.iterator(); iter.hasNext();) 
-            {
-                WeblogEntryData entry = (WeblogEntryData) iter.next();
-                System.out.println("Removing entry: " + entry.getId());
-                entry.remove();
-            }
-            
-            // remove folders (takes bookmarks with it)
-            FolderData rootFolder = bmgr.getRootFolder(website);
-            if (null != rootFolder)
-            { 
-                rootFolder.remove();
-                // Still cannot get all Bookmarks cleared!                
-                Iterator allFolders = bmgr.getAllFolders(website).iterator();
-                while (allFolders.hasNext()) 
-                {
-                    FolderData aFolder = (FolderData)allFolders.next();
-                    bmgr.deleteFolderContents(aFolder);
-                    aFolder.remove();
-                }
-            }
-                        
-            // remove associated pages
-            Criteria pageQuery = session.createCriteria(WeblogTemplate.class);
-            pageQuery.add(Expression.eq("website", website));
-            List pages = pageQuery.list();
-            for (Iterator iter = pages.iterator(); iter.hasNext();) 
-            {
-                WeblogTemplate page = (WeblogTemplate) iter.next();
-                page.remove();
-            }
-            
-            // remove associated referers
-            Criteria refererQuery = session.createCriteria(RefererData.class);
-            refererQuery.add(Expression.eq("website", website));
-            List referers = refererQuery.list();
-            for (Iterator iter = referers.iterator(); iter.hasNext();) 
-            {
-                RefererData referer = (RefererData) iter.next();
-                referer.remove();
-            }
-            
-            // remove categories
-            WeblogCategoryData rootCat = wmgr.getRootWeblogCategory(website);
-            if (null != rootCat)
-            {
-                rootCat.remove();
-//                Iterator it = wmgr.getWeblogCategories(website).iterator();
-//                while (it.hasNext()) 
-//                {
-//                     ((WeblogCategoryData)it.next()).remove();
-//                }
-            }
-
-            // Remove the website's ping queue entries
-            PingQueueManager pingQueueMgr = RollerFactory.getRoller().getPingQueueManager();
-            pingQueueMgr.removeQueueEntriesByWebsite(website);
-
-            // Remove the website's custom ping targets
-            PingTargetManager pingTargetMgr = RollerFactory.getRoller().getPingTargetManager();
-            pingTargetMgr.removeCustomPingTargets(website);
-
-            // Remove the website's auto ping configurations
-            AutoPingManager autoPingMgr = RollerFactory.getRoller().getAutopingManager();
-            List autopings = autoPingMgr.getAutoPingsByWebsite(website);
-            autoPingMgr.removeAutoPings(autopings);
-
-        }
-        catch (HibernateException e)
-        {
+            Session session = ((HibernatePersistenceStrategy)this.strategy).getSession();
+            Criteria criteria = session.createCriteria(WeblogTemplate.class);
+            criteria.add(Expression.eq("website",website));
+            criteria.addOrder(Order.asc("name"));
+            
+            return criteria.list();
+        } catch (HibernateException e) {
             throw new RollerException(e);
         }
     }
-
+    
+    
+    public PermissionsData retrievePermissions(String inviteId) throws RollerException {
+        return (PermissionsData)this.strategy.load(inviteId, PermissionsData.class);
+    }
+    
+    
     /**
      * Return permissions for specified user in website
      */
     public PermissionsData getPermissions(
-            WebsiteData website, UserData user) throws RollerException
-    {
-        Session session = ((HibernateStrategy)mStrategy).getSession();
-        Criteria criteria = session.createCriteria(PermissionsData.class);            
-        criteria.add(Expression.eq("website", website));
-        criteria.add(Expression.eq("user", user));
-        try
-        {
+            WebsiteData website, UserData user) throws RollerException {
+        
+        try {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            Session session = ((HibernatePersistenceStrategy)this.strategy).getSession();
+            Criteria criteria = session.createCriteria(PermissionsData.class);
+            criteria.add(Expression.eq("website", website));
+            criteria.add(Expression.eq("user", user));
+            
             List list = criteria.list();
             return list.size()!=0 ? (PermissionsData)list.get(0) : null;
-        }
-        catch (HibernateException e)
-        {
+        } catch (HibernateException e) {
             throw new RollerException(e);
         }
     }
     
-    /** 
+    
+    /**
      * Get pending permissions for user
      */
-    public List getPendingPermissions(UserData user) throws RollerException
-    {
-        Session session = ((HibernateStrategy)mStrategy).getSession();
-        Criteria criteria = session.createCriteria(PermissionsData.class);            
-        criteria.add(Expression.eq("user", user));
-        criteria.add(Expression.eq("pending", Boolean.TRUE));
-        try
-        {
+    public List getPendingPermissions(UserData user) throws RollerException {
+        
+        try {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            Session session = ((HibernatePersistenceStrategy)this.strategy).getSession();
+            Criteria criteria = session.createCriteria(PermissionsData.class);
+            criteria.add(Expression.eq("user", user));
+            criteria.add(Expression.eq("pending", Boolean.TRUE));
+            
             return criteria.list();
-        }
-        catch (HibernateException e)
-        {
+        } catch (HibernateException e) {
             throw new RollerException(e);
         }
     }
     
-    /** 
+    
+    /**
      * Get pending permissions for website
      */
-    public List getPendingPermissions(WebsiteData website) throws RollerException
-    {
-        Session session = ((HibernateStrategy)mStrategy).getSession();
-        Criteria criteria = session.createCriteria(PermissionsData.class);            
-        criteria.add(Expression.eq("website", website));
-        criteria.add(Expression.eq("pending", Boolean.TRUE));
-        try
-        {
+    public List getPendingPermissions(WebsiteData website) throws RollerException {
+        
+        try {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            Session session = ((HibernatePersistenceStrategy)this.strategy).getSession();
+            Criteria criteria = session.createCriteria(PermissionsData.class);
+            criteria.add(Expression.eq("website", website));
+            criteria.add(Expression.eq("pending", Boolean.TRUE));
+            
             return criteria.list();
-        }
-        catch (HibernateException e)
-        {
+        } catch (HibernateException e) {
             throw new RollerException(e);
         }
     }
-
+    
+    
     /**
      * Get all permissions of a website (pendings not including)
      */
-    public List getAllPermissions(WebsiteData website) throws RollerException
-    {
-        Session session = ((HibernateStrategy)mStrategy).getSession();
-        Criteria criteria = session.createCriteria(PermissionsData.class);            
-        criteria.add(Expression.eq("website", website));
-        criteria.add(Expression.eq("pending", Boolean.FALSE));
-        try
-        {
+    public List getAllPermissions(WebsiteData website) throws RollerException {
+        
+        try {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            Session session = ((HibernatePersistenceStrategy)this.strategy).getSession();
+            Criteria criteria = session.createCriteria(PermissionsData.class);
+            criteria.add(Expression.eq("website", website));
+            criteria.add(Expression.eq("pending", Boolean.FALSE));
+            
             return criteria.list();
-        }
-        catch (HibernateException e)
-        {
+        } catch (HibernateException e) {
             throw new RollerException(e);
         }
     }
-
+    
+    
     /**
      * Get all permissions of a user.
      */
-    public List getAllPermissions(UserData user) throws RollerException
-    {
-        Session session = ((HibernateStrategy)mStrategy).getSession();
-        Criteria criteria = session.createCriteria(PermissionsData.class);            
-        criteria.add(Expression.eq("user", user));
-        criteria.add(Expression.eq("pending", Boolean.FALSE));
-        try
-        {
+    public List getAllPermissions(UserData user) throws RollerException {
+        
+        try {
+            // begin transaction
+            this.strategy.getSession().beginTransaction();
+            
+            Session session = ((HibernatePersistenceStrategy)this.strategy).getSession();
+            Criteria criteria = session.createCriteria(PermissionsData.class);
+            criteria.add(Expression.eq("user", user));
+            criteria.add(Expression.eq("pending", Boolean.FALSE));
+            
             return criteria.list();
-        }
-        catch (HibernateException e)
-        {
+        } catch (HibernateException e) {
             throw new RollerException(e);
         }
     }
-
-    public List getUsersStartingWith(String startsWith, 
-            int offset, int length, Boolean enabled) throws RollerException
-    {
-        Session session = ((HibernateStrategy)mStrategy).getSession();
-        Criteria criteria = session.createCriteria(UserData.class);  
-        List rawresults = new ArrayList();
-        List results = new ArrayList();
-        if (enabled != null)
-        {
-            criteria.add(Expression.eq("enabled", enabled));
-        }
-        if (startsWith != null) 
-        {
-            criteria.add(Expression.disjunction()
-                .add(Expression.like("userName", startsWith, MatchMode.START))
-                .add(Expression.like("emailAddress", startsWith, MatchMode.START)));
-        }
-        try
-        {
-            rawresults = criteria.list();
-        }
-        catch (HibernateException e)
-        {
-            throw new RollerException(e);
-        }
-        int pos = 0;
-        int count = 0;
-        Iterator iter = rawresults.iterator();
-        while (iter.hasNext() && count < length)
-        {
-            UserData user = (UserData)iter.next();
-            if (pos++ >= offset) 
-            {
-                results.add(user);
-                count++;
-            }
+    
+    
+    public void release() {}
+    
+    
+    /** Doesn't seem to be any other way to get ignore case w/o QBE */
+    class IgnoreCaseEqExpression extends SimpleExpression {
+        public IgnoreCaseEqExpression(String property, Object value) {
+            super(property, value, "=", true);
         }
-        return results;
     }
+    
 }