001    /**
002     * Copyright 2005-2011 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.rice.kew.actiontaken.dao.impl;
017    
018    import org.apache.ojb.broker.query.Criteria;
019    import org.apache.ojb.broker.query.QueryByCriteria;
020    import org.kuali.rice.kew.actionrequest.ActionRequestValue;
021    import org.kuali.rice.kew.actiontaken.ActionTakenValue;
022    import org.kuali.rice.kew.actiontaken.dao.ActionTakenDAO;
023    import org.springmodules.orm.ojb.support.PersistenceBrokerDaoSupport;
024    
025    import java.sql.Timestamp;
026    import java.util.Collection;
027    import java.util.List;
028    
029    
030    /**
031     * OJB implementation of the {@link ActionTakenDAO}.
032     *
033     * @author Kuali Rice Team (rice.collab@kuali.org)
034     */
035    public class ActionTakenDAOOjbImpl extends PersistenceBrokerDaoSupport implements ActionTakenDAO {
036    
037        private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(ActionTakenDAOOjbImpl.class);
038    
039        public ActionTakenValue load(String id) {
040            LOG.debug("Loading Action Taken for the given id " + id);
041            Criteria crit = new Criteria();
042            crit.addEqualTo("actionTakenId", id);
043            return (ActionTakenValue) this.getPersistenceBrokerTemplate().getObjectByQuery(new QueryByCriteria(ActionTakenValue.class, crit));
044        }
045    
046        public void deleteActionTaken(ActionTakenValue actionTaken) {
047            LOG.debug("deleting ActionTaken " + actionTaken.getActionTakenId());
048            this.getPersistenceBrokerTemplate().delete(actionTaken);
049        }
050    
051        public ActionTakenValue findByActionTakenId(String actionTakenId) {
052            LOG.debug("finding Action Taken by actionTakenId " + actionTakenId);
053            Criteria crit = new Criteria();
054            crit.addEqualTo("actionTakenId", actionTakenId);
055            crit.addEqualTo("currentIndicator", Boolean.TRUE);
056            return (ActionTakenValue) this.getPersistenceBrokerTemplate().getObjectByQuery(new QueryByCriteria(ActionTakenValue.class, crit));
057        }
058    
059        public Collection<ActionTakenValue> findByDocIdAndAction(String documentId, String action) {
060            LOG.debug("finding Action Taken by documentId " + documentId + " and action " + action);
061            Criteria crit = new Criteria();
062            crit.addEqualTo("documentId", documentId);
063            crit.addEqualTo("actionTaken", action);
064            crit.addEqualTo("currentIndicator", Boolean.TRUE);
065            return (Collection<ActionTakenValue>) this.getPersistenceBrokerTemplate().getCollectionByQuery(new QueryByCriteria(ActionTakenValue.class, crit));
066        }
067    
068        public Collection<ActionTakenValue> findByDocumentId(String documentId) {
069            LOG.debug("finding Action Takens by documentId " + documentId);
070            Criteria crit = new Criteria();
071            crit.addEqualTo("documentId", documentId);
072            crit.addEqualTo("currentIndicator", Boolean.TRUE);
073            return (Collection<ActionTakenValue>) this.getPersistenceBrokerTemplate().getCollectionByQuery(new QueryByCriteria(ActionTakenValue.class, crit));
074        }
075    
076        public List<ActionTakenValue> findByDocumentIdWorkflowId(String documentId, String principalId) {
077            LOG.debug("finding Action Takens by documentId " + documentId + " and principalId" + principalId);
078            Criteria crit = new Criteria();
079            crit.addEqualTo("documentId", documentId);
080            crit.addEqualTo("principalId", principalId);
081            crit.addEqualTo("currentIndicator", Boolean.TRUE);
082            return (List<ActionTakenValue>) this.getPersistenceBrokerTemplate().getCollectionByQuery(new QueryByCriteria(ActionTakenValue.class, crit));
083        }
084    
085        public List findByDocumentIdIgnoreCurrentInd(String documentId) {
086            LOG.debug("finding ActionsTaken ignoring currentInd by documentId:" + documentId);
087            Criteria crit = new Criteria();
088            crit.addEqualTo("documentId", documentId);
089            return (List) this.getPersistenceBrokerTemplate().getCollectionByQuery(new QueryByCriteria(ActionTakenValue.class, crit));
090        }
091    
092        public void saveActionTaken(ActionTakenValue actionTaken) {
093            LOG.debug("saving ActionTaken");
094            checkNull(actionTaken.getDocumentId(), "Document ID");
095            checkNull(actionTaken.getActionTaken(), "action taken code");
096            checkNull(actionTaken.getDocVersion(), "doc version");
097            checkNull(actionTaken.getPrincipal(), "user principalId");
098    
099            if (actionTaken.getActionDate() == null) {
100                actionTaken.setActionDate(new Timestamp(System.currentTimeMillis()));
101            }
102            if (actionTaken.getCurrentIndicator() == null) {
103                actionTaken.setCurrentIndicator(Boolean.TRUE);
104            }
105            LOG.debug("saving ActionTaken: routeHeader " + actionTaken.getDocumentId() +
106                    ", actionTaken " + actionTaken.getActionTaken() + ", principalId " + actionTaken.getPrincipalId());
107            this.getPersistenceBrokerTemplate().store(actionTaken);
108        }
109    
110        //TODO perhaps runtime isn't the best here, maybe a dao runtime exception
111        private void checkNull(Object value, String valueName) throws RuntimeException {
112            if (value == null) {
113                throw new RuntimeException("Null value for " + valueName);
114            }
115        }
116    
117        public void deleteByDocumentId(String documentId){
118                Criteria crit = new Criteria();
119                crit.addEqualTo("documentId", documentId);
120                this.getPersistenceBrokerTemplate().deleteByQuery(new QueryByCriteria(ActionRequestValue.class, crit));
121        }
122    
123        public boolean hasUserTakenAction(String principalId, String documentId) {
124            Criteria crit = new Criteria();
125                crit.addEqualTo("documentId", documentId);
126                crit.addEqualTo("principalId", principalId);
127                crit.addEqualTo("currentIndicator", Boolean.TRUE);
128            int count = getPersistenceBrokerTemplate().getCount(new QueryByCriteria(ActionTakenValue.class, crit));
129            return count > 0;
130        }
131    
132    }