org.kimios.kernel.dms.hibernate.HWorkflowStatusFactory.java Source code

Java tutorial

Introduction

Here is the source code for org.kimios.kernel.dms.hibernate.HWorkflowStatusFactory.java

Source

/*
 * Kimios - Document Management System Software
 * Copyright (C) 2012-2013  DevLib'
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 2 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.kimios.kernel.dms.hibernate;

import java.util.List;
import java.util.Vector;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.kimios.exceptions.ConfigException;
import org.kimios.kernel.dms.Workflow;
import org.kimios.kernel.dms.WorkflowStatus;
import org.kimios.kernel.dms.WorkflowStatusFactory;
import org.kimios.kernel.exception.DataSourceException;
import org.kimios.kernel.hibernate.HFactory;

public class HWorkflowStatusFactory extends HFactory implements WorkflowStatusFactory {
    public HWorkflowStatusFactory() {
    }

    public void deleteWorkflowStatus(WorkflowStatus wfs) throws ConfigException, DataSourceException {
        try {
            WorkflowStatus prev = wfs.getPredecessor();
            if (prev != null) {
                prev.setSuccessor(wfs.getSuccessor());
                this.changeWorkflowStatus(prev);
            }
            getSession().delete(wfs);
            getSession().flush();
        } catch (HibernateException he) {
            throw new DataSourceException(he);
        }
    }

    public WorkflowStatus getPreviousWorkflowStatus(WorkflowStatus wfs)
            throws ConfigException, DataSourceException {
        try {
            Criteria c = getSession().createCriteria(WorkflowStatus.class)
                    .add(Restrictions.eq("successorUid", wfs.getUid()));
            WorkflowStatus prev = (WorkflowStatus) c.uniqueResult();
            return prev;
        } catch (HibernateException he) {
            throw new DataSourceException(he);
        }
    }

    public WorkflowStatus getEndWorkflowStatus(Workflow wf) throws ConfigException, DataSourceException {
        try {
            //Pas de successeur
            DetachedCriteria successorList = DetachedCriteria.forClass(WorkflowStatus.class)
                    .add(Restrictions.isNull("successorUid")).add(Restrictions.eq("workflowUid", wf.getUid()));
            WorkflowStatus end = (WorkflowStatus) successorList.getExecutableCriteria(getSession()).uniqueResult();
            return end;
        } catch (HibernateException he) {
            throw new DataSourceException(he);
        }
    }

    public WorkflowStatus getStartWorkflowStatus(Workflow wf) throws ConfigException, DataSourceException {
        try {
            //Liste des successeurs
            DetachedCriteria successorList = DetachedCriteria.forClass(WorkflowStatus.class)
                    .add(Restrictions.isNotNull("successorUid")).add(Restrictions.eq("workflowUid", wf.getUid()));

            List<WorkflowStatus> lSList = successorList.getExecutableCriteria(getSession()).list();

            //Liste des status
            List<WorkflowStatus> list = getSession().createCriteria(WorkflowStatus.class)
                    .add(Restrictions.eq("workflowUid", wf.getUid())).list();
            //Not In
            list.removeAll(lSList);
            return list.get(0);
        } catch (HibernateException he) {
            throw he;
        }
    }

    public WorkflowStatus getWorkflowStatus(long uid) throws ConfigException, DataSourceException {
        try {
            WorkflowStatus wfs = (WorkflowStatus) getSession().get(WorkflowStatus.class, new Long(uid));
            return wfs;
        } catch (HibernateException he) {
            throw new DataSourceException(he);
        }
    }

    public Vector<WorkflowStatus> getWorkflowStatuses(Workflow wf) throws ConfigException, DataSourceException {
        try {
            Vector<WorkflowStatus> vWfStatus = new Vector<WorkflowStatus>();
            Criteria c = getSession().createCriteria(WorkflowStatus.class)
                    .add(Restrictions.eq("workflowUid", wf.getUid())).add(Restrictions.isNull("successorUid"));
            List<WorkflowStatus> lWfs = c.list();
            while (lWfs.size() > 0) {
                WorkflowStatus wfs = lWfs.get(0);
                vWfStatus.add(0, wfs);
                c = getSession().createCriteria(WorkflowStatus.class)
                        .add(Restrictions.eq("workflowUid", new Long(wf.getUid())))
                        .add(Restrictions.eq("successorUid", wfs.getUid()));
                lWfs = c.list();
            }
            return vWfStatus;
        } catch (HibernateException he) {
            throw he;
        }
    }

    public long saveWorkflowStatus(WorkflowStatus wfs) throws ConfigException, DataSourceException {
        try {
            if (wfs.getSuccessorUid() != null && wfs.getSuccessorUid() == -1) {
                wfs.setSuccessorUid(null);
            }
            getSession().save(wfs);
            getSession().flush();
            return wfs.getUid();
        } catch (HibernateException he) {
            throw new DataSourceException(he);
        }
    }

    public void updateWorkflowStatus(WorkflowStatus wfs, Vector<WorkflowStatus> vOrdered, int pos)
            throws ConfigException, DataSourceException {

        if (pos == vOrdered.size() - 1) {
            wfs.setSuccessorUid(null);
            wfs.setSuccessor(null);
        } else {
            WorkflowStatus next = vOrdered.elementAt(pos + 1);
            wfs.setSuccessorUid(next.getUid());
        }
        if (wfs.getUid() == -1) {
            this.saveWorkflowStatus(wfs);
        } else {
            this.changeWorkflowStatus(wfs);
        }
    }

    public void changeWorkflowStatus(WorkflowStatus wfs) throws ConfigException, DataSourceException {
        try {
            wfs = (WorkflowStatus) getSession().merge(wfs);
            getSession().update(wfs);
            getSession().flush();
        } catch (HibernateException he) {
            throw new DataSourceException(he);
        }
    }
}