View Javadoc
1   package org.kuali.ole.deliver.lookup;
2   
3   import org.apache.commons.lang.StringUtils;
4   import org.kuali.ole.OLEConstants;
5   import org.kuali.ole.OleLookupableImpl;
6   import org.kuali.ole.deliver.bo.OLEPatronEntityViewBo;
7   import org.kuali.ole.deliver.bo.OlePatronDocument;
8   import org.kuali.ole.deliver.bo.PatronBillPayment;
9   import org.kuali.ole.service.OlePatronHelperService;
10  import org.kuali.ole.service.OlePatronHelperServiceImpl;
11  import org.kuali.rice.core.api.util.RiceKeyConstants;
12  import org.kuali.rice.kim.impl.identity.email.EntityEmailBo;
13  import org.kuali.rice.kim.impl.identity.name.EntityNameBo;
14  import org.kuali.rice.kim.impl.identity.phone.EntityPhoneBo;
15  import org.kuali.rice.krad.lookup.LookupUtils;
16  import org.kuali.rice.krad.lookup.LookupableImpl;
17  import org.kuali.rice.krad.service.KRADServiceLocator;
18  import org.kuali.rice.krad.uif.UifConstants;
19  import org.kuali.rice.krad.uif.UifParameters;
20  import org.kuali.rice.krad.uif.field.InputField;
21  import org.kuali.rice.krad.uif.util.ComponentUtils;
22  import org.kuali.rice.krad.uif.view.LookupView;
23  import org.kuali.rice.krad.util.GlobalVariables;
24  import org.kuali.rice.krad.util.KRADConstants;
25  import org.kuali.rice.krad.util.KRADUtils;
26  import org.kuali.rice.krad.util.UrlFactory;
27  import org.kuali.rice.krad.web.form.LookupForm;
28  
29  import java.util.*;
30  
31  /**
32   * OlePatronLookupableImpl makes validation  and populate the search criteria and return the search results
33   */
34  public class OlePatronEnitityLookupableImpl extends OleLookupableImpl {
35      private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(OlePatronEnitityLookupableImpl.class);
36      List<?> searchResults;
37      OlePatronHelperService olePatronHelperService = new OlePatronHelperServiceImpl();
38      public static int count = 0;
39  
40      /**
41       * This method will populate the search criteria and return the search results
42       *
43       * @param form
44       * @param searchCriteria
45       * @param bounded
46       * @return displayList(Collection)
47       */
48      @Override
49      public Collection<?> performSearch(LookupForm form, Map<String, String> searchCriteria, boolean bounded) {
50          LOG.debug("Inside performSearch()");
51          List<OLEPatronEntityViewBo> olePatronDocuments=new ArrayList<OLEPatronEntityViewBo>();
52          List<OLEPatronEntityViewBo> finalResult=new ArrayList<OLEPatronEntityViewBo>();
53          List<String> olePatronIdList=new ArrayList<String>();
54          Map<String,String> searchEntityMap=new HashMap<String,String>();
55          Map<String,String> searchEntityPhoneMap=new HashMap<String,String>();
56          Map<String,String> searchEntityEmailMap=new HashMap<String,String>();
57          LookupUtils.preprocessDateFields(searchCriteria);
58          String firstName = searchCriteria.get(OLEConstants.OlePatron.PATRON_FIRST_NAME);
59          String middleName = searchCriteria.get("middleName");
60          String lastName = searchCriteria.get(OLEConstants.OlePatron.PATRON_LAST_NAME);
61          String email = searchCriteria.get("emailAddress");
62          String phoneNumber = searchCriteria.get("phoneNumber");
63          String patronType = searchCriteria.get("patronType");
64          if(StringUtils.isNotEmpty(searchCriteria.get("patronBarcode"))){
65              searchCriteria.remove("active");
66          }
67          if(StringUtils.isNotEmpty(firstName)){
68              searchEntityMap.put("firstName",firstName);
69          }
70          if(StringUtils.isNotEmpty(lastName)){
71              searchEntityMap.put("lastName",lastName);
72          }
73          if(StringUtils.isNotEmpty(middleName)){
74              searchEntityMap.put("middleName",middleName);
75          }
76          if(StringUtils.isNotEmpty(phoneNumber)){
77              searchEntityPhoneMap.put("phoneNumber",phoneNumber);
78          }
79          if(StringUtils.isNotEmpty(email)){
80              searchEntityEmailMap.put("emailAddress",email);
81          }
82  
83          if (StringUtils.isNotBlank(phoneNumber)) {
84              if (!validatePhoneNumber(phoneNumber)) {
85                  GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, OLEConstants.INVALID_PHONE_NUMBER_FORMAT);
86                  return new ArrayList<Object>();
87              }
88              phoneNumber = buildPhoneNumber(phoneNumber);
89          }
90          //finalResult = (List<OLEPatronEntityViewBo>) super.performSearch(form,searchCriteria,true);
91          Collection<?> displayList;
92  
93          // TODO: force uppercase will be done in binding at some point
94          displayList = getSearchResults(form, LookupUtils.forceUppercase(getDataObjectClass(), searchCriteria),
95                  !bounded);
96  
97          // TODO delyea - is this the best way to set that the entire set has a returnable row?
98          for (Object object : displayList) {
99             /* if(object instanceof OLEPatronEntityViewBo){
100                 OLEPatronEntityViewBo patronEntityViewBo = (OLEPatronEntityViewBo) object;
101                 patronEntityViewBo.setCreateBillUrl(getPatronBillUrl(patronEntityViewBo.getPatronId(),patronEntityViewBo.getFirstName(),patronEntityViewBo.getLastName()));
102                 if(patronEntityViewBo.getBillCount()>0){
103                     patronEntityViewBo.setPatronBillFileName("Patron Bill");
104                     patronEntityViewBo.setViewBillUrl("patronbill?viewId=BillView&amp;methodToCall=start&amp;patronId=" + patronEntityViewBo.getPatronId());
105                 }
106             }*/
107             if (isResultReturnable(object)) {
108                 form.setAtLeastOneRowReturnable(true);
109             }
110         }
111 
112         finalResult = (List<OLEPatronEntityViewBo>) displayList;
113         searchResults=finalResult;
114         return finalResult;
115     }
116 
117 
118 
119     /**
120      * This method will validate the criteria fields
121      *
122      * @param lookupView
123      * @param form
124      * @return criteriaFieldMap(Map)
125      */
126     @Override
127     protected Map<String, InputField> getCriteriaFieldsForValidation(LookupView lookupView, LookupForm form) {
128         LOG.debug("Inside getCriteriaFieldsForValidation()");
129         Map<String, InputField> criteriaFieldMap = new HashMap<String, InputField>();
130 
131         List<InputField> fields = ComponentUtils.getComponentsOfTypeDeep(lookupView.getCriteriaFields(),
132                 InputField.class);
133 
134         for (InputField field : fields) {
135             criteriaFieldMap.put(field.getPropertyName(), field);
136         }
137 
138         return criteriaFieldMap;
139     }
140 
141     /**
142      * This method is to override the maintenance mapping
143      *
144      * @param lookupForm
145      * @param dataObject
146      * @param methodToCall
147      * @param pkNames
148      * @return mapping Url
149      */
150     @Override
151     protected String getActionUrlHref(LookupForm lookupForm, Object dataObject, String methodToCall,
152                                       List<String> pkNames) {
153         LOG.debug("Inside getActionUrlHref()");
154         LookupView lookupView = (LookupView) lookupForm.getView();
155 
156         Properties props = new Properties();
157         props.put(KRADConstants.DISPATCH_REQUEST_PARAMETER, methodToCall);
158         Map<String, String> primaryKeyValues = KRADUtils.getPropertyKeyValuesFromDataObject(pkNames, dataObject);
159         for (String primaryKey : primaryKeyValues.keySet()) {
160             String primaryKeyValue = primaryKeyValues.get(primaryKey);
161 
162             props.put(primaryKey, primaryKeyValue);
163         }
164 
165         if (StringUtils.isNotBlank(lookupForm.getReturnLocation())) {
166             props.put(KRADConstants.RETURN_LOCATION_PARAMETER, lookupForm.getReturnLocation());
167         }
168 
169         props.put(UifParameters.DATA_OBJECT_CLASS_NAME, OlePatronDocument.class.getName());
170         props.put(UifParameters.VIEW_TYPE_NAME, UifConstants.ViewType.MAINTENANCE.name());
171 
172         String maintenanceMapping = OLEConstants.OlePatron.PATRON_MAINTENANCE_ACTION_LINK;
173 
174         return UrlFactory.parameterizeUrl(maintenanceMapping, props);
175     }
176 
177     /**
178      * This method will return the url for create bill link in patron record.
179      *
180      * @return link url
181      */
182 
183     public String getPatronBillUrl(String patronId, String firstName, String lastName) {
184         String url = "patronBillMaintenance?viewTypeName=MAINTENANCE&returnLocation=%2Fportal.do&methodToCall=start&dataObjectClassName=org.kuali.ole.deliver.bo.PatronBillPayment&patronId=" + patronId + "&firstName=" + firstName + "&lastName=" + lastName;
185         return url;
186     }
187 
188     public boolean isWildCardMatches(String word, String wildCardString) {
189         if (LOG.isInfoEnabled()) {
190             LOG.info("Applying WildCard Search");
191         }
192         boolean isSuccess = true;
193         if (wildCardString != null && (!wildCardString.equalsIgnoreCase("")) && wildCardString.contains("*")) {
194             if (wildCardString.equalsIgnoreCase("*")) {
195                 isSuccess = true;
196             } else {
197                 wildCardString = wildCardString.replace('*', ',');
198                 String[] wCardString = wildCardString.split(",");
199                 if (wCardString != null && wCardString.length > 0) {
200                     for (String str : wCardString) {
201                         if (word.toLowerCase().contains(str.toLowerCase())) {
202                             isSuccess = isSuccess && true;
203                         } else {
204                             isSuccess = isSuccess && false;
205                         }
206                     }
207                 } else {
208                     isSuccess = false;
209                     if (word.equalsIgnoreCase(wildCardString)) {
210                         isSuccess = true;
211                     }
212                 }
213             }
214             return isSuccess;
215         } else {
216             if (wildCardString.equalsIgnoreCase(word)) {
217                 return true;
218             } else {
219                 return false;
220             }
221         }
222     }
223 
224     private boolean validatePhoneNumber(String phoneNo) {
225         if (LOG.isInfoEnabled()) {
226             LOG.info("Validating the Phone Number  Format - ##########, (###)###-#### , ###-###-#### , ### ###-#### , ### ### ####");
227         }
228         if (phoneNo.matches("\\d{10}")) return true;
229         else if (phoneNo.matches("\\d{3}[-]\\d{3}[-]\\d{4}")) return true;
230         else if (phoneNo.matches("\\d{3}[\\s]\\d{3}[-]\\d{4}")) return true;
231         else if (phoneNo.matches("\\d{3}[\\s]\\d{3}[\\s]\\d{4}")) return true;
232         else if (phoneNo.matches("\\(\\d{3}\\)[\\s]\\d{3}[-]\\d{4}")) return true;
233         else return false;
234 
235     }
236     private String buildPhoneNumber(String phoneNumber){
237         StringBuilder userPhoneNumber = new StringBuilder();
238         for (int i = 0; i < phoneNumber.length(); i++) {
239             if (Character.isDigit(phoneNumber.charAt(i))) {
240                 userPhoneNumber.append(phoneNumber.charAt(i));
241             }
242         }
243         return userPhoneNumber.toString();
244     }
245 
246 }