Subversion Repositories general

Rev

Rev 1018 | Rev 1041 | 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.CollectionInfo;
import ak.hostadmiral.util.HibernateUtil;
import ak.hostadmiral.util.ModelException;
import ak.hostadmiral.util.ModelSecurityException;

public class InetDomainManager
        implements
                UserBeforeDeleteListener,
                UserDeletingListener
{
        private static InetDomainManager inetDomainManager = null;
        private static boolean registered = false;

        public static InetDomainManager getInstance()
        {
                return inetDomainManager;
        }

        protected static void register()
        {
                synchronized(InetDomainManager.class) {
                        if(registered) return;

                        registered = true;
                        try {
                                HibernateUtil.getConfiguration().addResource(
                                        "ak/hostadmiral/core/model/InetDomain.hbm.xml");

                                inetDomainManager = new InetDomainManager();
                        }
                        catch(Exception ex) {
                                ex.printStackTrace();
                                throw new RuntimeException(ex.getMessage());
                        }
                }
        }

        static {
                register();
        }

        private Collection createdListeners      = new ArrayList();
        private Collection modifiedListeners     = new ArrayList();
        private Collection beforeDeleteListeners = new ArrayList();
        private Collection deletingListeners     = new ArrayList();
        private Collection deletedListeners      = new ArrayList();

        private InetDomainManager()
        {
                UserManager.getInstance().addBeforeDeleteListener(this);
                UserManager.getInstance().addDeletingListener(this);
        }

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

                return new InetDomain();
        }

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

        public InetDomain get(User editor, Long id)
                throws ModelException
        {
                InetDomain domain;

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

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

                return domain;
        }

        public boolean nameExists(User editor, InetDomain domain, String name)
                throws ModelException
        {
                try {
                        if(domain.getId() == null)
                                return ((Integer)HibernateUtil.currentSession().iterate(
                                        "select count(*) from InetDomain d where name = ?",
                                        name, Hibernate.STRING)
                                        .next()).intValue() > 0;
                        else
                                return ((Integer)HibernateUtil.currentSession().iterate(
                                        "select count(*) from InetDomain d where name = ? and d != ?",
                                        new Object[] { name, domain },
                                        new Type[] { Hibernate.STRING, Hibernate.entity(InetDomain.class) } )
                                        .next()).intValue() > 0;
                }
                catch(HibernateException ex)
                {
                        throw new ModelException(ex);
                }
        }

        protected InetDomain findForName(String name)
                throws ModelException
        {
                try {
                        List list = HibernateUtil.currentSession().find(
                                "select d from InetDomain d left join fetch d.owner where d.name=?",
                                name, Hibernate.STRING);

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

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

        boolean isNew = domain.isNew();

                //domain.setModUser(editor); // FIXME

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

        // inform listeners
        if(isNew) {
                for(Iterator i = createdListeners.iterator(); i.hasNext(); ) {
                        InetDomainCreatedListener listener = (InetDomainCreatedListener)i.next();
                        listener.inetDomainCreated(editor, domain);
                }
        }
        else {
            InetDomain oldDomain = domain.getOrigin();
            if(oldDomain == null) oldDomain = domain;
                for(Iterator i = modifiedListeners.iterator(); i.hasNext(); ) {
                        InetDomainModifiedListener listener = (InetDomainModifiedListener)i.next();
                        listener.inetDomainModified(editor, domain, oldDomain);
                }
        }
        }

    public void addCreatedListener(InetDomainCreatedListener listener)
    {
        createdListeners.add(listener);
    }

    public void removeCreatedListener(InetDomainCreatedListener listener)
    {
        createdListeners.remove(listener);
    }

    public void addModifiedListener(InetDomainModifiedListener listener)
    {
        modifiedListeners.add(listener);
    }

    public void removeModifiedListener(InetDomainModifiedListener listener)
    {
        modifiedListeners.remove(listener);
    }

    public void addBeforeDeleteListener(InetDomainBeforeDeleteListener listener)
    {
        beforeDeleteListeners.add(listener);
    }

    public void removeBeforeDeleteListener(InetDomainBeforeDeleteListener listener)
    {
        beforeDeleteListeners.remove(listener);
    }

    public void addDeletingListener(InetDomainDeletingListener listener)
    {
        deletingListeners.add(listener);
    }

    public void removeDeletingListener(InetDomainDeletingListener listener)
    {
        deletingListeners.remove(listener);
    }

    public void addDeletedListener(InetDomainDeletedListener listener)
    {
        deletedListeners.add(listener);
    }

    public void removeDeletedListener(InetDomainDeletedListener listener)
    {
        deletedListeners.remove(listener);
    }

    public Collection beforeDelete(User editor, InetDomain domain, Collection known)
                throws ModelException
    {
        Collection cascade = new ArrayList();

        for(Iterator i = beforeDeleteListeners.iterator(); i.hasNext(); ) {
                InetDomainBeforeDeleteListener listener = (InetDomainBeforeDeleteListener)i.next();
                        Collection subcascade = listener.inetDomainBeforeDelete(editor, domain, known);
                if(subcascade != null)
                        cascade.addAll(subcascade);
        }

        return cascade;
    }

        public void delete(User editor, InetDomain domain)
                throws ModelException
        {
            // check rights
                if(!domain.deleteableBy(editor))
                        throw new ModelSecurityException();

        // inform deleting listeners
        for(Iterator i = deletingListeners.iterator(); i.hasNext(); ) {
                InetDomainDeletingListener listener = (InetDomainDeletingListener)i.next();
                        listener.inetDomainDeleting(editor, domain);
        }

        // backup copy
        InetDomain oldDomain = new InetDomain(domain);

        // delete it
                try {

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

        // inform deleted listeners
        for(Iterator i = deletedListeners.iterator(); i.hasNext(); ) {
                InetDomainDeletedListener listener = (InetDomainDeletedListener)i.next();
                        listener.inetDomainDeleted(editor, oldDomain);
        }
        }

        public Collection listInetDomains(User editor)
                throws ModelException
        {
                return listInetDomains(null, 0, 0, null, editor);
        }

        public Collection listInetDomains(CollectionInfo info, int rowsPerPage, int pageNumber,
                        Integer[] sortingKeys, User editor)
                throws ModelException
        {
                try {
                        if(editor.isSuperuser()) {
                                if(info != null) {
                                        info.init(((Integer)HibernateUtil.currentSession().iterate(
                                                "select count(*) from InetDomain").next()).intValue(),
                                                pageNumber, rowsPerPage);
                                }


                                return HibernateUtil.pageableList(rowsPerPage, pageNumber,
                                        "select d from InetDomain d left join fetch d.owner"
                                        + HibernateUtil.formOrderClause(sortingKeys, sortKeys), null, null);
                        }
                        else {
                                if(info != null) {
                                        info.init(((Integer)HibernateUtil.currentSession().iterate(
                                                "select count(*) from InetDomain where d.owner=?",
                                                editor, Hibernate.entity(User.class)).next()).intValue(),
                                                pageNumber, rowsPerPage);
                                }

                                return HibernateUtil.pageableList(rowsPerPage, pageNumber,
                                        "select d from InetDomain d where d.owner=?"
                                        + HibernateUtil.formOrderClause(sortingKeys, sortKeys),
                                        new Object[] { editor }, new Type[] { Hibernate.entity(User.class) } );
                        }
                }
                catch(HibernateException ex)
                {
                        throw new ModelException(ex);
                }
        }

        public boolean areInetDomainsAvailable(User editor)
                throws ModelException
        {
                try {
                        if(editor.isSuperuser())
                                return true;
                        else
                                return ((Integer)HibernateUtil.currentSession().iterate(
                                        "select count(*) from InetDomain where owner=?",
                                        editor, Hibernate.entity(User.class)).next()).intValue() > 0;
                }
                catch(HibernateException ex)
                {
                        throw new ModelException(ex);
                }
        }

        public Collection userBeforeDelete(User editor, User user, Collection known)
                throws ModelException
        {
        Collection domains;

                try {
                        domains = HibernateUtil.currentSession().find(
                                "select d from InetDomain d where d.owner = ?",
                                user, Hibernate.entity(User.class) );
                }
                catch(HibernateException ex)
                {
                        throw new ModelException(ex);
                }

        Collection cascade = new ArrayList();
                for(Iterator i = domains.iterator(); i.hasNext(); ) {
                        InetDomain d = (InetDomain)i.next();
            if(d.viewableBy(editor)) {
                                if(d.deleteableBy(editor))
                                        cascade.add(new CascadeDeleteElement(d, CascadeDeleteElement.DELETE,
                                                this.beforeDelete(editor, d, known)));
                                else
                                        cascade.add(new CascadeDeleteElement(d, CascadeDeleteElement.FORBIDDEN, null));
                        }
                        else {
                                cascade.add(new CascadeDeleteElement(InetDomain.createLimitedCopy(d),
                                        CascadeDeleteElement.FORBIDDEN, null));
                        }
                }

        return cascade;
        }

        public void userDeleting(User editor, User user)
                throws ModelException
        {
        Collection domains;

                try {
                        domains = HibernateUtil.currentSession().find(
                                "select d from InetDomain d where d.owner = ?",
                                user, Hibernate.entity(User.class) );
                }
                catch(HibernateException ex)
                {
                        throw new ModelException(ex);
                }

                for(Iterator i = domains.iterator(); i.hasNext(); ) {
                        delete(editor, (InetDomain)i.next());
                }
        }

        public static final Integer SORT_NAME = new Integer(1);

        protected static Map sortKeys = new HashMap();

        static {
                sortKeys.put(SORT_NAME, "d.name");
        }

        public static final Comparator NAME_COMPARATOR = new NameComparator();

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

                    InetDomain a1 = (InetDomain)o1;
                    InetDomain a2 = (InetDomain)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.getName().compareToIgnoreCase(a2.getName());
                }

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