001    /**
002     * Copyright 2005-2012 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.stats.dao.impl;
017    
018    import org.apache.ojb.broker.accesslayer.LookupException;
019    import org.kuali.rice.core.api.util.ConcreteKeyValue;
020    import org.kuali.rice.core.api.util.KeyValue;
021    import org.kuali.rice.kew.stats.Stats;
022    import org.kuali.rice.kew.stats.dao.StatsDAO;
023    import org.kuali.rice.kew.api.KewApiConstants;
024    
025    import javax.persistence.EntityManager;
026    import javax.persistence.PersistenceContext;
027    import javax.persistence.Query;
028    import java.sql.SQLException;
029    import java.sql.Timestamp;
030    import java.util.ArrayList;
031    import java.util.Calendar;
032    import java.util.Date;
033    import java.util.List;
034    
035    /**
036     * This is a description of what this class does - ddean don't forget to fill this in. 
037     * 
038     * @author Kuali Rice Team (rice.collab@kuali.org)
039     *
040     */
041    // There isn't an obvious place to put these @NamedQueries since they are just doing select count(*) from various tables.
042    // Thus I'm using the query literals in this class, move these NamedQuerys to wherever they need to go.
043    // @NamedQueries({
044    //    @NamedQuery(name="Stats.DocumentsRoutedReport",  query="select count(*) as count, drhv.docRouteStatus from DocumentRouteHeaderValue drhv where drhv.createDate between :beginDate and :endDate group by docRouteStatus"),
045    //    @NamedQuery(name="Stats.NumActiveItemsReport",  query="select count(*) from ActionItem ai"),
046    //    @NamedQuery(name="Stats.NumInitiatedDocsByDocTypeReport",  query="select count(*), dt.name from DocumentRouteHeaderValue drhv, DocumentType dt where drhv.createDate > :createDate and drhv.documentTypeId = dt.documentTypeId group by dt.name"),
047    //    @NamedQuery(name="Stats.NumUsersReport",  query="select count(distinct workflowId) from UserOptions uo"),
048    //    @NamedQuery(name="Stats.NumberOfDocTypesReport",  query="select count(*) from DocumentType dt where dt.currentInd = true")
049    //  })
050    public class StatsDaoJpaImpl implements StatsDAO {
051    
052        @PersistenceContext
053        private EntityManager entityManager;
054        
055        @Override
056            public void DocumentsRoutedReport(Stats stats, Date begDate, Date endDate) throws SQLException, LookupException {
057            Query query = entityManager.createQuery("select count(*) as count, drhv.docRouteStatus from DocumentRouteHeaderValue drhv where drhv.createDate between :beginDate and :endDate group by docRouteStatus");
058    //        Query query = entityManager.createNamedQuery("Stats.DocumentsRoutedReport");
059            query.setParameter("beginDate", new Timestamp(begDate.getTime()));
060            query.setParameter("endDate", new Timestamp(endDate.getTime()));
061            
062            @SuppressWarnings("unchecked")
063            List<Object[]> resultList = query.getResultList();
064            
065            for (Object[] result : resultList) {
066                String actionType = result[1].toString();
067                String number = result[0].toString();
068                if (actionType.equals(KewApiConstants.ROUTE_HEADER_CANCEL_CD)) {
069                    stats.setCanceledNumber(number);
070                } else if (actionType.equals(KewApiConstants.ROUTE_HEADER_DISAPPROVED_CD)) {
071                    stats.setDisapprovedNumber(number);
072                } else if (actionType.equals(KewApiConstants.ROUTE_HEADER_ENROUTE_CD)) {
073                    stats.setEnrouteNumber(number);
074                } else if (actionType.equals(KewApiConstants.ROUTE_HEADER_EXCEPTION_CD)) {
075                    stats.setExceptionNumber(number);
076                } else if (actionType.equals(KewApiConstants.ROUTE_HEADER_FINAL_CD)) {
077                    stats.setFinalNumber(number);
078                } else if (actionType.equals(KewApiConstants.ROUTE_HEADER_INITIATED_CD)) {
079                    stats.setInitiatedNumber(number);
080                } else if (actionType.equals(KewApiConstants.ROUTE_HEADER_PROCESSED_CD)) {
081                    stats.setProcessedNumber(number);
082                } else if (actionType.equals(KewApiConstants.ROUTE_HEADER_SAVED_CD)) {
083                    stats.setSavedNumber(number);
084                }
085            }
086        }
087    
088        @Override
089            public void NumActiveItemsReport(Stats stats) throws SQLException, LookupException {
090            stats.setNumActionItems(entityManager.createQuery("select count(*) from ActionItem ai").getSingleResult().toString());
091    //        stats.setNumActionItems(entityManager.createNamedQuery("Stats.NumActiveItemsReport").getSingleResult().toString());
092        }
093    
094        @Override
095            public void NumInitiatedDocsByDocTypeReport(Stats stats) throws SQLException, LookupException {
096            Query query = entityManager.createQuery("select count(*), dt.name from DocumentRouteHeaderValue drhv, DocumentType dt where drhv.createDate > :createDate and drhv.documentTypeId = dt.documentTypeId group by dt.name");
097    //        Query query = entityManager.createNamedQuery("Stats.NumInitiatedDocsByDocTypeReport");
098            Calendar calendar = Calendar.getInstance();
099            calendar.add(Calendar.DAY_OF_YEAR, -29);
100            calendar.set(Calendar.HOUR_OF_DAY, 0);
101            calendar.set(Calendar.MINUTE, 0);
102            calendar.set(Calendar.SECOND, 0);
103            calendar.set(Calendar.MILLISECOND, 0);        
104            query.setParameter("createDate", new Timestamp(calendar.getTime().getTime()));
105            
106            @SuppressWarnings("unchecked")
107            List<Object[]> resultList = query.getResultList();
108            
109            List<KeyValue> numDocs = new ArrayList<KeyValue>(resultList.size());
110            for (Object[] result : resultList) {
111                numDocs.add(new ConcreteKeyValue(result[1].toString(),result[0].toString()));
112            }
113            
114            stats.setNumInitiatedDocsByDocType(numDocs);
115        }
116    
117        @Override
118            public void NumUsersReport(Stats stats) throws SQLException, LookupException {
119            stats.setNumUsers(entityManager.createQuery("select count(distinct uo.workflowId) from UserOptions uo").getSingleResult().toString());
120    //        stats.setNumUsers(entityManager.createNamedQuery("Stats.NumUsersReport").getSingleResult().toString());
121        }
122    
123        @Override
124            public void NumberOfDocTypesReport(Stats stats) throws SQLException, LookupException {
125            stats.setNumDocTypes(entityManager.createQuery("select count(*) from DocumentType dt where dt.currentInd = true").getSingleResult().toString());
126    //        stats.setNumDocTypes(entityManager.createNamedQuery("Stats.NumberOfDocTypesReport").getSingleResult().toString());
127        }
128    
129        public EntityManager getEntityManager() {
130            return this.entityManager;
131        }
132    
133        public void setEntityManager(EntityManager entityManager) {
134            this.entityManager = entityManager;
135        }
136    
137    }