1   package org.kuali.ole.select.document.service.impl;
2   
3   import org.apache.commons.httpclient.HttpClient;
4   import org.apache.commons.httpclient.NameValuePair;
5   import org.apache.commons.httpclient.methods.DeleteMethod;
6   import org.apache.commons.lang3.StringUtils;
7   import org.apache.cxf.helpers.IOUtils;
8   import org.kuali.ole.describe.bo.OleLocation;
9   import org.kuali.ole.describe.bo.OleLocationLevel;
10  import org.kuali.ole.describe.keyvalue.LocationValuesBuilder;
11  import org.kuali.ole.docstore.common.client.DocstoreClientLocator;
12  import org.kuali.ole.docstore.common.document.*;
13  import org.kuali.ole.docstore.common.document.HoldingsTree;
14  import org.kuali.ole.docstore.common.document.content.enums.DocCategory;
15  import org.kuali.ole.docstore.common.document.content.instance.*;
16  import org.kuali.ole.docstore.common.document.content.instance.Item;
17  import org.kuali.ole.docstore.common.document.content.instance.xstream.HoldingOlemlRecordProcessor;
18  import org.kuali.ole.docstore.common.document.content.instance.xstream.ItemOlemlRecordProcessor;
19  import org.kuali.ole.docstore.model.enums.DocType;
20  import org.kuali.ole.docstore.model.xmlpojo.ingest.*;
21  import org.kuali.ole.docstore.model.xmlpojo.work.instance.oleml.InstanceCollection;
22  import org.kuali.ole.docstore.model.xstream.ingest.RequestHandler;
23  import org.kuali.ole.docstore.model.xstream.ingest.ResponseHandler;
24  import org.kuali.ole.docstore.model.xstream.work.instance.oleml.WorkHoldingOlemlRecordProcessor;
25  import org.kuali.ole.docstore.model.xstream.work.instance.oleml.WorkInstanceOlemlRecordProcessor;
26  import org.kuali.ole.docstore.model.xstream.work.instance.oleml.WorkItemOlemlRecordProcessor;
27  import org.kuali.ole.module.purap.PurapConstants;
28  import org.kuali.ole.module.purap.businessobject.PurApAccountingLine;
29  import org.kuali.ole.module.purap.businessobject.PurApItem;
30  import org.kuali.ole.module.purap.document.PurchaseOrderDocument;
31  import org.kuali.ole.select.bo.OLEDonor;
32  import org.kuali.ole.select.bo.OLELinkPurapDonor;
33  import org.kuali.ole.select.bo.OleVendorAccountInfo;
34  import org.kuali.ole.select.businessobject.OleCopies;
35  import org.kuali.ole.select.businessobject.OleCopy;
36  import org.kuali.ole.select.businessobject.OlePurchaseOrderItem;
37  import org.kuali.ole.select.document.service.OleCopyHelperService;
38  import org.kuali.ole.select.document.service.OleDocstoreHelperService;
39  import org.kuali.ole.select.service.WebClientService;
40  import org.kuali.ole.sys.OLEConstants;
41  import org.kuali.ole.sys.context.SpringContext;
42  import org.kuali.ole.util.DocstoreUtil;
43  import org.kuali.rice.core.api.config.property.ConfigContext;
44  import org.kuali.rice.core.api.config.property.ConfigurationService;
45  import org.kuali.rice.krad.service.KRADServiceLocator;
46  import org.kuali.rice.krad.util.GlobalVariables;
47  
48  import java.io.*;
49  import java.net.URL;
50  import java.net.URLConnection;
51  import java.net.URLEncoder;
52  import java.util.*;
53  
54  
55  
56  
57  
58  public class OleDocstoreHelperServiceImpl implements OleDocstoreHelperService {
59  
60      private ConfigurationService kualiConfigurationService;
61      private WebClientService webClientService;
62  
63      private final String UPDATE_EXISTING_DOCSTORE_RECORD_QUERY_STRING = "docAction=checkIn&stringContent=";
64      private final String CHECKOUT_DOCSTORE_RECORD_QUERY_STRING = "docAction=checkOut&uuid=";
65      private final String CREATE_NEW_DOCSTORE_RECORD_QUERY_STRING = "docAction=ingestContent&stringContent=";
66      private WorkItemOlemlRecordProcessor workItemOlemlRecordProcessor;
67      private WorkHoldingOlemlRecordProcessor workHoldingOlemlRecordProcessor;
68      private WorkInstanceOlemlRecordProcessor workInstanceOlemlRecordProcessor;
69      private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger
70              .getLogger(OleDocstoreHelperServiceImpl.class);
71      private static final String DOCSTORE_URL = "docstore.url";
72      private DocstoreClientLocator docstoreClientLocator;
73      int copyCount = 0;
74      boolean copyFlag = false;
75      boolean newCopyFlag = false;
76      private HoldingOlemlRecordProcessor holdingOlemlRecordProcessor = new HoldingOlemlRecordProcessor();
77      private DocstoreUtil docstoreUtil=new DocstoreUtil();
78  
79      public DocstoreClientLocator getDocstoreClientLocator() {
80          if (docstoreClientLocator == null) {
81              docstoreClientLocator = SpringContext.getBean(DocstoreClientLocator.class);
82          }
83          return docstoreClientLocator;
84      }
85  
86      @Override
87      public String rollbackData(String bibiUUID) {
88          RequestHandler requestHandler = new RequestHandler();
89          Request request = new Request();
90          request.setUser("mock_user");
91          request.setOperation("deleteWithLinkedDocs");
92          RequestDocument requestDocument = new RequestDocument();
93          requestDocument.setId(bibiUUID);
94          requestDocument.setCategory(OLEConstants.BIB_CATEGORY_WORK);
95          requestDocument.setType(OLEConstants.BIB_TYPE_BIBLIOGRAPHY);
96          requestDocument.setFormat(OLEConstants.BIB_FORMAT_MARC);
97          Content content = new Content();
98          content.setContent("");
99          requestDocument.setContent(content);
100         requestDocument.setLinkedRequestDocuments(Collections.<RequestDocument>emptyList());
101         request.setRequestDocuments(Arrays.asList(requestDocument));
102         String rollBackXml = requestHandler.toXML(request);
103         return rollbackDataFromXml(rollBackXml);
104     }
105 
106 
107     private String rollbackDataFromXml(String xmlForRollback) {
108 
109         String response = "";
110         String queryString = kualiConfigurationService.getPropertyValueAsString(OLEConstants.DOCSTORE_APP_POST_DATA_DELETE_KEY) + URLEncoder.encode(xmlForRollback);
111         String docstoreURL = ConfigContext.getCurrentContextConfig().getProperty(DOCSTORE_URL);
112         String contentType = kualiConfigurationService.getPropertyValueAsString(OLEConstants.DOCSTORE_APP_CONTENT_TYPE_KEY);
113         try {
114             response = webClientService.sendRequest(docstoreURL, contentType, queryString + queryString);
115         } catch (Exception ex) {
116             ex.printStackTrace();
117         }
118         return response;
119     }
120 
121 
122     public ConfigurationService getConfigurationService() {
123         return kualiConfigurationService;
124     }
125 
126 
127     public void setConfigurationService(ConfigurationService kualiConfigurationService) {
128         this.kualiConfigurationService = kualiConfigurationService;
129     }
130 
131 
132     public WebClientService getWebClientService() {
133         return webClientService;
134     }
135 
136 
137     public void setWebClientService(WebClientService webClientService) {
138         this.webClientService = webClientService;
139     }
140 
141     public void performDocstoreUpdateForRequisitionAndPOItem(PurchaseOrderDocument purchaseOrderDocument, OlePurchaseOrderItem singleItem, BibTree bibTree, String documentTypeName, String note) throws Exception {
142         List<OleCopies> copies = singleItem.getCopies();
143         List<OleCopy> copyList = singleItem.getCopyList();
144         List<OLELinkPurapDonor> oleDonors = singleItem.getOleDonors();
145         String itemTypeDescription = singleItem.getItemTypeDescription();
146         String itemTitleId = singleItem.getItemTitleId();
147         String poLineItemId = singleItem.getItemIdentifier() != null ? singleItem.getItemIdentifier().toString() : null;
148         String poNumber = purchaseOrderDocument.getPurapDocumentIdentifier() != null ? purchaseOrderDocument.getPurapDocumentIdentifier().toString() : null;
149         if (singleItem.getLinkToOrderOption() != null) {
150             if (singleItem.getLinkToOrderOption().equals(OLEConstants.EB_PRINT) || singleItem.getLinkToOrderOption().equals(OLEConstants.EB_ELECTRONIC)) {
151                 performDocstoreCRUDOperationForExistingBib(poNumber, singleItem.getLinkToOrderOption(), bibTree, copyList, oleDonors, poLineItemId, itemTypeDescription, singleItem.getItemStatus(), itemTitleId, singleItem, documentTypeName, note);
152             } else if (singleItem.getLinkToOrderOption().equals(OLEConstants.NB_ELECTRONIC) && copyList != null && copyList.size() > 0) {
153                 if (documentTypeName.equalsIgnoreCase(PurapConstants.PurchaseOrderDocTypes.PURCHASE_ORDER_VOID_DOCUMENT) ||
154                         documentTypeName.equalsIgnoreCase(PurapConstants.PurchaseOrderDocTypes.PURCHASE_ORDER_REOPEN_DOCUMENT) ||
155                         documentTypeName.equalsIgnoreCase(PurapConstants.PurchaseOrderDocTypes.PURCHASE_ORDER_AMENDMENT_DOCUMENT) ||
156                         documentTypeName.equalsIgnoreCase(PurapConstants.PurchaseOrderDocTypes.PURCHASE_ORDER_CLOSE_DOCUMENT) ||
157                         documentTypeName.equalsIgnoreCase(PurapConstants.PurchaseOrderDocTypes.PURCHASE_ORDER_REMOVE_HOLD_DOCUMENT) ||
158                         documentTypeName.equalsIgnoreCase(PurapConstants.PurchaseOrderDocTypes.PURCHASE_ORDER_PAYMENT_HOLD_DOCUMENT)){
159                      updateEInstance(copyList.get(0), oleDonors);
160                 }   else {
161                     createEInstance(copyList.get(0), oleDonors, bibTree);
162                 }
163             } else if (singleItem.getLinkToOrderOption().equals(OLEConstants.NB_PRINT)) {
164                 performDocstoreCRUDOperationForItemNew(poNumber, copies, copyList, oleDonors, itemTypeDescription, itemTitleId, bibTree, poLineItemId, singleItem.getItemStatus(), singleItem.getItemLocation(), documentTypeName, note, singleItem);
165             } else if (singleItem.getLinkToOrderOption().equals(org.kuali.ole.OLEConstants.ORDER_RECORD_IMPORT_MARC_ONLY_PRINT) || singleItem.getLinkToOrderOption().equals(org.kuali.ole.OLEConstants.ORDER_RECORD_IMPORT_MARC_EDI)) {
166                 performDocstoreCRUDOperationFoROrderRecordImportMarcOnlyPrint(poNumber, copyList, singleItem, oleDonors, bibTree, poLineItemId);
167             } else if (singleItem.getLinkToOrderOption().equals(org.kuali.ole.OLEConstants.ORDER_RECORD_IMPORT_MARC_ONLY_ELECTRONIC) || singleItem.getLinkToOrderOption().equals(org.kuali.ole.OLEConstants.ORDER_RECORD_IMPORT_MARC_EDI_ELECTRONIC)) {
168                 performDocstoreCRUDOperationFoROrderRecordImportMarcOnlyElectronic(copyList, oleDonors, bibTree);
169             }
170         }
171     }
172 
173     private void performDocstoreCRUDOperationFoROrderRecordImportMarcOnlyPrint(String poNumber, List<OleCopy> oleCopyList, OlePurchaseOrderItem singleItem,
174                                                                                List<OLELinkPurapDonor> oleDonors, BibTree bibTree, String poLineItemId) throws Exception {
175         if (oleCopyList != null) {
176             boolean holdingsExists = false;
177             for (OleCopy oleCopy : oleCopyList) {
178                 if (oleCopy != null && oleCopy.getInstanceId() != null) {
179                     holdingsExists = true;
180                     Holdings holdings = getDocstoreClientLocator().getDocstoreClient().retrieveHoldings(oleCopy.getInstanceId());
181                     org.kuali.ole.docstore.common.document.content.instance.OleHoldings oleHoldings = holdingOlemlRecordProcessor.fromXML(holdings.getContent());
182                     oleHoldings.setReceiptStatus(OLEConstants.OleLineItemReceiving.NOT_RECEIVED_STATUS);
183                     oleHoldings.setLocation(setHoldingDetails(oleCopy).getLocation());
184                     holdings.setContent(new HoldingOlemlRecordProcessor().toXML(oleHoldings));
185                     getDocstoreClientLocator().getDocstoreClient().updateHoldings(holdings);
186                     if (oleCopy.getItemUUID() != null) {
187                         org.kuali.ole.docstore.common.document.Item item = getDocstoreClientLocator().getDocstoreClient().retrieveItem(oleCopy.getItemUUID());
188                         Item itemContent = new ItemOlemlRecordProcessor().fromXML(item.getContent());
189                         List<DonorInfo> donorInfoList = setDonorInfoToItem(singleItem.getOleDonors(), new ArrayList<DonorInfo>());
190                         itemContent.setDonorInfo(donorInfoList);
191                         setItemDetails(itemContent, oleCopy, singleItem, oleDonors, poNumber);
192                         item.setContent(new ItemOlemlRecordProcessor().toXML(itemContent));
193                         item.setId(itemContent.getItemIdentifier());
194                         getDocstoreClientLocator().getDocstoreClient().updateItem(item);
195                     } else {
196                         Item item = new Item();
197                         setItemDetails(item, oleCopy, singleItem, oleDonors, poNumber);
198                         org.kuali.ole.docstore.common.document.Item itemDocument = new org.kuali.ole.docstore.common.document.Item();
199                         itemDocument.setContent(new ItemOlemlRecordProcessor().toXML(item));
200                         itemDocument.setCategory(OLEConstants.ITEM_CATEGORY);
201                         itemDocument.setType(OLEConstants.ITEM_TYPE);
202                         itemDocument.setFormat(OLEConstants.ITEM_FORMAT);
203                         if (StringUtils.isNotBlank(oleCopy.getInstanceId())) {
204                             itemDocument.setHolding(holdings);
205                             getDocstoreClientLocator().getDocstoreClient().createItem(itemDocument);
206                         }
207                         oleCopy.setItemUUID(itemDocument.getId());
208                     }
209                 }
210             }
211             if (!holdingsExists) {
212                 OleCopyHelperService oleCopyHelperService = new OleCopyHelperServiceImpl();
213                 HashMap<String, List<OleCopy>> copyListBasedOnLocation = oleCopyHelperService.getCopyListBasedOnLocation(oleCopyList, singleItem.getItemTitleId());
214                 Iterator<Map.Entry<String, List<OleCopy>>> entries = copyListBasedOnLocation.entrySet().iterator();
215                 while (entries.hasNext()) {
216                     Map.Entry<String, List<OleCopy>> entry = entries.next();
217                     List<OleCopy> copyList = entry.getValue();
218                     createOleHoldingsTree(poNumber, bibTree, copyList, poLineItemId, oleDonors, oleCopyList, singleItem.getItemTypeDescription(), singleItem.getItemStatus(), singleItem);
219                 }
220             }
221         }
222     }
223 
224     private void performDocstoreCRUDOperationFoROrderRecordImportMarcOnlyElectronic(List<OleCopy> oleCopyList,List<OLELinkPurapDonor> oleDonors, BibTree bibTree) throws Exception {
225         if (oleCopyList != null && oleCopyList.size() > 0) {
226             OleCopy oleCopy = oleCopyList.get(0);
227             if (oleCopy != null) {
228                 if (oleCopy.getInstanceId() != null) {
229                     updateEInstance(oleCopy,oleDonors);
230                 } else {
231                     createEInstance(oleCopy, oleDonors, bibTree);
232                 }
233             }
234         }
235     }
236 
237     public void setItemDetails(Item itemContent, OleCopy oleCopy, OlePurchaseOrderItem singleItem, List<OLELinkPurapDonor> oleDonors, String poNumber) {
238         if (StringUtils.isBlank(itemContent.getEnumeration())) {
239             itemContent.setEnumeration(oleCopy.getEnumeration());
240         }
241         if (itemContent.getItemStatus() == null ||
242                 (itemContent.getItemStatus() != null && itemContent.getItemStatus().getCodeValue() == null && itemContent.getItemStatus().getFullValue() == null)) {
243             ItemStatus itemStatus = new ItemStatus();
244             itemStatus.setCodeValue(singleItem.getItemStatus());
245             itemStatus.setFullValue(singleItem.getItemStatus());
246             itemContent.setItemStatus(itemStatus);
247         }
248         itemContent.setPurchaseOrderLineItemIdentifier(poNumber);
249         if (singleItem != null) {
250             itemContent.setVendorLineItemIdentifier(singleItem.getVendorItemPoNumber());
251             if (singleItem.getExtendedPrice() != null) {
252                 itemContent.setPrice(singleItem.getExtendedPrice().toString());
253             }
254             itemContent.setFund(populateFundCodes(singleItem.getSourceAccountingLines()));
255         }
256         List<OLELinkPurapDonor> oleReqDonors = new ArrayList<>();
257         List<DonorInfo> donorInfoList = new ArrayList<>();
258         boolean flag = true;
259         for (OLELinkPurapDonor reqDonorInfo : oleDonors) {
260             if (itemContent.getDonorInfo() != null && itemContent.getDonorInfo().size() > 0) {
261                 for (DonorInfo itemDonorInfo : itemContent.getDonorInfo()) {
262                     if (itemDonorInfo.getDonorCode().equals(itemDonorInfo.getDonorCode())) {
263                         flag = false;
264                         break;
265                     }
266                 }
267                 if (flag) {
268                     oleReqDonors.add(reqDonorInfo);
269                 }
270             }
271         }
272         if (itemContent.getDonorInfo() != null && itemContent.getDonorInfo().size() > 0) {
273             donorInfoList = setDonorInfoToItem(oleReqDonors, itemContent.getDonorInfo());
274         } else {
275             donorInfoList = setDonorInfoToItem(oleDonors, itemContent.getDonorInfo());
276         }
277         itemContent.setDonorInfo(donorInfoList);
278     }
279 
280     private void performDocstoreCRUDOperationForExistingBib(String poNumber, String linkToOrderOption, BibTree bibTree, List<OleCopy> oleCopyList, List<OLELinkPurapDonor> oleDonors, String poLineItemId, String itemTypeDescription, String itemStatusValue, String itemTitleId, OlePurchaseOrderItem singleItem, String documentTypeName, String note) throws Exception {
281         if (linkToOrderOption.equals(OLEConstants.EB_PRINT)) {
282             OleCopyHelperService oleCopyHelperService = new OleCopyHelperServiceImpl();
283             HashMap<String, List<OleCopy>> copyListBasedOnLocation = oleCopyHelperService.getCopyListBasedOnLocation(oleCopyList, itemTitleId);
284             Iterator<Map.Entry<String, List<OleCopy>>> entries = copyListBasedOnLocation.entrySet().iterator();
285             while (entries.hasNext()) {
286                 Map.Entry<String, List<OleCopy>> entry = entries.next();
287                 List<OleCopy> copyList = entry.getValue();
288                 List<OleCopy> newCopyList = new ArrayList<>();
289                 performUpdateForPODocuments(poNumber, bibTree, documentTypeName, poLineItemId, note, singleItem, copyList, oleCopyList, newCopyList, oleDonors, itemTypeDescription, itemStatusValue);
290             }
291         } else if (linkToOrderOption.equals(OLEConstants.EB_ELECTRONIC)) {
292             if (documentTypeName.equalsIgnoreCase(PurapConstants.PurchaseOrderDocTypes.PURCHASE_ORDER_VOID_DOCUMENT) ||
293                     documentTypeName.equalsIgnoreCase(PurapConstants.PurchaseOrderDocTypes.PURCHASE_ORDER_REOPEN_DOCUMENT) ||
294                     documentTypeName.equalsIgnoreCase(PurapConstants.PurchaseOrderDocTypes.PURCHASE_ORDER_AMENDMENT_DOCUMENT) ||
295                     documentTypeName.equalsIgnoreCase(PurapConstants.PurchaseOrderDocTypes.PURCHASE_ORDER_CLOSE_DOCUMENT) ||
296                     documentTypeName.equalsIgnoreCase(PurapConstants.PurchaseOrderDocTypes.PURCHASE_ORDER_REMOVE_HOLD_DOCUMENT) ||
297                     documentTypeName.equalsIgnoreCase(PurapConstants.PurchaseOrderDocTypes.PURCHASE_ORDER_PAYMENT_HOLD_DOCUMENT)){
298                 updateEInstance(oleCopyList.get(0), oleDonors);
299             }   else {
300             createEInstance(oleCopyList.get(0),oleDonors,bibTree);
301         }
302             
303         }
304     }
305 
306     private void createEInstance(OleCopy oleCopy, List<OLELinkPurapDonor> oleDonors, BibTree bibTree)throws Exception{
307         List<DonorInfo> donorInfoList = new ArrayList<>();
308         HoldingsTree holdingsTree = new HoldingsTree();
309         org.kuali.ole.docstore.common.document.content.instance.OleHoldings oleHoldings = setHoldingDetails(oleCopy);
310         oleHoldings.setHoldingsIdentifier(null);
311         donorInfoList = setDonorInfoToItem(oleDonors, oleHoldings.getDonorInfo());
312         oleHoldings.setDonorInfo(donorInfoList);
313         Holdings eHoldings = new EHoldings();
314         eHoldings.setCategory(DocCategory.WORK.getCode());
315         eHoldings.setType(org.kuali.ole.docstore.common.document.content.enums.DocType.HOLDINGS.getCode());
316         eHoldings.setFormat(org.kuali.ole.docstore.common.document.content.enums.DocFormat.OLEML.getCode());
317         eHoldings.setContent(new HoldingOlemlRecordProcessor().toXML(oleHoldings));
318         Bib bib = getDocstoreClientLocator().getDocstoreClient().retrieveBib(bibTree.getBib().getId());
319         eHoldings.setBib(bib);
320         holdingsTree.setHoldings(eHoldings);
321         getDocstoreClientLocator().getDocstoreClient().createHoldingsTree(holdingsTree);
322         oleCopy.setInstanceId(holdingsTree.getHoldings().getId());
323     }
324 
325     private void updateEInstance(OleCopy oleCopy, List<OLELinkPurapDonor> oleDonors) throws Exception{
326         Holdings holdings = getDocstoreClientLocator().getDocstoreClient().retrieveHoldings(oleCopy.getInstanceId());
327         org.kuali.ole.docstore.common.document.content.instance.OleHoldings oleHoldings = holdingOlemlRecordProcessor.fromXML(holdings.getContent());
328         oleHoldings.setLocation(setHoldingDetails(oleCopy).getLocation());
329         List<OLELinkPurapDonor> oleReqDonors = new ArrayList<>();
330         List<DonorInfo> donorInfoList = new ArrayList<>();
331         boolean flag = true;
332         for (OLELinkPurapDonor reqDonorInfo : oleDonors) {
333             if (oleHoldings.getDonorInfo() != null && oleHoldings.getDonorInfo().size() > 0) {
334                 for (DonorInfo donorInfo : oleHoldings.getDonorInfo()) {
335                     if (donorInfo.getDonorCode().equals(donorInfo.getDonorCode())) {
336                         flag = false;
337                         break;
338                     }
339                 }
340                 if (flag) {
341                     oleReqDonors.add(reqDonorInfo);
342                 }
343             }
344         }
345         if (oleHoldings.getDonorInfo() != null && oleHoldings.getDonorInfo().size() > 0) {
346             donorInfoList = setDonorInfoToItem(oleReqDonors, oleHoldings.getDonorInfo());
347         } else {
348             donorInfoList = setDonorInfoToItem(oleDonors, oleHoldings.getDonorInfo());
349         }
350         oleHoldings.setDonorInfo(donorInfoList);
351         donorInfoList = setDonorInfoToItem(oleDonors, new ArrayList<DonorInfo>());
352         oleHoldings.setDonorInfo(donorInfoList);
353         holdings.setContent(new HoldingOlemlRecordProcessor().toXML(oleHoldings));
354         getDocstoreClientLocator().getDocstoreClient().updateHoldings(holdings);
355     }
356 
357     
358 
359 
360 
361 
362 
363 
364 
365 
366 
367 
368 
369 
370 
371 
372 
373 
374 
375 
376 
377 
378 
379 
380 
381 
382 
383 
384 
385 
386 
387 
388 
389 
390 
391 
392 
393 
394 
395 
396 
397 
398 
399 
400 
401 
402 
403 
404 
405 
406 
407 
408 
409 
410 
411 
412     private void performDocstoreCRUDOperationForItemNew(String poNumber,  List<OleCopies> copies ,List<OleCopy> copyList , List<OLELinkPurapDonor> oleDonors , String itemTypeDescription, String itemTitleId,
413                                                          BibTree bibTree,String poLineItemId,String itemStatusValue, String itemLocation,
414                                                          String documentTypeName, String note, OlePurchaseOrderItem singleItem) throws Exception {
415         List<org.kuali.ole.docstore.common.document.Item> itemDocuments = bibTree.getHoldingsTrees() != null && bibTree.getHoldingsTrees().size() > 0 && bibTree.getHoldingsTrees().get(0).getItems() != null
416                 ? bibTree.getHoldingsTrees().get(0).getItems() : new ArrayList<org.kuali.ole.docstore.common.document.Item>();
417         OleCopyHelperService oleCopyHelperService =  new OleCopyHelperServiceImpl();
418         HashMap<String, List<OleCopy>> copyListBasedOnLocation = oleCopyHelperService.getCopyListBasedOnLocation(copyList, itemTitleId);
419         Iterator<Map.Entry<String, List<OleCopy>>> entries = copyListBasedOnLocation.entrySet().iterator();
420         List<OleCopy> newCopyList = new ArrayList<>();
421         String location=null;
422         boolean copyFlag = false;
423         if(bibTree.getHoldingsTrees().size()>0){
424         OleHoldings oleHolding=new HoldingOlemlRecordProcessor().fromXML(bibTree.getHoldingsTrees().get(0).getHoldings().getContent());
425         StringBuffer locationName=new StringBuffer("");
426         location=docstoreUtil.getLocation(oleHolding.getLocation(),locationName);
427         }
428         int count = 0;
429         while (entries.hasNext()) {
430             Map.Entry<String, List<OleCopy>> entry = entries.next();
431             List<OleCopy> oleCopyList = entry.getValue();
432             count++;
433             if (oleCopyList != null && oleCopyList.size() > 0) {
434                 OleCopy copy = oleCopyList.get(0);
435                 if(copyListBasedOnLocation.size()==1 && oleCopyList.size() == 1 && !oleCopyList.get(0).getLocation().equalsIgnoreCase(itemLocation)){
436                     
437                     updateOleHolding(bibTree.getHoldingsTrees().get(0).getHoldings().getId(),bibTree, copy);
438                     updateOleItem(poNumber, itemDocuments.get(0).getId(),poLineItemId, singleItem);
439                 }
440                 else {
441                     performUpdateForPODocuments(poNumber, bibTree, documentTypeName, poLineItemId, note, singleItem, oleCopyList, copyList, newCopyList, oleDonors, itemTypeDescription, itemStatusValue);
442 
443                     
444 
445 
446 
447 
448 
449 
450 
451 
452 
453 
454 
455 
456 
457 
458 
459 
460 
461 
462 
463 
464 
465 
466 
467 
468 
469 
470 
471 
472 
473 
474 
475 
476 
477 
478 
479 
480 
481 
482 
483 
484 
485 
486 
487 
488 
489 
490 
491 
492 
493 
494 
495 
496 
497 
498 
499 
500 
501 
502 
503 
504 
505 
506 
507 
508 
509 
510 
511 
512 
513 
514 
515 
516 
517 
518 
519 
520 
521 
522 
523 
524 
525 
526 
527 
528 
529 
530 
531 
532 
533 
534 
535 
536 
537 
538 
539                 }
540             }
541         }
542     }
543 
544 
545     private void performUpdateForPODocuments(String poNumber, BibTree bibTree, String documentTypeName, String poLineItemId, String note, OlePurchaseOrderItem singleItem, List<OleCopy> oleCopyList, List<OleCopy> copyList, List<OleCopy> newCopyList, List<OLELinkPurapDonor> oleDonors, String itemTypeDescription, String itemStatusValue) throws Exception {
546         boolean isLocationAvailable = false;
547         if (bibTree.getHoldingsTrees().size() > 0 && documentTypeName.equalsIgnoreCase(PurapConstants.PurchaseOrderDocTypes.PURCHASE_ORDER_VOID_DOCUMENT)) {
548             updateRecordForPOVoidDocument(poNumber, bibTree, poLineItemId, note, oleCopyList, singleItem);
549             isLocationAvailable = true;
550         }
551         if (bibTree.getHoldingsTrees().size() > 0 && documentTypeName.equalsIgnoreCase(PurapConstants.PurchaseOrderDocTypes.PURCHASE_ORDER_REOPEN_DOCUMENT)) {
552             updateRecordForPOReOpenDocument(poNumber, bibTree, poLineItemId, copyList, singleItem);
553             isLocationAvailable = true;
554         }
555         if (bibTree.getHoldingsTrees().size() > 0 && documentTypeName.equalsIgnoreCase(PurapConstants.PurchaseOrderDocTypes.PURCHASE_ORDER_AMENDMENT_DOCUMENT)) {
556             if (oleCopyList.get(0).getItemUUID() == null && oleCopyList.get(0).getInstanceId() == null && copyList.size() > 1) {
557                 updateRecordForPOAmendmentDocument(poNumber, bibTree, copyList, poLineItemId, oleDonors, oleCopyList, itemTypeDescription, itemStatusValue, singleItem);
558             } else {
559                 for (OleCopy oleCopy : oleCopyList) {
560                     if (oleCopy.getItemUUID() == null) {
561                         newCopyList.add(oleCopy);
562                     } else {
563                         updateOleItem(poNumber, oleCopy.getItemUUID(), poLineItemId, singleItem);
564                     }
565                     this.copyFlag = true;
566                 }
567                 createOleHoldingsTree(poNumber, bibTree, newCopyList, poLineItemId, oleDonors, oleCopyList, itemTypeDescription, itemStatusValue, singleItem);
568             }
569             isLocationAvailable = true;
570         }
571         if (bibTree.getHoldingsTrees().size() > 0 && (documentTypeName.equalsIgnoreCase(PurapConstants.PurchaseOrderDocTypes.PURCHASE_ORDER_CLOSE_DOCUMENT) ||
572                 documentTypeName.equalsIgnoreCase(PurapConstants.PurchaseOrderDocTypes.PURCHASE_ORDER_REMOVE_HOLD_DOCUMENT) ||
573                 documentTypeName.equalsIgnoreCase(PurapConstants.PurchaseOrderDocTypes.PURCHASE_ORDER_PAYMENT_HOLD_DOCUMENT))) {
574             org.kuali.ole.docstore.common.document.Item item = getDocstoreClientLocator().getDocstoreClient().retrieveItem(oleCopyList.get(0).getItemUUID());
575             Item itemContent=new ItemOlemlRecordProcessor().fromXML(item.getContent());
576             if (StringUtils.isNotEmpty(poNumber)) {
577                 itemContent.setPurchaseOrderLineItemIdentifier(poNumber);
578                 item.setContent(new ItemOlemlRecordProcessor().toXML(itemContent));
579                 item.setId(itemContent.getItemIdentifier());
580                 getDocstoreClientLocator().getDocstoreClient().updateItem(item);
581             }
582             isLocationAvailable = true;
583         }
584         if (!isLocationAvailable) {
585             if (bibTree.getHoldingsTrees().size() == 1) {
586                 if (bibTree.getBib().isStaffOnly()) {
587                     bibTree.getBib().setStaffOnly(false);
588                     getDocstoreClientLocator().getDocstoreClient().updateBib(bibTree.getBib());
589                 }
590             }
591             createOleHoldingsTree(poNumber, bibTree, copyList, poLineItemId, oleDonors, oleCopyList, itemTypeDescription, itemStatusValue, singleItem);
592         }
593     }
594     
595 
596 
597 
598 
599 
600 
601     public Item setItemDetails(OleCopy oleCopy, String itemTypeDescription) {
602         Item item = new Item();
603         
604 
605 
606 
607 
608 
609 
610         ItemType docstoreItemType = new ItemType();
611         docstoreItemType.setCodeValue(itemTypeDescription);
612         docstoreItemType.setFullValue(itemTypeDescription);
613         item.setItemType(docstoreItemType);
614         item.setEnumeration(oleCopy.getEnumeration());
615         item.setCopyNumber(oleCopy.getCopyNumber());
616         return item;
617     }
618 
619 
620     
621 
622 
623 
624 
625 
626 
627     public OleHoldings setHoldingDetails(OleCopy copy) throws Exception{
628         OleHoldings oleHoldings = new OleHoldings();
629         org.kuali.ole.docstore.common.document.content.instance.Location holdingLocation = new org.kuali.ole.docstore.common.document.content.instance.Location();
630         org.kuali.ole.docstore.common.document.content.instance.LocationLevel holdingLocationLevel = new org.kuali.ole.docstore.common.document.content.instance.LocationLevel();
631         String holdingLocationLevelCode = getLocationLevelCode(copy);
632         
633 
634 
635 
636 
637 
638 
639         
640 
641 
642         if (null != copy.getLocation()) {
643             holdingLocation.setLocationLevel(setLocationLevels(holdingLocationLevel, holdingLocationLevelCode,
644                     copy.getLocation()));
645         }
646         holdingLocation.setPrimary(OLEConstants.LOCATION_PRIMARY);
647         holdingLocation.setStatus(OLEConstants.LOCATION_STATUS);
648         oleHoldings.setLocation(holdingLocation);
649         return oleHoldings;
650     }
651 
652 
653 
654 
655 
656 
657 
658 
659 
660 
661 
662 
663 
664 
665 
666 
667 
668 
669 
670 
671 
672 
673 
674 
675 
676     public String deleteDocstoreRecord(String docType, String uuid) throws IOException {
677         String docstoreRestfulURL = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(
678                 OLEConstants.OLE_DOCSTORE_RESTFUL_URL);
679         docstoreRestfulURL = docstoreRestfulURL.concat("/") + uuid;
680         HttpClient httpClient = new HttpClient();
681         DeleteMethod deleteMethod = new DeleteMethod(docstoreRestfulURL);
682         NameValuePair nvp1 = new NameValuePair(OLEConstants.IDENTIFIER_TYPE, OLEConstants.UUID);
683         NameValuePair nvp2 = new NameValuePair(OLEConstants.OPERATION, OLEConstants.DELETE);
684         NameValuePair category = new NameValuePair(OLEConstants.DOC_CATEGORY, OLEConstants.BIB_CATEGORY_WORK);
685         NameValuePair type = new NameValuePair(OLEConstants.DOC_TYPE, docType);
686         NameValuePair format = new NameValuePair(OLEConstants.DOC_FORMAT, OLEConstants.BIB_FORMAT_OLEML);
687         deleteMethod.setQueryString(new NameValuePair[]{nvp1, nvp2, category, type, format});
688         int statusCode = httpClient.executeMethod(deleteMethod);
689         InputStream inputStream = deleteMethod.getResponseBodyAsStream();
690         return IOUtils.toString(inputStream);
691     }
692 
693     
694 
695 
696 
697 
698 
699 
700 
701 
702     public String instanceRecordCallToDocstore(String content, String uuid, String format) throws Exception {
703         String docstoreURL = ConfigContext.getCurrentContextConfig().getProperty(DOCSTORE_URL);
704         String queryString = null;
705         String xmlContent = buildInstanceRequestDocXML(content, uuid, format);
706         queryString = CREATE_NEW_DOCSTORE_RECORD_QUERY_STRING + URLEncoder.encode(xmlContent, "UTF-8");
707         return postData(docstoreURL, queryString);
708     }
709 
710     
711 
712 
713 
714 
715 
716 
717 
718     private String buildInstanceRequestDocXML(String xmlContent, String uuid, String format) {
719         Request requestObject = new Request();
720         RequestDocument requestDocument = new RequestDocument();
721         if (null == uuid) {
722             requestDocument.setId("1");
723             requestObject.setOperation(OLEConstants.INGEST_OPERATION);
724         } else {
725             requestDocument.setId(uuid);
726             requestObject.setOperation(OLEConstants.CHECK_IN_OPERATION);
727         }
728         requestObject.setUser("editor");
729         requestDocument.setCategory(OLEConstants.BIB_CATEGORY_WORK);
730         requestDocument.setType(OLEConstants.BIB_TYPE_INSTANCE);
731         requestDocument.setFormat(OLEConstants.BIB_FORMAT_OLEML);
732 
733         requestDocument.setContent(new Content(xmlContent));
734 
735         ArrayList<RequestDocument> requestDocuments = new ArrayList<RequestDocument>();
736         requestDocuments.add(requestDocument);
737         requestObject.setRequestDocuments(requestDocuments);
738 
739         RequestHandler requestHandler = new RequestHandler();
740         String requestXml = requestHandler.toXML(requestObject);
741         return requestXml;
742     }
743 
744     public Response createInstanceForBib(InstanceCollection instanceCollection) {
745         String instanceXMLString = getWorkInstanceOlemlRecordProcessor().toXML(instanceCollection);
746         Response responseObject = null;
747         try {
748             String response = instanceRecordCallToDocstore(instanceXMLString, null, OLEConstants.BIB_TYPE_INSTANCE);
749             responseObject = new ResponseHandler().toObject(response);
750         } catch (Exception ex) {
751             
752             ex.printStackTrace();
753         }
754         return responseObject;
755     }
756 
757     
758 
759 
760 
761 
762 
763 
764 
765 
766 
767 
768 
769 
770 
771 
772 
773 
774 
775 
776 
777     
778 
779 
780 
781 
782 
783     public String updateInstanceToDocstore(InstanceCollection instanceCollection) throws Exception {
784         String instanceXMLString = getWorkInstanceOlemlRecordProcessor().toXML(instanceCollection);
785         String instanceUUID = instanceCollection.getInstance().iterator().next().getInstanceIdentifier();
786         String response = updateInstanceRecord(instanceUUID, OLEConstants.BIB_TYPE_INSTANCE, instanceXMLString);
787         return response;
788     }
789 
790     public WorkInstanceOlemlRecordProcessor getWorkInstanceOlemlRecordProcessor() {
791         if (workInstanceOlemlRecordProcessor == null) {
792             workInstanceOlemlRecordProcessor = new WorkInstanceOlemlRecordProcessor();
793         }
794         return workInstanceOlemlRecordProcessor;
795     }
796 
797     public String getDocstoreData(String uuid) throws Exception {
798         String docstoreURL = ConfigContext.getCurrentContextConfig().getProperty(DOCSTORE_URL);
799         String queryString = CHECKOUT_DOCSTORE_RECORD_QUERY_STRING + uuid;
800         String responseFromDocstore = postData(docstoreURL, queryString);
801         Response response = new ResponseHandler().toObject(responseFromDocstore);
802         String responseContent = getResponseContent(response);
803         return responseContent;
804     }
805 
806     public Response getDocstoreResponse(String uuid) throws Exception {
807         String docstoreURL = ConfigContext.getCurrentContextConfig().getProperty(DOCSTORE_URL);
808         String queryString = CHECKOUT_DOCSTORE_RECORD_QUERY_STRING + uuid;
809         String responseFromDocstore = postData(docstoreURL, queryString);
810         Response response = new ResponseHandler().toObject(responseFromDocstore);
811         return response;
812     }
813 
814     public String getResponseContent(Response response) {
815         String responseString = null;
816         List<ResponseDocument> responseDocumentList = response.getDocuments();
817         for (ResponseDocument responseDocument : responseDocumentList) {
818             Content contentObj = responseDocument.getContent();
819             responseString = contentObj.getContent();
820         }
821         return responseString;
822     }
823 
824     
825 
826 
827 
828 
829 
830 
831 
832 
833 
834 
835 
836 
837 
838 
839 
840 
841 
842 
843 
844 
845 
846 
847 
848 
849 
850     
851 
852 
853 
854 
855 
856 
857 
858     public org.kuali.ole.docstore.common.document.content.instance.LocationLevel setLocationLevels(org.kuali.ole.docstore.common.document.content.instance.LocationLevel locationLevel, String locationLevelCode,
859                                            String locationLevelName) {
860 
861         String[] levelNames = locationLevelName.split("/");
862         String[] levels = locationLevelCode.split("/");
863         locationLevel.setName(levelNames[0]);
864         locationLevel.setLevel(levels[0]);
865         String levlName = "";
866         String levl = "";
867         if (locationLevelName.contains("/") && locationLevelCode.contains("/")) {
868             levlName = locationLevelName.replace(levelNames[0] + "/", "");
869             levl = locationLevelCode.replace(levels[0] + "/", "");
870         } else {
871             levlName = locationLevelName.replace(levelNames[0], "");
872             levl = locationLevelCode.replace(levels[0], "");
873         }
874         if ((levlName != null && !levlName.equals("")) && (levl != null && !levl.equals(""))) {
875             org.kuali.ole.docstore.common.document.content.instance.LocationLevel newLocationLevel = new org.kuali.ole.docstore.common.document.content.instance.LocationLevel();
876             locationLevel.setLocationLevel(setLocationLevels(newLocationLevel, levl, levlName));
877         }
878         return locationLevel;
879     }
880 
881     public Response createItemToDocstore(String instanceUuid, org.kuali.ole.docstore.common.document.content.instance.Item item) {
882         String oleItemXMLString = new ItemOlemlRecordProcessor().toXML(item);
883         Response responseObject = null;
884         try {
885             String response = createItemForInstanceRecord(instanceUuid, OLEConstants.ITEM_DOC_TYPE, oleItemXMLString);
886             responseObject = new ResponseHandler().toObject(response);
887         } catch (Exception ex) {
888             
889             ex.printStackTrace();
890         }
891         return responseObject;
892     }
893 
894     public String updateOleHoldingToDocstore(OleHoldings oleHoldings) throws Exception {
895         String oleHoldingXMLString = new HoldingOlemlRecordProcessor().toXML(oleHoldings);
896         String oleHoldingUUID = oleHoldings.getHoldingsIdentifier();
897 
898         String response = updateInstanceRecord(oleHoldingUUID, OLEConstants.HOLDING_DOC_TYPE, oleHoldingXMLString);
899         return response;
900     }
901 
902     public String updateOleItemToDocstore(Item item) throws Exception {
903         String oleItemXMLString = new ItemOlemlRecordProcessor().toXML(item);
904         
905         String oleItemUUID = item.getItemIdentifier();
906         if (LOG.isDebugEnabled()) {
907             LOG.debug("oleItemUUID---------->" + oleItemUUID);
908         }
909         String response = updateInstanceRecord(oleItemUUID, OLEConstants.ITEM_DOC_TYPE, oleItemXMLString);
910         return response;
911     }
912 
913     private WorkItemOlemlRecordProcessor getWorkItemOlemlRecordProcessor() {
914         if (workItemOlemlRecordProcessor == null) {
915             workItemOlemlRecordProcessor = new WorkItemOlemlRecordProcessor();
916         }
917         return workItemOlemlRecordProcessor;
918     }
919 
920     public WorkHoldingOlemlRecordProcessor getWorkHoldingOlemlRecordProcessor() {
921         if (workHoldingOlemlRecordProcessor == null) {
922             workHoldingOlemlRecordProcessor = new WorkHoldingOlemlRecordProcessor();
923         }
924         return workHoldingOlemlRecordProcessor;
925     }
926 
927     public String updateInstanceRecord(String uuid, String docType, String xmlContent) throws Exception {
928         String docstoreURL = ConfigContext.getCurrentContextConfig().getProperty(DOCSTORE_URL);
929         Request requestObject = new Request();
930         requestObject.setUser(GlobalVariables.getUserSession() != null ? GlobalVariables.getUserSession()
931                 .getPrincipalId() : "");
932         requestObject.setOperation(OLEConstants.CHECK_IN_OPERATION);
933         RequestDocument requestDocument = new RequestDocument();
934 
935         requestDocument.setId(uuid);
936         requestDocument.setCategory(OLEConstants.BIB_CATEGORY_WORK);
937         requestDocument.setType(docType); 
938         requestDocument.setFormat(OLEConstants.BIB_FORMAT_OLEML);
939         requestDocument.setContent(new Content(xmlContent));
940 
941         ArrayList<RequestDocument> requestDocuments = new ArrayList<RequestDocument>();
942         requestDocuments.add(requestDocument);
943         requestObject.setRequestDocuments(requestDocuments);
944 
945         RequestHandler requestHandler = new RequestHandler();
946         String xml = requestHandler.toXML(requestObject);
947 
948         String queryString = UPDATE_EXISTING_DOCSTORE_RECORD_QUERY_STRING + URLEncoder.encode(xml, "UTF-8");
949 
950         return postData(docstoreURL, queryString);
951     }
952 
953     public static String postData(String target, String content) throws Exception {
954         String response = "";
955         URL url = new URL(target);
956         URLConnection conn = url.openConnection();
957         conn.setDoInput(true);
958         conn.setDoOutput(true);
959         conn.setUseCaches(false);
960         conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
961 
962         Writer w = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
963         w.write(content);
964         w.close();
965         BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
966         String temp;
967         while ((temp = in.readLine()) != null) {
968             response += temp + "\n";
969         }
970         in.close();
971         return response;
972     }
973 
974     
975 
976 
977 
978 
979 
980 
981 
982 
983     public String createItemForInstanceRecord(String instanceUuid, String docType, String xmlContent) throws Exception {
984         String docstoreURL = ConfigContext.getCurrentContextConfig().getProperty(DOCSTORE_URL);
985         Request requestObject = new Request();
986         requestObject.setUser(GlobalVariables.getUserSession() != null ? GlobalVariables.getUserSession()
987                 .getPrincipalId() : "");
988         requestObject.setOperation(OLEConstants.CHECK_IN_OPERATION);
989         RequestDocument requestDocument = new RequestDocument();
990 
991         requestDocument.setId(instanceUuid);
992         requestDocument.setCategory(OLEConstants.BIB_CATEGORY_WORK);
993         requestDocument.setType(OLEConstants.BIB_TYPE_INSTANCE);
994         requestDocument.setFormat(OLEConstants.BIB_FORMAT_OLEML);
995 
996 
997         RequestDocument linkedRequestDocument = new RequestDocument();
998         linkedRequestDocument.setId(OLEConstants.NEW_ITEM_ID);
999         linkedRequestDocument.setCategory(OLEConstants.BIB_CATEGORY_WORK);
1000         linkedRequestDocument.setType(docType);
1001         linkedRequestDocument.setFormat(OLEConstants.BIB_FORMAT_OLEML);
1002         linkedRequestDocument.setContent(new Content(xmlContent));
1003 
1004         List<RequestDocument> linkedRequestDocuments = new ArrayList<RequestDocument>();
1005         linkedRequestDocuments.add(linkedRequestDocument);
1006         requestDocument.setLinkedRequestDocuments(linkedRequestDocuments);
1007 
1008 
1009         ArrayList<RequestDocument> requestDocuments = new ArrayList<RequestDocument>();
1010         requestDocuments.add(requestDocument);
1011         requestObject.setRequestDocuments(requestDocuments);
1012 
1013         RequestHandler requestHandler = new RequestHandler();
1014         String xml = requestHandler.toXML(requestObject);
1015 
1016         String queryString = UPDATE_EXISTING_DOCSTORE_RECORD_QUERY_STRING + URLEncoder.encode(xml, "UTF-8");
1017 
1018         return postData(docstoreURL, queryString);
1019 
1020     }
1021 
1022 
1023     public String getItemLocations(String location) {
1024         String[] locations = location.split("/");
1025         StringBuffer locationString = new StringBuffer();
1026         for (int i = locations.length - 1; i >= 1; i--) {
1027             if (i == 1) {
1028                 locationString = locationString.append(locations[i]);
1029             } else {
1030                 locationString = locationString.append(locations[i] + "/");
1031             }
1032         }
1033         return locationString.toString();
1034     }
1035 
1036 
1037 
1038     @Override
1039     public void createOrUpdateDocStoreBasedOnLocation(PurchaseOrderDocument document, PurApItem item, String currentDocumentTypeName, String note) {
1040         OlePurchaseOrderItem olePurchaseOrderItem = (OlePurchaseOrderItem) item;
1041         try {
1042             List<String> itemTitleIdsList = new ArrayList<String>();
1043             List<BibTree> bibTrees= new ArrayList<BibTree>();
1044             itemTitleIdsList.add(olePurchaseOrderItem.getItemTitleId());
1045             bibTrees = getBibTreeDocuments(itemTitleIdsList);
1046             for (BibTree bibTree : bibTrees) {
1047                 if (null != olePurchaseOrderItem.getItemTitleId()) {
1048                     performDocstoreUpdateForRequisitionAndPOItem(document, olePurchaseOrderItem,
1049                             bibTree, currentDocumentTypeName, note);
1050                 }
1051             }
1052         } catch (Exception e) {
1053             e.printStackTrace();
1054             throw new RuntimeException(e);
1055         }
1056     }
1057     private List<BibTree> getBibTreeDocuments(List<String> instanceIdsList) {
1058         List<LinkedHashMap<String, String>> instanceIdMapList = new ArrayList<LinkedHashMap<String, String>>();
1059         for (String instanceId : instanceIdsList) {
1060             LinkedHashMap<String, String> instanceIdMap = new LinkedHashMap<String, String>();
1061             instanceIdMap.put(DocType.BIB.getDescription(), instanceId);
1062             instanceIdMapList.add(instanceIdMap);
1063         }
1064         List<BibTree> bibTrees = new ArrayList<BibTree>();
1065         try {
1066             bibTrees = getWorkBibRecords(instanceIdMapList);
1067         } catch (Exception ex) {
1068             
1069             ex.printStackTrace();
1070         }
1071         return bibTrees;
1072     }
1073     public List<BibTree> getWorkBibRecords(List<LinkedHashMap<String, String>> uuidsMapList) throws Exception {
1074         List<BibTree> bibTres = new ArrayList<BibTree>();
1075         BibTree bibTree=new BibTree();
1076         for (LinkedHashMap<String, String> uuidsMap : uuidsMapList) {
1077             if (uuidsMap.containsKey(DocType.BIB.getDescription())) {
1078                 String bibId = uuidsMap.get(DocType.BIB.getDescription());
1079                 if (LOG.isDebugEnabled()) {
1080                     LOG.debug(" bibId ---------------> " + bibId);
1081                 }
1082                 if (StringUtils.isNotBlank(bibId)) {
1083                     bibTree=getDocstoreClientLocator().getDocstoreClient().retrieveBibTree(bibId.toString());
1084                 }
1085             }
1086             bibTres.add(bibTree);
1087         }
1088         return bibTres;
1089     }
1090     
1091 
1092 
1093 
1094 
1095     public String getLocationLevelCode( OleCopy copy) throws Exception {
1096         LOG.debug("Inside the getLocationLevelCode method");
1097         StringBuffer location = new StringBuffer();
1098         StringBuffer locationLevelCode = new StringBuffer();
1099         String[] locationCopiesSplit = copy.getLocation().split("/");
1100         for(String locationCode : locationCopiesSplit){
1101             OleLocation oleLocation =getLocationByLocationCode(locationCode);
1102             if(oleLocation!=null){
1103                 OleLocationLevel oleLocationLevel =  oleLocation.getOleLocationLevel();
1104                 String levelCode = oleLocationLevel!=null && oleLocationLevel.getLevelCode()!=null ? oleLocationLevel.getLevelCode() : "" ;
1105                 setLocation(locationLevelCode,location,levelCode,oleLocation.getLocationCode(),oleLocation.getLocationName());
1106             }
1107         }
1108         return locationLevelCode.toString();
1109     }
1110 
1111     
1112 
1113 
1114 
1115 
1116 
1117 
1118     private void setLocation(StringBuffer locationLevelCode,StringBuffer location, String levelCode, String locationCode, String locationName) throws Exception {
1119         LOG.debug("Inside the setLocation method");
1120         if (locationCode != null) {
1121             if (levelCode.equalsIgnoreCase(org.kuali.ole.OLEConstants.OLEBatchProcess.LOCATION_LEVEL_SHELVING)) {
1122                 location.append(locationName);
1123                 locationLevelCode.append(levelCode);
1124             } else if (levelCode.equalsIgnoreCase(org.kuali.ole.OLEConstants.OLEBatchProcess.LOCATION_LEVEL_COLLECTION)) {
1125                 location.append(locationName + "/");
1126                 locationLevelCode.append(levelCode + "/");
1127             } else if (levelCode.equalsIgnoreCase(org.kuali.ole.OLEConstants.OLEBatchProcess.LOCATION_LEVEL_LIBRARY)) {
1128                 location.append(locationName + "/");
1129                 locationLevelCode.append(levelCode + "/");
1130             } else if (levelCode.equalsIgnoreCase(org.kuali.ole.OLEConstants.OLEBatchProcess.LOCATION_LEVEL_INSTITUTION)) {
1131                 location.append(locationName + "/");
1132                 locationLevelCode.append(levelCode + "/");
1133             } else if (levelCode.equalsIgnoreCase(org.kuali.ole.OLEConstants.OLEBatchProcess.LOCATION_LEVEL_CAMPUS)) {
1134                 location.append(locationName + "/");
1135                 locationLevelCode.append(levelCode + "/");
1136             }
1137         }
1138     }
1139 
1140     
1141 
1142 
1143 
1144 
1145 
1146 
1147     private OleLocation getLocationByLocationCode(String locationCode) throws Exception {
1148         LOG.debug("Inside the getLocationByLocationCode method");
1149         Map barMap = new HashMap();
1150         barMap.put(org.kuali.ole.OLEConstants.LOC_CD, locationCode);
1151         List<OleLocation> matchingLocation = (List<OleLocation>) KRADServiceLocator.getBusinessObjectService().findMatching(OleLocation.class, barMap);
1152         return matchingLocation.size()>0 ? matchingLocation.get(0) : null;
1153     }
1154 
1155 
1156     
1157 
1158 
1159 
1160 
1161 
1162 
1163 
1164 
1165 
1166 
1167 
1168 
1169 
1170 
1171 
1172 
1173 
1174 
1175 
1176 
1177 
1178 
1179 
1180 
1181 
1182 
1183 
1184 
1185 
1186 
1187 
1188 
1189 
1190 
1191 
1192 
1193 
1194 
1195 
1196 
1197 
1198 
1199 
1200 
1201 
1202 
1203 
1204 
1205 
1206 
1207 
1208 
1209 
1210 
1211 
1212 
1213 
1214 
1215 
1216 
1217 
1218 
1219 
1220 
1221 
1222 
1223 
1224 
1225 
1226 
1227     private List<DonorInfo> setDonorInfoToItem(List<OLELinkPurapDonor> oleDonors,List<DonorInfo> donorInfoList){
1228         for (OLELinkPurapDonor oleLinkPurapDonor : oleDonors) {
1229             DonorInfo donorInfo = new DonorInfo();
1230             donorInfo.setDonorCode(oleLinkPurapDonor.getDonorCode());
1231             Map donorMap = new HashMap();
1232             donorMap.put(OLEConstants.DONOR_CODE, oleLinkPurapDonor.getDonorCode());
1233             OLEDonor oleDonor = KRADServiceLocator.getBusinessObjectService().findByPrimaryKey(OLEDonor.class, donorMap);
1234             if (oleDonor != null) {
1235                 if (StringUtils.isNotEmpty(oleDonor.getDonorNote()))
1236                     donorInfo.setDonorNote(oleDonor.getDonorNote());
1237                 if (StringUtils.isNotEmpty(oleDonor.getDonorPublicDisplay()))
1238                     donorInfo.setDonorPublicDisplay(oleDonor.getDonorPublicDisplay());
1239             }
1240             donorInfoList.add(donorInfo);
1241         }
1242         return donorInfoList;
1243     }
1244 
1245     @Override
1246     public void updateItemLocation(PurchaseOrderDocument document, PurApItem item) {
1247         OlePurchaseOrderItem olePurchaseOrderItem = (OlePurchaseOrderItem) item;
1248         try {
1249             List<String> itemTitleIdsList = new ArrayList<String>();
1250             List<BibTree> bibTrees= new ArrayList<BibTree>();
1251             String poLineItemId =  olePurchaseOrderItem.getItemIdentifier()!=null?olePurchaseOrderItem.getItemIdentifier().toString():null;
1252             itemTitleIdsList.add(olePurchaseOrderItem.getItemTitleId());
1253             bibTrees = getBibTreeDocuments(itemTitleIdsList);
1254             for (BibTree bibTree : bibTrees) {
1255                 if (null != olePurchaseOrderItem.getItemTitleId()) {
1256                     if (olePurchaseOrderItem.isItemLocationChangeFlag()) {
1257                         if (StringUtils.isNotBlank(olePurchaseOrderItem.getItemLocation()) && olePurchaseOrderItem.getCopyList().size() == 1) {
1258                             if( bibTree.getHoldingsTrees().size()>0 ){
1259                                 OleCopy copy = olePurchaseOrderItem.getCopyList().get(0);
1260                                 copy.setLocation(olePurchaseOrderItem.getItemLocation());
1261                                 updateOleHolding(copy.getInstanceId(),bibTree, copy);
1262                                 updateOleItem(document.getPurapDocumentIdentifier().toString(), olePurchaseOrderItem.getCopyList().get(0).getItemUUID(),poLineItemId, olePurchaseOrderItem);
1263                             }
1264                         }
1265                     }
1266                 }
1267             }
1268         } catch (Exception e) {
1269             e.printStackTrace();
1270             throw new RuntimeException(e);
1271         }
1272     }
1273 
1274     private void updateOleHoldingStaffOnly(String holdingId, BibTree bibTree, OleCopy copy,boolean staffOnly) throws Exception {
1275         org.kuali.ole.docstore.common.document.content.instance.OleHoldings oleHoldings = setHoldingDetails(copy);
1276         oleHoldings.setReceiptStatus(OLEConstants.OleLineItemReceiving.NOT_RECEIVED_STATUS);
1277         oleHoldings.setHoldingsIdentifier(holdingId);
1278         Holdings newHoldings=new PHoldings();
1279         newHoldings.setContent(new HoldingOlemlRecordProcessor().toXML(oleHoldings));
1280         newHoldings.setStaffOnly(staffOnly);
1281         newHoldings.setId(holdingId);
1282         newHoldings.setBib(bibTree.getBib());
1283         getDocstoreClientLocator().getDocstoreClient().updateHoldings(newHoldings);
1284     }
1285 
1286     private void updateOleHolding(String holdingId, BibTree bibTree, OleCopy copy) throws Exception {
1287         org.kuali.ole.docstore.common.document.content.instance.OleHoldings oleHoldings = setHoldingDetails(copy);
1288         oleHoldings.setReceiptStatus(OLEConstants.OleLineItemReceiving.NOT_RECEIVED_STATUS);
1289         oleHoldings.setHoldingsIdentifier(holdingId);
1290         Holdings holdings=new PHoldings();
1291         holdings.setId(holdingId);
1292         holdings.setContent(new HoldingOlemlRecordProcessor().toXML(oleHoldings));
1293         holdings.setBib(bibTree.getBib());
1294         getDocstoreClientLocator().getDocstoreClient().updateHoldings(holdings);
1295     }
1296 
1297     private void updateOleItem(String poNumber, String itemId, String poLineItemId, OlePurchaseOrderItem singleItem) throws Exception {
1298         org.kuali.ole.docstore.common.document.Item item = getDocstoreClientLocator().getDocstoreClient().retrieveItem(itemId);
1299         Item itemContent=new ItemOlemlRecordProcessor().fromXML(item.getContent());
1300         List<DonorInfo> donorInfoList = setDonorInfoToItem(singleItem.getOleDonors(), new ArrayList<DonorInfo>());
1301         itemContent.setDonorInfo(donorInfoList);
1302         itemContent.setPurchaseOrderLineItemIdentifier(poNumber);
1303         if (singleItem != null) {
1304             itemContent.setVendorLineItemIdentifier(singleItem.getVendorItemPoNumber());
1305             if (singleItem.getExtendedPrice() != null) {
1306                 itemContent.setPrice(singleItem.getExtendedPrice().toString());
1307             }
1308             itemContent.setFund(populateFundCodes(singleItem.getSourceAccountingLines()));
1309         }
1310         itemContent.setItemIdentifier(itemId);
1311         item.setContent(new ItemOlemlRecordProcessor().toXML(itemContent));
1312         getDocstoreClientLocator().getDocstoreClient().updateItem(item);
1313     }
1314 
1315     private void updateOleItemStaffOnly(String poNumber, String itemId, String poLineItemId, String note, boolean staffOnly, OlePurchaseOrderItem singleItem) throws Exception {
1316         org.kuali.ole.docstore.common.document.Item item = getDocstoreClientLocator().getDocstoreClient().retrieveItem(itemId);
1317         Item itemContent=new ItemOlemlRecordProcessor().fromXML(item.getContent());
1318         if (StringUtils.isNotEmpty(poNumber)) {
1319             itemContent.setPurchaseOrderLineItemIdentifier(poNumber);
1320         }
1321         if (singleItem != null) {
1322             itemContent.setVendorLineItemIdentifier(singleItem.getVendorItemPoNumber());
1323             if (singleItem.getExtendedPrice() != null) {
1324                 itemContent.setPrice(singleItem.getExtendedPrice().toString());
1325             }
1326             itemContent.setFund(populateFundCodes(singleItem.getSourceAccountingLines()));
1327         }
1328         itemContent.setItemIdentifier(itemId);
1329         if (StringUtils.isNotEmpty(note)) {
1330             List<Note> noteList = itemContent.getNote()!=null ? itemContent.getNote() : (List<Note>) new ArrayList<Note>();
1331             Note noteObj = new Note();
1332             noteObj.setType(OLEConstants.NON_PUBLIC);
1333             noteObj.setValue(note);
1334             noteList.add(noteObj);
1335             itemContent.setNote(noteList);
1336         }
1337         item.setContent(new ItemOlemlRecordProcessor().toXML(itemContent));
1338         item.setStaffOnly(staffOnly);
1339         item.setId(itemContent.getItemIdentifier());
1340         getDocstoreClientLocator().getDocstoreClient().updateItem(item);
1341     }
1342 
1343     private void updateRecordForPOVoidDocument(String poNumber, BibTree bibTree, String poLineItemId, String note ,List<OleCopy> copyList, OlePurchaseOrderItem singleItem) throws Exception {
1344         OleCopy copy = copyList.get(0);
1345         if (bibTree.getHoldingsTrees().size() == 1 && copyList.size()==1) {
1346             bibTree.getBib().setStaffOnly(true);
1347             getDocstoreClientLocator().getDocstoreClient().updateBib(bibTree.getBib());
1348         }
1349         if (copyList.size()==1) {
1350             updateOleHoldingStaffOnly(copy.getInstanceId(),bibTree,copy,true);
1351         }
1352         for (OleCopy oleCopy : copyList) {
1353             updateOleItemStaffOnly(poNumber, oleCopy.getItemUUID(),poLineItemId,note,true, singleItem);
1354             oleCopy.setReqDocNum(null);
1355             oleCopy.setReqItemId(null);
1356         }
1357     }
1358 
1359     private void updateRecordForPOReOpenDocument(String poNumber, BibTree bibTree, String poLineItemId, List<OleCopy> copyList, OlePurchaseOrderItem singleItem) throws Exception {
1360         OleCopy copy = copyList.get(0);
1361         if (bibTree.getBib().getId().equalsIgnoreCase(OLEConstants.TRUE)) {
1362             bibTree.getBib().setStaffOnly(false);
1363             getDocstoreClientLocator().getDocstoreClient().updateBib(bibTree.getBib());
1364         }
1365         if (copyList.size()==1) {
1366             updateOleHoldingStaffOnly(copy.getInstanceId(),bibTree,copy,false);
1367         }
1368         for (OleCopy oleCopy : copyList) {
1369             updateOleItemStaffOnly(poNumber, oleCopy.getItemUUID(),poLineItemId,null,false, singleItem);
1370             oleCopy.setReqDocNum(null);
1371             oleCopy.setReqItemId(null);
1372         }
1373     }
1374 
1375     private void updateRecordForPOAmendmentDocument(String poNumber, BibTree bibTree,List<OleCopy> copyList, String poLineItemId,List<OLELinkPurapDonor> oleDonors,List<OleCopy> oleCopyList,
1376                                                     String itemTypeDescription,String itemStatusValue, OlePurchaseOrderItem singleItem) throws Exception {
1377         OleCopy copy = oleCopyList.get(0);
1378         if (copyList.size()>1) {
1379             if (!this.copyFlag) {
1380                 List <OleCopy> newCopyList = new ArrayList<>();
1381                 int j=0;
1382                 for (OleCopy newCopy : oleCopyList) {
1383                     if (!this.newCopyFlag) { 
1384                         updateOleHolding(bibTree.getHoldingsTrees().get(0).getHoldings().getId(),bibTree, newCopy);
1385                         if (bibTree.getHoldingsTrees().get(0).getItems().size()==1) {
1386                             updateOleItem(poNumber, bibTree.getHoldingsTrees().get(0).getItems().get(0).getId(),poLineItemId, singleItem);
1387                             newCopy.setInstanceId(bibTree.getHoldingsTrees().get(0).getHoldings().getId());
1388                             newCopy.setItemUUID(bibTree.getHoldingsTrees().get(0).getItems().get(0).getId());
1389                             for (int copyCnt=0; copyCnt<oleCopyList.size(); copyCnt++) {
1390                                 if (!newCopy.getCopyId().equals(oleCopyList.get(copyCnt).getCopyId())) {
1391                                     newCopyList.add(oleCopyList.get(copyCnt));
1392                                 }
1393                             }
1394                             this.copyCount++;
1395                         }
1396                         else {
1397                             int itemRecord=0;
1398                             for (int copyRecord=0;copyRecord<oleCopyList.size();) {
1399                                 if ( itemRecord<bibTree.getHoldingsTrees().get(0).getItems().size()) {
1400                                     updateOleItem(poNumber, bibTree.getHoldingsTrees().get(0).getItems().get(itemRecord).getId(), poLineItemId, singleItem);
1401                                     oleCopyList.get(copyRecord).setInstanceId(bibTree.getHoldingsTrees().get(0).getHoldings().getId());
1402                                     oleCopyList.get(copyRecord).setItemUUID(bibTree.getHoldingsTrees().get(0).getItems().get(itemRecord).getId());
1403                                     this.copyCount++;itemRecord++;copyRecord++;
1404                                 }
1405                                 if(itemRecord==bibTree.getHoldingsTrees().get(0).getItems().size()){
1406                                     if (copyRecord < oleCopyList.size()) {
1407                                         newCopyList.add(oleCopyList.get(copyRecord));
1408                                         copyRecord++;
1409                                     }
1410                                 }
1411                             }
1412                         }
1413                         this.newCopyFlag = true;
1414                     } else {
1415                         if (newCopyList.size()>0) {
1416 
1417                             
1418 
1419 
1420 
1421 
1422 
1423 
1424                             createOleHoldingsTree(poNumber, bibTree,newCopyList,poLineItemId,oleDonors,oleCopyList,itemTypeDescription,itemStatusValue,singleItem);
1425                         }
1426                         if (this.copyCount==oleCopyList.size()) {
1427                             break;
1428                         }
1429                     }
1430                 }
1431                 this.copyFlag = true;
1432             } else {  
1433                 createOleHoldingsTree(poNumber, bibTree,copyList,poLineItemId,oleDonors,oleCopyList,itemTypeDescription,itemStatusValue, singleItem);
1434             }
1435         }
1436     }
1437 
1438     public void createOleHoldingsTree(String poNumber, BibTree bibTree,List<OleCopy> copyList, String poLineItemId,List<OLELinkPurapDonor> oleDonors,List<OleCopy> oleCopyList,
1439                                         String itemTypeDescription,String itemStatusValue, OlePurchaseOrderItem singleItem) throws Exception {
1440         OleCopy copy = oleCopyList.get(0);
1441         Holdings pHoldings = new PHoldings();
1442         if (StringUtils.isNotBlank(copy.getInstanceId())) {
1443             pHoldings = getDocstoreClientLocator().getDocstoreClient().retrieveHoldings(copy.getInstanceId());
1444         }
1445         List<org.kuali.ole.docstore.common.document.Item> itemList = new ArrayList<org.kuali.ole.docstore.common.document.Item>();
1446         org.kuali.ole.docstore.common.document.content.instance.OleHoldings oleHoldings = setHoldingDetails(copy);
1447         oleHoldings.setHoldingsIdentifier(null);
1448         oleHoldings.setReceiptStatus(OLEConstants.OleLineItemReceiving.NOT_RECEIVED_STATUS);
1449         List<Integer> copyIdList = new ArrayList<>();
1450         for (OleCopy oleCopy : copyList) {
1451             if (oleCopy.getLocation().equals(copy.getLocation())) {
1452                 Item item = setItemDetails(oleCopy, itemTypeDescription);
1453                 ItemStatus itemStatus = new ItemStatus();
1454                 itemStatus.setCodeValue(itemStatusValue);
1455                 itemStatus.setFullValue(itemStatusValue);
1456                 item.setItemStatus(itemStatus);
1457                 item.setPurchaseOrderLineItemIdentifier(poNumber);
1458                 if (singleItem != null) {
1459                     item.setVendorLineItemIdentifier(singleItem.getVendorItemPoNumber());
1460                     if (singleItem.getExtendedPrice() != null) {
1461                         item.setPrice(singleItem.getExtendedPrice().toString());
1462                     }
1463                     item.setFund(populateFundCodes(singleItem.getSourceAccountingLines()));
1464                 }
1465                 List<DonorInfo> donorInfoList = setDonorInfoToItem(oleDonors, new ArrayList<DonorInfo>());
1466                 item.setDonorInfo(donorInfoList);
1467                 org.kuali.ole.docstore.common.document.Item itemDocument = new org.kuali.ole.docstore.common.document.Item();
1468                 itemDocument.setContent(new ItemOlemlRecordProcessor().toXML(item));
1469                 itemDocument.setCategory(OLEConstants.ITEM_CATEGORY);
1470                 itemDocument.setType(OLEConstants.ITEM_TYPE);
1471                 itemDocument.setFormat(OLEConstants.ITEM_FORMAT);
1472                 if (StringUtils.isNotBlank(copy.getInstanceId())) {
1473                     itemDocument.setHolding(pHoldings);
1474                     getDocstoreClientLocator().getDocstoreClient().createItem(itemDocument);
1475                 } else {
1476                     itemList.add(itemDocument);
1477                 }
1478                 copyIdList.add(oleCopy.getCopyId());
1479             }
1480         }
1481         HoldingsTree holdingsTree = new HoldingsTree();
1482         if (StringUtils.isBlank(copy.getInstanceId())) {
1483             holdingsTree.getItems().addAll(itemList);
1484             Holdings holdings = new PHoldings();
1485             holdings.setCategory(DocCategory.WORK.getCode());
1486             holdings.setType(org.kuali.ole.docstore.common.document.content.enums.DocType.HOLDINGS.getCode());
1487             holdings.setFormat(org.kuali.ole.docstore.common.document.content.enums.DocFormat.OLEML.getCode());
1488             holdings.setContent(new HoldingOlemlRecordProcessor().toXML(oleHoldings));
1489             Bib bib = getDocstoreClientLocator().getDocstoreClient().retrieveBib(bibTree.getBib().getId());
1490             holdings.setBib(bib);
1491             holdingsTree.setHoldings(holdings);
1492             getDocstoreClientLocator().getDocstoreClient().createHoldingsTree(holdingsTree);
1493         } else {
1494             holdingsTree = getDocstoreClientLocator().getDocstoreClient().retrieveHoldingsTree(copy.getInstanceId());
1495         }
1496         int i = 0;
1497         for (org.kuali.ole.docstore.common.document.Item item : holdingsTree.getItems()) {
1498             for (OleCopy oleCopy : copyList) {
1499                 if (copyIdList != null && copyIdList.size() > i && copyIdList.get(i).equals(oleCopy.getCopyId())) {
1500                     oleCopy.setInstanceId(holdingsTree.getHoldings().getId());
1501                     oleCopy.setItemUUID(item.getId());
1502                     this.copyCount++;
1503                     if (LOG.isDebugEnabled()) {
1504                         LOG.debug("Instance UUID" + holdingsTree.getHoldings().getId() + "****** Item UUID" + item.getId());
1505                     }
1506                 }
1507             }
1508             i++;
1509 
1510         }
1511     }
1512 
1513     private String populateFundCodes(List<PurApAccountingLine> purApAccountingLines) {
1514         StringBuffer fundCode = new StringBuffer();
1515         List fundCodeList = new ArrayList();
1516         if (purApAccountingLines != null && purApAccountingLines.size() > 0) {
1517             for (PurApAccountingLine accountingLine : purApAccountingLines) {
1518                 Map map = new HashMap();
1519                 map.put(org.kuali.ole.OLEConstants.ACCOUNT_NUMBER, accountingLine.getAccountNumber());
1520                 map.put(org.kuali.ole.OLEConstants.OBJECT_CODE, accountingLine.getFinancialObjectCode());
1521                 OleVendorAccountInfo oleVendorAccountInfo = KRADServiceLocator.getBusinessObjectService().findByPrimaryKey(OleVendorAccountInfo.class, map);
1522                 if (oleVendorAccountInfo != null && !fundCodeList.contains(oleVendorAccountInfo.getVendorRefNumber())) {
1523                     fundCodeList.add(oleVendorAccountInfo.getVendorRefNumber());
1524                     fundCode.append(oleVendorAccountInfo.getVendorRefNumber());
1525                     fundCode.append(org.kuali.ole.OLEConstants.COMMA);
1526                     fundCode.append(' ');
1527                 }
1528             }
1529         }
1530         if (fundCode.length() > 0) {
1531             fundCode.deleteCharAt(fundCode.length() - 2);
1532             return fundCode.toString();
1533         }
1534         return null;
1535     }
1536 
1537     public boolean isValidLocation(String location) {
1538         List<String> locationList = LocationValuesBuilder.retrieveLocationDetailsForSuggest(location);
1539         if (locationList != null && locationList.size() > 0) {
1540             for (String locationValue : locationList) {
1541                 if (locationValue.equalsIgnoreCase(location)) {
1542                     return true;
1543                 }
1544             }
1545         }
1546         return false;
1547     }
1548 
1549 }