Subversion Repositories general

Rev

Rev 925 | Rev 949 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

package ak.hostadmiral.core.model;

import java.util.*;
import net.sf.hibernate.*;
import net.sf.hibernate.type.Type;
import ak.hostadmiral.util.HibernateUtil;
import ak.hostadmiral.util.ModelException;
import ak.hostadmiral.util.ModelSecurityException;

public class MailboxManager
{
        private static boolean registered = false;
        protected static void register()
        {
                synchronized(MailboxManager.class) {
                        if(registered) return;

                        registered = true;
                        try {
                                HibernateUtil.getConfiguration().addResource(
                                        "/ak/hostadmiral/core/model/Mailbox.hbm.xml");
                        }
                        catch(Exception ex) {
                                ex.printStackTrace();
                                throw new RuntimeException(ex.getMessage());
                        }
                }
        }

        static {
                register();
        }

        private MailboxManager()
        {
        }

        public Mailbox create(User editor)
                throws ModelException
        {
                if(!allowedToCreate(editor)) throw new ModelSecurityException();

                return new Mailbox();
        }

        public boolean allowedToCreate(User editor)
                throws ModelException
        {
                return Mailbox.allowedToCreate(this, editor);
        }

        public Mailbox get(User editor, Long id)
                throws ModelException
        {
                Mailbox mailbox;

                try {
                        mailbox = (Mailbox)HibernateUtil.currentSession().load(Mailbox.class, id);
                }
                catch(HibernateException ex)
                {
                        throw new ModelException(ex);
                }

                if(!mailbox.viewableBy(editor))
                        throw new ModelSecurityException();

                return mailbox;
        }

        public boolean loginExists(User editor, Mailbox mailbox, String login)
                throws ModelException
        {
                if(mailbox.getDomain() == null)
                        throw new ModelException("Cannot check unique login for mailbox without domain");

                try {
                        if(mailbox.getId() == null)
                                return ((Integer)HibernateUtil.currentSession().iterate(
                                        "select count(*) from Mailbox where login = ? and domain = ?",
                                        new Object[] { login, mailbox.getDomain() },
                                        new Type[] { Hibernate.STRING, Hibernate.entity(InetDomain.class) } )
                                        .next()).intValue() > 0;
                        else
                                return ((Integer)HibernateUtil.currentSession().iterate(
                                        "select count(*) from Mailbox b where login = ? and domain = ? and b != ?",
                                        new Object[] { login, mailbox.getDomain(), mailbox },
                                        new Type[] { Hibernate.STRING, Hibernate.entity(InetDomain.class),
                                                Hibernate.entity(Mailbox.class) } )
                                        .next()).intValue() > 0;
                }
                catch(HibernateException ex)
                {
                        throw new ModelException(ex);
                }
        }

        protected Mailbox findForLogin(String login)
                throws ModelException
        {
                try {
                        List list = HibernateUtil.currentSession().find(
                                "from Mailbox where login=?", login, Hibernate.STRING);

                        if(list.size() == 0)
                                return null;
                        else
                                return (Mailbox)list.get(0);
                }
                catch(HibernateException ex)
                {
                        throw new ModelException(ex);
                }
        }

        public void save(User editor, Mailbox mailbox)
                throws ModelException
        {
                if(!mailbox.editableBy(editor))
                        throw new ModelSecurityException();

                mailbox.setModUser(editor);

                try {
                        HibernateUtil.currentSession().saveOrUpdate(mailbox);
                }
                catch(HibernateException ex)
                {
                        throw new ModelException(ex);
                }
        }

        public void delete(User editor, Mailbox mailbox)
                throws ModelException
        {
                if(!mailbox.deleteableBy(editor))
                        throw new ModelSecurityException();

                try {
                        HibernateUtil.currentSession().delete(mailbox);
                }
                catch(HibernateException ex)
                {
                        throw new ModelException(ex);
                }
        }

        public Collection listMailboxes(User editor)
                throws ModelException
        {
                try {
                        if(editor.isSuperuser())
                                return HibernateUtil.currentSession().find("from Mailbox");
                        else
                                return HibernateUtil.currentSession().find(
                                        "select mb from Mailbox mb left join mb.domain as d"
                                        + " where d.owner=? or mb.owner=?",
                                        new Object[] { editor, editor },
                                        new Type[] { Hibernate.entity(User.class), Hibernate.entity(User.class) } );
                }
                catch(HibernateException ex)
                {
                        throw new ModelException(ex);
                }
        }

        public boolean areMailboxesAvailable(User editor)
                throws ModelException
        {
                try {
                        if(editor.isSuperuser()
                                || InetDomainManager.getInstance().areInetDomainsAvailable(editor))
                        {
                                return true;
                        }
                        else {
                                return ((Integer)HibernateUtil.currentSession().iterate(
                                        "select count(*) from Mailbox mb left join mb.domain as d"
                                        + " where d.owner=? or mb.owner=?",
                                        new Object[] { editor, editor },
                                        new Type[] { Hibernate.entity(User.class), Hibernate.entity(User.class) })
                                        .next()).intValue() > 0;
                        }
                }
                catch(HibernateException ex)
                {
                        throw new ModelException(ex);
                }
        }

        private static MailboxManager mailboxManager = null;

        public static MailboxManager getInstance()
        {
                if(mailboxManager == null)
                        mailboxManager = new MailboxManager();

                return mailboxManager;
        }

        public static final Comparator LOGIN_COMPARATOR = new LoginComparator();

        private static class LoginComparator
                implements Comparator
        {
                public int compare(Object o1, Object o2)
                {
                        if(!(o1 instanceof Mailbox) || !(o2 instanceof Mailbox))
                                throw new ClassCastException("not a Mailbox");

                    Mailbox a1 = (Mailbox)o1;
                    Mailbox a2 = (Mailbox)o2;

                    if(a1 == null && a2 == null)
                        return 0;
                    else if(a1 == null && a2 != null)
                        return -1;
                    else if(a1 != null && a2 == null)
                        return 1;
                    else
                        return a1.getLogin().compareToIgnoreCase(a2.getLogin());
                }

                public boolean equals(Object obj)
                {
                        return (obj instanceof LoginComparator);
                }
        }
}