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/19 22:53:20 UTC

svn commit: r395393 [4/10] - in /incubator/roller/trunk: ./ contrib/plugins/src/org/roller/presentation/velocity/plugins/topictag/ metadata/database/hibernate/ sandbox/atomadminprotocol/src/org/roller/presentation/atomadminapi/ sandbox/atomprotocol/src...

Modified: incubator/roller/trunk/src/org/roller/business/hibernate/HibernateUserManagerImpl.java
URL: http://svn.apache.org/viewcvs/incubator/roller/trunk/src/org/roller/business/hibernate/HibernateUserManagerImpl.java?rev=395393&r1=395392&r2=395393&view=diff
==============================================================================
--- incubator/roller/trunk/src/org/roller/business/hibernate/HibernateUserManagerImpl.java (original)
+++ incubator/roller/trunk/src/org/roller/business/hibernate/HibernateUserManagerImpl.java Wed Apr 19 13:53:01 2006
@@ -4,533 +4,786 @@
 package org.roller.business.hibernate;
 
 import java.util.ArrayList;
+import java.util.Hashtable;
 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.RollerFactory;
+import org.roller.model.UserManager;
 import org.roller.model.WeblogManager;
+import org.roller.pojos.AutoPingData;
+import org.roller.pojos.BookmarkData;
 import org.roller.pojos.FolderData;
 import org.roller.pojos.WeblogTemplate;
 import org.roller.pojos.PermissionsData;
+import org.roller.pojos.PingQueueEntryData;
+import org.roller.pojos.PingTargetData;
 import org.roller.pojos.RefererData;
-import org.roller.pojos.RoleData;
 import org.roller.pojos.UserData;
 import org.roller.pojos.WeblogCategoryData;
 import org.roller.pojos.WeblogEntryData;
 import org.roller.pojos.WebsiteData;
 
+
 /**
- * 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);
+    private static Log log = LogFactory.getLog(HibernateUserManagerImpl.class);
+    
+    private HibernatePersistenceStrategy strategy = null;
+    
+    // cached mapping of weblogHandles -> weblogIds
+    private Map weblogHandleToIdMap = new Hashtable();
+    
+    // cached mapping of userNames -> userIds
+    private Map userNameToIdMap = new Hashtable();
+    
+    
+    /**
+     * @param strategy
+     */
+    public HibernateUserManagerImpl(HibernatePersistenceStrategy strat) {
+        log.debug("Instantiating Hibernate User Manager");
         
-    /** 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);
-        }
+        this.strategy = strat;
     }
     
+    
     /**
-     * @param strategy
+     * @see org.roller.model.UserManager#storeWebsite(org.roller.pojos.WebsiteData)
      */
-    public HibernateUserManagerImpl(PersistenceStrategy strategy)
-    {
-        super(strategy);
-        mLogger.debug("Instantiating User Manager");
+    public void saveWebsite(WebsiteData data) throws RollerException {
+        this.strategy.store(data);
+    }
+    
+    
+    public void removeWebsite(WebsiteData weblog) throws RollerException {
+        
+        // remove contents first, then remove website
+        this.removeWebsiteContents(weblog);
+        this.strategy.remove(weblog);
+        
+        // remove entry from cache mapping
+        this.weblogHandleToIdMap.remove(weblog.getHandle());
     }
     
+
     /**
-     * Get websites of a user
+     * convenience method for removing contents of a weblog.
+     *
+     * TODO BACKEND: use manager methods instead of queries here
      */
-    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));
-            }
-            if (enabled != null)
-            {
-                criteria.add(Expression.eq("enabled", enabled));
-            }
-            if (active != null)
-            {
-                criteria.add(Expression.eq("active", active));
+    private void removeWebsiteContents(WebsiteData website) 
+            throws HibernateException, RollerException {
+        
+        Session session = this.strategy.getSession();
+        
+        BookmarkManager bmgr = RollerFactory.getRoller().getBookmarkManager();
+        WeblogManager wmgr = RollerFactory.getRoller().getWeblogManager();
+        
+        // Remove the website's ping queue entries
+        Criteria criteria = session.createCriteria(PingQueueEntryData.class);
+        criteria.add(Expression.eq("website", website));
+        List queueEntries = criteria.list();
+        
+        // Remove the website's auto ping configurations
+        AutoPingManager autoPingMgr = RollerFactory.getRoller().getAutopingManager();
+        List autopings = autoPingMgr.getAutoPingsByWebsite(website);
+        Iterator it = autopings.iterator();
+        while(it.hasNext()) {
+            this.strategy.remove((AutoPingData) it.next());
+        }
+        
+        // Remove the website's custom ping targets
+        PingTargetManager pingTargetMgr = RollerFactory.getRoller().getPingTargetManager();
+        List pingtargets = pingTargetMgr.getCustomPingTargets(website);
+        it = pingtargets.iterator();
+        while(it.hasNext()) {
+            this.strategy.remove((PingTargetData) it.next());
+        }
+        
+        // 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 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 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 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();
+                bmgr.removeFolderContents(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 saveUser(UserData data) throws RollerException {
+        this.strategy.store(data);
     }
     
+    
+    public void removeUser(UserData user) throws RollerException {
+        this.strategy.remove(user);
+        
+        // remove entry from cache mapping
+        this.userNameToIdMap.remove(user.getUserName());
+    }
+    
+    
+    public void savePermissions(PermissionsData perms) throws RollerException {
+        this.strategy.store(perms);
+    }
+    
+    
+    public void removePermissions(PermissionsData perms) throws RollerException {
+        this.strategy.remove(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));
-            }
-            if (enabled != null)
-            {
-                criteria.add(Expression.eq("enabled", enabled));
-            }
-            return criteria.list();
+    public void savePage(WeblogTemplate data) throws RollerException {
+        this.strategy.store(data);
+    }
+    
+    
+    public void removePage(WeblogTemplate page) throws RollerException {
+        this.strategy.remove(page);
+    }
+    
+    
+    public void addUser(UserData newUser) throws RollerException {
+        
+        if(newUser == null)
+            throw new RollerException("cannot add null user");
+        
+        // TODO BACKEND: we must do this in a better fashion, like getUserCnt()?
+        boolean adminUser = false;
+        List existingUsers = this.getUsers();
+        if(existingUsers.size() == 0) {
+            // Make first user an admin
+            adminUser = true;
         }
-        catch (HibernateException e)
-        {
-            throw new RollerException(e);
+        
+        if(getUserByUsername(newUser.getUserName()) != null ||
+                getUserByUsername(newUser.getUserName().toLowerCase()) != null) {
+            throw new RollerException("error.add.user.userNameInUse");
         }
+        
+        newUser.grantRole("editor");
+        if(adminUser) {
+            newUser.grantRole("admin");
+        }
+        
+        this.strategy.store(newUser);
     }
     
-    /** 
-     * Use Hibernate directly because Roller's Query API does too much allocation.
-     */
-    public WeblogTemplate getPageByLink(WebsiteData website, String pagelink)
-        throws RollerException
-    {
-        if (website == null)
-            throw new RollerException("userName is null");
-                                   
-        if (pagelink == null)
-            throw new RollerException("Pagelink is null");
-                                                                      
-        Session session = ((HibernateStrategy)mStrategy).getSession();
-        Criteria criteria = session.createCriteria(WeblogTemplate.class);
-        criteria.add(Expression.eq("website",website));
-        criteria.add(Expression.eq("link",pagelink));        
-        criteria.setMaxResults(1);
-        try
-        {
-            List list = criteria.list();
-            return list.size()!=0 ? (WeblogTemplate)list.get(0) : null;
+    
+    public void addWebsite(WebsiteData newWeblog) throws RollerException {
+        
+        this.strategy.store(newWeblog);
+        this.addWeblogContents(newWeblog);
+    }
+    
+    
+    private void addWeblogContents(WebsiteData newWeblog) throws RollerException {
+        
+        UserManager umgr = RollerFactory.getRoller().getUserManager();
+        WeblogManager wmgr = RollerFactory.getRoller().getWeblogManager();
+        
+        // grant weblog creator ADMIN permissions
+        PermissionsData perms = new PermissionsData();
+        perms.setUser(newWeblog.getCreator());
+        perms.setWebsite(newWeblog);
+        perms.setPending(false);
+        perms.setPermissionMask(PermissionsData.ADMIN);
+        this.strategy.store(perms);
+        
+        // add default categories
+        WeblogCategoryData rootCat = new WeblogCategoryData(
+                null, // id
+                newWeblog, // newWeblog
+                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 = new WeblogCategoryData(
+                        null,            // id
+                        newWeblog,         // newWeblog
+                        rootCat,         // parent
+                        splitcats[i],    // name
+                        splitcats[i],    // description
+                        null );          // image
+                this.strategy.store(c);
+            }
+        }
+        newWeblog.setBloggerCategory(rootCat);
+        newWeblog.setDefaultCategory(rootCat);
+        this.strategy.store(newWeblog);
+        
+        // add default bookmarks
+        FolderData root = new FolderData(
+                null, "root", "root", newWeblog);
+        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 = new BookmarkData(
+                            root,                // parent
+                            rollitems[0],        // name
+                            "",                  // description
+                            rollitems[1].trim(), // url
+                            null,                // feedurl
+                            zero,                // weight
+                            zero,                // priority
+                            null);               // image
+                    this.strategy.store(b);
+                }
+            }
         }
-        catch (HibernateException e)
-        {
-            throw new RollerException(e);
+
+    }
+    
+    
+    /**
+     * Creates and stores a pending PermissionsData for user and website specified.
+     *
+     * TODO BACKEND: 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.store(perms);
+        
+        return perms;
+    }
+    
+    
+    /**
+     * Remove user permissions from a website.
+     *
+     * TODO: replace this with a domain model method like weblog.retireUser(user)
+     */
+    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.remove(target);
     }
-
-    /** 
+    
+    
+    public WebsiteData getWebsite(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();
+        
+        // check cache first
+        // NOTE: if we ever allow changing handles then this needs updating
+        if(this.weblogHandleToIdMap.containsKey(handle)) {
+            
+            WebsiteData weblog = this.getWebsite((String) this.weblogHandleToIdMap.get(handle));
+            if(weblog != null) {
+                // only return weblog if enabled status matches
+                if(enabled == null || enabled.equals(weblog.getEnabled())) {
+                    log.debug("weblogHandleToId CACHE HIT - "+handle);
+                    return weblog;
+                }
+            } else {
+                // mapping hit with lookup miss?  mapping must be old, remove it
+                this.weblogHandleToIdMap.remove(handle);
+            }
+        }
+        
+        // cache failed, do lookup
+        try {
+            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();
+            }
+            
+            WebsiteData website = (WebsiteData) criteria.uniqueResult();
+            
+            // add mapping to cache
+            if(website != null) {
+                log.debug("weblogHandleToId CACHE MISS - "+handle);
+                this.weblogHandleToIdMap.put(website.getHandle(), website.getId());
+            }
+            
             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 {
+            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 getUser(String id) throws RollerException {
+        return (UserData)this.strategy.load(id,UserData.class);
+    }
+    
+    
+    public UserData getUserByUsername(String userName) throws RollerException {
+        return getUserByUsername(userName, Boolean.TRUE);
+    }
+    
+    
+    public UserData getUserByUsername(String userName, Boolean enabled)
+            throws RollerException {
+        
         if (userName==null )
             throw new RollerException("userName cannot be null");
-
-        try
-        {
-            Session session = ((HibernateStrategy)mStrategy).getSession();
+        
+        // check cache first
+        // NOTE: if we ever allow changing usernames then this needs updating
+        if(this.userNameToIdMap.containsKey(userName)) {
+            
+            UserData user = this.getUser((String) this.userNameToIdMap.get(userName));
+            if(user != null) {
+                // only return the user if the enabled status matches
+                if(enabled == null || enabled.equals(user.getEnabled())) {
+                    log.debug("userNameToIdMap CACHE HIT - "+userName);
+                    return user;
+                }
+            } else {
+                // mapping hit with lookup miss?  mapping must be old, remove it
+                this.userNameToIdMap.remove(userName);
+            }
+        }
+        
+        // cache failed, do lookup
+        try {
+            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();
+            }
+            
+            UserData user = (UserData) criteria.uniqueResult();
+            
+            // add mapping to cache
+            if(user != null) {
+                log.debug("userNameToIdMap CACHE MISS - "+userName);
+                this.userNameToIdMap.put(user.getUserName(), user.getId());
+            }
+            
+            return user;
+        } 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 {
+            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 {
+            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 {
+            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 getPage(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);
+    }
+    
+    
+    /**
+     * 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 {
+            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)
-        {
+        if (website == null)
+            throw new RollerException("website is null");
+        
+        if (pagename == null)
+            throw new RollerException("Page name is null");
+        
+        try {
+            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);
         }
     }
-
-    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
-        {
+    
+    
+    /**
+     * @see org.roller.model.UserManager#getPages(WebsiteData)
+     */
+    public List getPages(WebsiteData website) throws RollerException {
+        
+        if (website == null)
+            throw new RollerException("website is null");
+        
+        try {
+            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)
-        {
+        } catch (HibernateException e) {
             throw new RollerException(e);
         }
     }
-
-    /** 
-     * @see org.roller.model.UserManager#removeWebsiteContents(org.roller.pojos.WebsiteData)
-     */
-    public void removeWebsiteContents(WebsiteData website) 
-        throws RollerException
-    {
-        try
-        {
-            Session session = ((HibernateStrategy)mStrategy).getSession();
-
-            //UserManager umgr = RollerFactory.getRoller().getUserManager();
-            BookmarkManager bmgr = RollerFactory.getRoller().getBookmarkManager();
-            WeblogManager wmgr = RollerFactory.getRoller().getWeblogManager();
-            
-            // 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)
-        {
-            throw new RollerException(e);
-        }
+    
+    
+    public PermissionsData getPermissions(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 {
+            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 {
+            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 {
+            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 {
+            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 {
+            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;
     }
+    
 }