View Javadoc
1   package org.kuali.ole.deliver.rule;
2   
3   
4   import org.kuali.ole.OLEConstants;
5   import org.kuali.ole.deliver.bo.OleCirculationDesk;
6   import org.kuali.ole.deliver.bo.OleCirculationDeskDetail;
7   import org.kuali.ole.deliver.bo.OleCirculationDeskLocation;
8   import org.kuali.ole.describe.bo.OleLocation;
9   import org.kuali.rice.core.api.criteria.QueryByCriteria;
10  import org.kuali.rice.kns.service.KNSServiceLocator;
11  import org.kuali.rice.krad.maintenance.MaintenanceDocument;
12  import org.kuali.rice.krad.rules.MaintenanceDocumentRuleBase;
13  import org.kuali.rice.krad.service.KRADServiceLocator;
14  
15  import java.util.ArrayList;
16  import java.util.HashMap;
17  import java.util.List;
18  import java.util.Map;
19  
20  /**
21   * OleCirculationDeskRule validates maintenance object for Circulation Desk Maintenance Document
22   */
23  public class OleCirculationDeskRule extends MaintenanceDocumentRuleBase {
24  
25      /**
26       * @param document
27       * @return boolean
28       */
29  
30      protected boolean processCustomSaveDocumentBusinessRules(MaintenanceDocument document) {
31          boolean isValid = true;
32          OleCirculationDesk circulationDesk = (OleCirculationDesk) document.getNewMaintainableObject().getDataObject();
33          String circulationDeskAction = document.getOldMaintainableObject().getMaintenanceAction();
34  
35          isValid &= validateCirculationDeskCode(circulationDeskAction, circulationDesk);
36          isValid &= validateCirculationDeskBeforeEdit(circulationDeskAction, circulationDesk);
37          return isValid;
38      }
39  
40      /**
41       * This method  validates duplicate circulation Desk Code and return boolean value.
42       *
43       * @param circulationDesk
44       * @return boolean
45       */
46      private boolean validateCirculationDeskCode(String circulationDeskAction, OleCirculationDesk circulationDesk) {
47          if (circulationDesk.getCirculationDeskCode() != null) {
48              Map<String, String> criteria = new HashMap<String, String>();
49              criteria.put(OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_CD, circulationDesk.getCirculationDeskCode());
50              List<OleCirculationDesk> circulationDeskInDatabase = (List<OleCirculationDesk>) KRADServiceLocator.getDataObjectService().findMatching(OleCirculationDesk.class, QueryByCriteria.Builder.andAttributes(criteria).build()).getResults();
51              if ((circulationDeskInDatabase.size() > 0)) {
52                  for (OleCirculationDesk circulationDeskObj : circulationDeskInDatabase) {
53                      String circulationDeskId = circulationDeskObj.getCirculationDeskId();
54                      if (null == circulationDesk.getCirculationDeskId() || !(circulationDesk.getCirculationDeskId().equalsIgnoreCase(circulationDeskId))) {
55                          this.putFieldError(OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_CODE, OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_CD_EXIST);
56                          return false;
57                      }
58                  }
59              }
60          }
61          if (circulationDesk.getOleCirculationDeskLocations().size() == 0) {
62              this.putFieldError(OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION, OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION_ERROR);
63              return false;
64          }
65          List<String> locationCodes = new ArrayList<String>();
66          for (OleCirculationDeskLocation oleCirculationDeskLocation : circulationDesk.getOleCirculationDeskLocations()) {
67              if (oleCirculationDeskLocation.getCirculationDeskLocation() == null) {
68                  Map<String, String> map = new HashMap<String, String>();
69                  map.put(OLEConstants.LOC_CD, oleCirculationDeskLocation.getCirculationLocationCode());
70                  OleLocation oleLocation = KRADServiceLocator.getDataObjectService().find(OleLocation.class, oleCirculationDeskLocation.getCirculationFullLocationCode());
71                  oleCirculationDeskLocation.setLocation(oleLocation);
72                  oleCirculationDeskLocation.setCirculationDeskLocation(oleLocation != null ? oleLocation.getLocationId() : null);
73              }
74              locationCodes.add(oleCirculationDeskLocation.getCirculationLocationCode());
75          }
76          List<OleLocation> oleLocations = (List<OleLocation>) KRADServiceLocator.getDataObjectService().findMatching(OleLocation.class, QueryByCriteria.Builder.create().build()).getResults();
77          List<String> validLocationCodes = new ArrayList<String>();
78          for (OleLocation oleLocation : oleLocations) {
79              for (String locationCode : locationCodes) {
80                  if (oleLocation.getLocationCode().equals(locationCode))
81                      validLocationCodes.add(locationCode);
82              }
83          }
84          if (validLocationCodes.size() != locationCodes.size()) {
85              this.putFieldError(OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION, OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION_VALID_ERROR);
86              return false;
87          }
88          for (String locationCode : locationCodes) {
89              boolean duplicate = false;
90              for (String dupLocationCode : validLocationCodes) {
91                  if (locationCode.equalsIgnoreCase(dupLocationCode)) {
92                      if (duplicate) {
93                          this.putFieldError(OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION, OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION_DUPLICATE_ERROR);
94                          return false;
95                      }
96                      duplicate = true;
97                  }
98              }
99          }
100         for (OleCirculationDeskLocation oleCirculationDeskLocation : circulationDesk.getOleCirculationDeskLocations()) {
101             Map<String, String> circDeskLocation = new HashMap<String, String>();
102             circDeskLocation.put(OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION, oleCirculationDeskLocation.getCirculationDeskLocation());
103             List<OleCirculationDeskLocation> circulationDeskLocationInDatabase = (List<OleCirculationDeskLocation>) KRADServiceLocator.getDataObjectService().findMatching(OleCirculationDeskLocation.class, QueryByCriteria.Builder.andAttributes(circDeskLocation).build()).getResults();
104             if ((circulationDeskLocationInDatabase.size() > 0)) {
105                 if (!circulationDeskAction.equalsIgnoreCase(OLEConstants.OleCirculationDesk.COPY)) {
106                     if (!(circulationDeskLocationInDatabase.get(0).getCirculationDeskId().equalsIgnoreCase(oleCirculationDeskLocation.getCirculationDeskId()))) {
107                         this.putFieldError(OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION, OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION_MAPPED_ERROR);
108                         return false;
109                     }
110                 } else {
111                     this.putFieldError(OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION, OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION_MAPPED_ERROR);
112                     return false;
113                 }
114             }
115         }
116         return true;
117     }
118 
119     /**
120      * This method is to check whether the circulation desk is having any dependency to the operator before de-activating the document
121      *
122      * @param circulationDeskAction
123      * @param circulationDesk
124      * @return boolen
125      */
126     private boolean validateCirculationDeskBeforeEdit(String circulationDeskAction, OleCirculationDesk circulationDesk) {
127         if (circulationDeskAction.equalsIgnoreCase(OLEConstants.OleCirculationDesk.EDIT)) {
128             Map<String, String> circulationDeskIdMap = new HashMap<String, String>();
129             circulationDeskIdMap.put(OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_ID, circulationDesk.getCirculationDeskId());
130             List<OleCirculationDeskDetail> circulationDeskDetailInDatabase = (List<OleCirculationDeskDetail>) KRADServiceLocator.getDataObjectService().findMatching(OleCirculationDeskDetail.class, QueryByCriteria.Builder.andAttributes(circulationDeskIdMap).build()).getResults();
131             if ((circulationDeskDetailInDatabase.size() > 0)) {
132                 if (!circulationDesk.isActive()) {
133                     this.putFieldError(OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_MAP, OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_MAP_ERROR);
134                     return false;
135                 }
136             }
137             List<String> locationCodes = new ArrayList<String>();
138             if (circulationDesk.getOleCirculationDeskLocations() != null && circulationDesk.getOleCirculationDeskLocations().size() > 0 && locationCodes.size() == 0) {
139                 locationCodes.add(circulationDesk.getOleCirculationDeskLocations().get(0).getCirculationLocationCode());
140             }
141 
142             for (int i = 1; i < circulationDesk.getOleCirculationDeskLocations().size(); i++) {
143 
144                 for (int j = 0; j < locationCodes.size() - 1; j++) {
145 
146                     if (locationCodes.get(j).equals(circulationDesk.getOleCirculationDeskLocations().get(i).getCirculationLocationCode())) {
147                         this.putFieldError(OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION, OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION_DUPLICATE_ERROR);
148                         return false;
149                     } else {
150                         locationCodes.add(circulationDesk.getOleCirculationDeskLocations().get(i).getCirculationLocationCode());
151                         j++;
152                     }
153                 }
154             }
155             List<OleLocation> oleLocations = (List<OleLocation>) KRADServiceLocator.getDataObjectService().findMatching(OleLocation.class,QueryByCriteria.Builder.create().build()).getResults();
156             List<String> validLocationCodes = new ArrayList<String>();
157             for (OleLocation oleLocation : oleLocations) {
158                 for (String locationCode : locationCodes) {
159                     if (oleLocation.getLocationCode().equals(locationCode))
160                         validLocationCodes.add(locationCode);
161                 }
162             }
163             if (validLocationCodes.size() != locationCodes.size()) {
164                 this.putFieldError(OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION, OLEConstants.OleCirculationDesk.OLE_CIRCULATION_DESK_LOCATION_VALID_ERROR);
165                 return false;
166             }
167 
168         }
169         return true;
170     }
171 }
172 
173 
174 
175