001/**
002 * Copyright 2005-2016 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 */
016package org.kuali.rice.krad.dao.impl;
017
018import java.util.List;
019
020import javax.persistence.EntityManager;
021import javax.persistence.PersistenceContext;
022
023import org.apache.commons.lang.StringUtils;
024import org.kuali.rice.core.framework.persistence.jpa.criteria.Criteria;
025import org.kuali.rice.core.framework.persistence.jpa.criteria.QueryByCriteria;
026import org.kuali.rice.core.framework.persistence.jpa.criteria.QueryByCriteria.QueryByCriteriaType;
027import org.kuali.rice.krad.dao.MaintenanceDocumentDao;
028import org.kuali.rice.krad.maintenance.MaintenanceLock;
029import org.kuali.rice.krad.util.KRADPropertyConstants;
030
031/**
032 * This class is the JPA implementation of the MaintenanceDocumentDao interface.
033 */
034public class MaintenanceDocumentDaoJpa implements MaintenanceDocumentDao {
035
036//      private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(MaintenanceDocumentDaoJpa.class);
037
038        @PersistenceContext
039        private EntityManager entityManager;
040        
041        /**
042         * @see org.kuali.rice.krad.dao.MaintenanceDocumentDao#getLockingDocumentNumber(java.lang.String, java.lang.String)
043         */
044        public String getLockingDocumentNumber(String lockingRepresentation, String documentNumber) {
045                String lockingDocNumber = "";
046
047                // build the query criteria
048                Criteria criteria = new Criteria(MaintenanceLock.class.getName());
049                criteria.eq("lockingRepresentation", lockingRepresentation);
050
051                // if a docHeaderId is specified, then it will be excluded from the
052                // locking representation test.
053                if (StringUtils.isNotBlank(documentNumber)) {
054                        criteria.ne(KRADPropertyConstants.DOCUMENT_NUMBER, documentNumber);
055                }
056
057                // attempt to retrieve a document based off this criteria
058                MaintenanceLock maintenanceLock = (MaintenanceLock) new QueryByCriteria(entityManager, criteria).toQuery().getSingleResult();
059
060                // if a document was found, then there's already one out there pending,
061                // and we consider it 'locked' and we return the docnumber.
062                if (maintenanceLock != null) {
063                        lockingDocNumber = maintenanceLock.getDocumentNumber();
064                }
065                return lockingDocNumber;
066        }
067
068//      /**
069//       * Returns all pending maintenance documents locked by the given business object class.
070//       */
071//      public Collection getPendingDocumentsForClass(Class dataObjectClass) {
072//              Criteria criteria = new Criteria(MaintenanceLock.class.getName());
073//              criteria.like("lockingRepresentation", "%" + dataObjectClass.getName() + "%");
074//
075//              Collection maintenanceLocks = new QueryByCriteria(entityManager, criteria).toQuery().getResultList();
076//              if (!maintenanceLocks.isEmpty()) {
077//                      criteria = new Criteria(MaintenanceDocumentBase.class.getName());
078//                      List<String> documentNumbers = new ArrayList<String>();
079//
080//                      for (Object maintenanceLock : maintenanceLocks) {
081//                              documentNumbers.add(((MaintenanceLock) maintenanceLock).getDocumentNumber());
082//                      }
083//                      criteria.in("documentNumber", documentNumbers);
084//
085//                      return new QueryByCriteria(entityManager, criteria).toQuery().getResultList();
086//              } else {
087//                      return maintenanceLocks;
088//              }
089//      }
090
091        /**
092         * @see org.kuali.rice.krad.dao.MaintenanceDocumentDao#deleteLocks(java.lang.String)
093         */
094        public void deleteLocks(String documentNumber) {
095                Criteria criteria = new Criteria(MaintenanceLock.class.getName());
096                criteria.eq("documentNumber", documentNumber);
097                new QueryByCriteria(entityManager, criteria, QueryByCriteriaType.DELETE).toQuery().executeUpdate();
098        }
099
100        /**
101         * @see org.kuali.rice.krad.dao.MaintenanceDocumentDao#storeLocks(java.util.List)
102         */
103        public void storeLocks(List<MaintenanceLock> maintenanceLocks) {
104                for (MaintenanceLock maintenanceLock : maintenanceLocks) {
105                        entityManager.merge(maintenanceLock);
106                }
107        }
108
109    /**
110     * @return the entityManager
111     */
112    public EntityManager getEntityManager() {
113        return this.entityManager;
114    }
115
116    /**
117     * @param entityManager the entityManager to set
118     */
119    public void setEntityManager(EntityManager entityManager) {
120        this.entityManager = entityManager;
121    }
122
123}