001package org.kuali.ole.describe.controller; 002 003import org.apache.commons.collections.CollectionUtils; 004import org.apache.commons.lang.StringUtils; 005import org.apache.log4j.Logger; 006import org.apache.solr.client.solrj.SolrServerException; 007import org.kuali.ole.DocumentUniqueIDPrefix; 008import org.kuali.ole.OLEConstants; 009import org.kuali.ole.OleEditorResponseHandler; 010import org.kuali.ole.deliver.bo.SystemGeneratedBill; 011import org.kuali.ole.describe.bo.DocumentSelectionTree; 012import org.kuali.ole.describe.bo.DocumentTreeNode; 013import org.kuali.ole.describe.bo.MarcEditorControlField; 014import org.kuali.ole.describe.bo.MarcEditorDataField; 015import org.kuali.ole.describe.bo.MarcEditorFormDataHandler; 016import org.kuali.ole.describe.bo.OleBibliographicRecordStatus; 017import org.kuali.ole.describe.bo.marc.structuralfields.ControlFields; 018import org.kuali.ole.describe.bo.marc.structuralfields.controlfield006.ControlField006Text; 019import org.kuali.ole.describe.bo.marc.structuralfields.controlfield007.ControlField007Text; 020import org.kuali.ole.describe.bo.marc.structuralfields.controlfield008.ControlField008; 021import org.kuali.ole.describe.form.EditorForm; 022import org.kuali.ole.describe.form.WorkBibMarcForm; 023import org.kuali.ole.describe.form.WorkEInstanceOlemlForm; 024import org.kuali.ole.describe.service.DiscoveryHelperService; 025import org.kuali.ole.docstore.common.client.DocstoreClient; 026import org.kuali.ole.docstore.common.document.*; 027import org.kuali.ole.docstore.common.document.Item; 028import org.kuali.ole.docstore.common.document.content.bib.marc.BibMarcRecord; 029import org.kuali.ole.docstore.common.document.content.bib.marc.BibMarcRecords; 030import org.kuali.ole.docstore.common.document.content.bib.marc.xstream.BibMarcRecordProcessor; 031import org.kuali.ole.docstore.common.document.content.enums.DocCategory; 032import org.kuali.ole.docstore.common.document.content.enums.DocFormat; 033import org.kuali.ole.docstore.common.document.content.instance.xstream.HoldingOlemlRecordProcessor; 034import org.kuali.ole.docstore.common.exception.DocstoreException; 035import org.kuali.ole.docstore.engine.client.DocstoreLocalClient; 036import org.kuali.ole.docstore.model.bo.WorkBibDocument; 037import org.kuali.ole.docstore.model.bo.WorkHoldingsDocument; 038import org.kuali.ole.docstore.model.bo.WorkInstanceDocument; 039import org.kuali.ole.docstore.model.bo.WorkItemDocument; 040import org.kuali.ole.docstore.model.enums.DocType; 041import org.kuali.ole.docstore.model.xmlpojo.ingest.Response; 042import org.kuali.ole.docstore.model.xmlpojo.ingest.ResponseDocument; 043import org.kuali.ole.docstore.model.xmlpojo.work.bib.marc.ControlField; 044import org.kuali.ole.docstore.model.xmlpojo.work.bib.marc.DataField; 045import org.kuali.ole.docstore.model.xmlpojo.work.bib.marc.SubField; 046import org.kuali.ole.docstore.model.xmlpojo.work.bib.marc.WorkBibMarcRecord; 047import org.kuali.ole.docstore.model.xstream.ingest.ResponseHandler; 048import org.kuali.ole.docstore.validation.DocStoreValidationError; 049import org.kuali.ole.docstore.validation.WorkBibMarcRecordValidator; 050import org.kuali.ole.pojo.OleBibRecord; 051import org.kuali.ole.pojo.OleEditorResponse; 052import org.kuali.ole.select.bo.OLEEditorResponse; 053import org.kuali.ole.select.businessobject.OleDocstoreResponse; 054import org.kuali.ole.select.document.OLEEResourceInstance; 055import org.kuali.ole.select.document.OLEEResourceRecordDocument; 056import org.kuali.ole.select.service.impl.OleExposedWebServiceImpl; 057import org.kuali.ole.service.OLEEResourceSearchService; 058import org.kuali.ole.sys.context.SpringContext; 059import org.kuali.rice.core.api.config.property.ConfigContext; 060import org.kuali.rice.core.api.config.property.ConfigurationService; 061import org.kuali.rice.core.api.exception.RiceRuntimeException; 062import org.kuali.rice.core.api.resourceloader.GlobalResourceLoader; 063import org.kuali.rice.core.api.util.tree.Node; 064import org.kuali.rice.kim.api.identity.Person; 065import org.kuali.rice.kim.api.identity.PersonService; 066import org.kuali.rice.kim.api.permission.PermissionService; 067import org.kuali.rice.kim.api.services.KimApiServiceLocator; 068import org.kuali.rice.krad.service.*; 069import org.kuali.rice.krad.uif.UifParameters; 070import org.kuali.rice.krad.util.GlobalVariables; 071import org.kuali.rice.krad.util.KRADConstants; 072 073import javax.servlet.http.HttpServletRequest; 074import java.text.SimpleDateFormat; 075import java.util.*; 076 077/** 078 * Class for handling all editor operations for WorkBibMarc documents. 079 */ 080public class WorkBibMarcEditor extends AbstractEditor implements 081 DocumentEditor { 082 083 private static final Logger LOG = Logger.getLogger(WorkBibMarcEditor.class); 084 085 private MarcEditorFormDataHandler marcEditorFormDataHandler; 086 private BibMarcRecordProcessor bibMarcRecordProcessor = new BibMarcRecordProcessor(); 087 private OLEEResourceSearchService oleEResourceSearchService; 088 private DocumentService documentService; 089 private String tokenId; 090 private static WorkBibMarcEditor workBibMarcEditor = new WorkBibMarcEditor(); 091 private DocstoreClient docstoreClient = getDocstoreLocalClient(); 092 093 public static WorkBibMarcEditor getInstance() { 094 return workBibMarcEditor; 095 } 096 097 private WorkBibMarcEditor() { 098 } 099 100 public OLEEResourceSearchService getOleEResourceSearchService() { 101 if (oleEResourceSearchService == null) { 102 oleEResourceSearchService = GlobalResourceLoader.getService(OLEConstants.OLEEResourceRecord.ERESOURSE_SEARCH_SERVICE); 103 } 104 return oleEResourceSearchService; 105 } 106 107 public DocumentService getDocumentService() { 108 if (this.documentService == null) { 109 this.documentService = KRADServiceLocatorWeb.getDocumentService(); 110 } 111 return this.documentService; 112 } 113 114 private boolean canEditBib(String principalId) { 115 PermissionService service = KimApiServiceLocator.getPermissionService(); 116 return service.hasPermission(principalId, OLEConstants.CAT_NAMESPACE, OLEConstants.MARC_EDITOR_EDIT_BIB); 117 } 118 119 private boolean canAddBib(String principalId) { 120 PermissionService service = KimApiServiceLocator.getPermissionService(); 121 return service.hasPermission(principalId, OLEConstants.CAT_NAMESPACE, OLEConstants.MARC_EDITOR_ADD_BIB); 122 } 123 124 @Override 125 public EditorForm loadDocument(EditorForm editorForm) { 126 WorkBibMarcForm workBibMarcForm = new WorkBibMarcForm(); 127 String docId = editorForm.getDocId(); 128 //Modified title display for left pane 129 editorForm.setHasLink(false); 130 workBibMarcForm.setHideFooter(true); 131 List<BibTree> bibTreeList = new ArrayList<>(); 132 BibTree bibTree = null; 133 String directory = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(org.kuali.ole.sys.OLEConstants.EXTERNALIZABLE_HELP_URL_KEY); 134 editorForm.setExternalHelpUrl(directory+"/reference/webhelp/CG/content/ch01s02.html"); 135 editorForm.setHeaderText("Bib"); 136 if (null != docId && StringUtils.isNotEmpty(docId)) { 137 try { 138 bibTree = docstoreClient.retrieveBibTree(docId); 139 bibTreeList.add(bibTree); 140 workBibMarcForm.setBibTreeList(bibTreeList); 141 Bib bib = bibTree.getBib(); 142 BibMarcRecords bibMarcRecords = new BibMarcRecordProcessor().fromXML(bib.getContent()); 143 144 145 editorForm.setCreatedBy(bib.getCreatedBy()); 146 editorForm.setCreatedDate(bib.getCreatedOn()); 147 editorForm.setUpdatedBy(bib.getUpdatedBy()); 148 editorForm.setUpdatedDate(bib.getUpdatedOn()); 149 editorForm.setStatusUpdatedBy(bib.getStatusUpdatedBy()); 150 editorForm.setStatusUpdatedOn(bib.getStatusUpdatedOn()); 151 editorForm.setStaffOnlyFlagForBib(bib.isStaffOnly()); 152 153 List<BibMarcRecord> bibMarcRecordList = bibMarcRecords.getRecords(); 154 BibMarcRecord bibMarcRecord = bibMarcRecordList.get(0); 155 Collections.sort(bibMarcRecord.getDataFields()); 156 editorForm.setTitle(getMarcFormDataHandler().buildMarcEditorTitleField(bibMarcRecord.getDataFields())+" / "+ DocumentUniqueIDPrefix.getDocumentId(bib.getId())); 157 workBibMarcForm.setLeader(bibMarcRecord.getLeader()); 158 workBibMarcForm.setControlFields(getMarcFormDataHandler().buildMarcEditorControlFields(workBibMarcForm, bibMarcRecord.getControlFields())); 159 List<MarcEditorDataField> marcEditorDataFields = new ArrayList<MarcEditorDataField>(); 160 marcEditorDataFields = getMarcFormDataHandler().buildMarcEditorDataFields(bibMarcRecord.getDataFields()); 161 if (!editorForm.getEditable().equalsIgnoreCase("true")) { 162 for (MarcEditorDataField marcEditorDataField : marcEditorDataFields) { 163 String tempValue = null; 164 if (marcEditorDataField.getValue() != null) { 165 tempValue = marcEditorDataField.getValue().replace(""", "\""); 166 tempValue = tempValue.replaceAll(" ", " "); 167 marcEditorDataField.setValue(tempValue); 168 } 169 } 170 } 171 if (CollectionUtils.isEmpty(marcEditorDataFields)) { 172 marcEditorDataFields.add(new MarcEditorDataField()); 173 } 174 workBibMarcForm.setDataFields(marcEditorDataFields); 175 BusinessObjectService boService = KRADServiceLocator.getBusinessObjectService(); 176 Map parentCriteria = new HashMap(); 177 String bibStatusName = bib.getStatus(); 178 parentCriteria.put("bibliographicRecordStatusName", bibStatusName); 179 OleBibliographicRecordStatus bibliographicRecordStatus = boService.findByPrimaryKey(OleBibliographicRecordStatus.class, parentCriteria); 180 editorForm.setOleBibliographicRecordStatus(bibliographicRecordStatus); 181 //workBibMarcForm.setMessage("Please edit details for the Bib record."); 182 if (editorForm.getEditable().equalsIgnoreCase("true")) { 183 boolean hasEditPermission = canEditBib(GlobalVariables.getUserSession().getPrincipalId()); 184 if (!hasEditPermission) { 185 editorForm.setHideFooter(false); 186 GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_INFO, OLEConstants.ERROR_BIB_EDIT_AUTHORIZATION); 187 } else { 188 GlobalVariables.getMessageMap().putInfo(KRADConstants.GLOBAL_INFO, "info.edit.details.bib.record"); 189 } 190 } else { 191 GlobalVariables.getMessageMap().putInfo(KRADConstants.GLOBAL_INFO, "info.edit.details.bib.record"); 192 } 193 } catch (DocstoreException e) { 194 LOG.error(e); 195 DocstoreException docstoreException = (DocstoreException) e; 196 if (org.apache.commons.lang3.StringUtils.isNotEmpty(docstoreException.getErrorCode())) { 197 GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, docstoreException.getErrorCode()); 198 } else { 199 GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, e.getMessage()); 200 } 201 return workBibMarcForm; 202 } catch (Exception e) { 203 LOG.error("Exception ", e); 204 GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS,"docstore.response", e.getMessage() ); 205 } 206 } else { 207 //workBibMarcForm.setMessage("Please enter details for new Bib record."); 208 boolean hasAddPermission = canAddBib(GlobalVariables.getUserSession().getPrincipalId()); 209 if (!hasAddPermission) { 210 workBibMarcForm.setEditable("false"); 211 editorForm.setHideFooter(false); 212 GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_INFO, OLEConstants.ERROR_BIB_CREATE_AUTHORIZATION); 213 } else { 214 GlobalVariables.getMessageMap().putInfo(KRADConstants.GLOBAL_INFO, "info.edit.details.bib.new.record"); 215 } 216 217 } 218 // Add a node for this document to the left pane tree. 219 addDocumentToTree(editorForm); 220 setControlFields(workBibMarcForm); 221 workBibMarcForm.setViewId("WorkBibEditorViewPage"); 222 return workBibMarcForm; 223 } 224 225 @Override 226 public EditorForm saveDocument(EditorForm editorForm) { 227 228 Bib bib = null; 229 String editorStatusMessage = ""; 230 editorForm.setHasLink(true); 231 WorkBibMarcForm workBibMarcForm = (WorkBibMarcForm) editorForm.getDocumentForm(); 232 String bibliographicRecordStatusCode = editorForm.getOleBibliographicRecordStatus() 233 .getBibliographicRecordStatusCode(); 234 boolean staffOnlyFlag = editorForm.isStaffOnlyFlagForBib(); 235 tokenId = editorForm.getTokenId(); 236 String eResourceID = editorForm.geteResourceId(); 237 String holdingsId = ""; 238 buildControlFieldList(workBibMarcForm); 239 buildDataFieldList(workBibMarcForm); 240 boolean valid = validateMarcEditorData(workBibMarcForm); 241 if (valid) { 242 buildLeader(workBibMarcForm); 243 } 244 Date date = new Date(); 245 SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); 246 String dateStr = sdf.format(date); 247 String user = GlobalVariables.getUserSession().getLoggedInUserPrincipalName(); 248 BusinessObjectService boService = KRADServiceLocator.getBusinessObjectService(); 249 OleBibliographicRecordStatus bibliographicRecordStatus = null; 250 if (bibliographicRecordStatusCode != null) { 251 Map parentCriteria = new HashMap(); 252 parentCriteria.put("bibliographicRecordStatusCode", bibliographicRecordStatusCode); 253 bibliographicRecordStatus = boService.findByPrimaryKey(OleBibliographicRecordStatus.class, parentCriteria); 254 } 255 if (valid) { 256 MarcEditorFormDataHandler marcEditorFormDataHandler = getMarcFormDataHandler(); 257 String content = marcEditorFormDataHandler.buildBibRecordForDocStore(workBibMarcForm); 258 String uuid = editorForm.getDocId(); 259 260 261 try { 262 if (null != uuid && !uuid.trim().equals("")) { 263 if (boService != null) { 264 try { 265 bib = docstoreClient.retrieveBib(uuid); 266 } 267 catch (Exception e) { 268 LOG.error("Exception :", e); 269 DocstoreException docstoreException = (DocstoreException) e; 270 if (org.apache.commons.lang3.StringUtils.isNotEmpty(docstoreException.getErrorCode())) { 271 GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, docstoreException.getErrorCode()); 272 } else { 273 GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, e.getMessage()); 274 } 275 return workBibMarcForm; 276 } 277 if (bibliographicRecordStatus != null) { 278 bib.setStatus(bibliographicRecordStatus.getBibliographicRecordStatusName()); 279 280 } else { 281 bib.setStatus(""); 282 } 283 } 284 bib.setStaffOnly(staffOnlyFlag); 285 bib.setContent(content); 286 bib.setUpdatedBy(GlobalVariables.getUserSession().getPrincipalName()); 287 bib.setUpdatedOn(dateStr); 288 long startTime = System.currentTimeMillis(); 289 try { 290 bib = docstoreClient.updateBib(bib); 291 } 292 catch (Exception e) { 293 DocstoreException docstoreException = (DocstoreException) e; 294 if (org.apache.commons.lang3.StringUtils.isNotEmpty(docstoreException.getErrorCode())) { 295 GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, docstoreException.getErrorCode(), bib.getId()); 296 } else { 297 GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, e.getMessage()); 298 } 299 return workBibMarcForm; 300 } 301 long endTime = System.currentTimeMillis(); 302 editorForm.setSolrTime(String.valueOf((endTime-startTime)/1000)); 303 editorStatusMessage = OLEConstants.BIB_EDITOR_UPDATE_SUCCESS; 304 String bibStatusName = bib.getStatus(); 305 editorForm.setCreatedBy(bib.getCreatedBy()); 306 editorForm.setCreatedDate(bib.getCreatedOn()); 307 editorForm.setUpdatedBy(bib.getUpdatedBy()); 308 editorForm.setUpdatedDate(bib.getUpdatedOn()); 309 editorForm.setStatusUpdatedOn(bib.getStatusUpdatedOn()); 310 editorForm.setStatusUpdatedBy(bib.getStatusUpdatedBy()); 311 Map parentCriteria = new HashMap(); 312 parentCriteria.put("bibliographicRecordStatusName", bibStatusName); 313 bibliographicRecordStatus = boService 314 .findByPrimaryKey(OleBibliographicRecordStatus.class, parentCriteria); 315 if (bibliographicRecordStatus != null) { 316 editorForm.setOleBibliographicRecordStatus(bibliographicRecordStatus); 317 } 318 //TODO:Edit the processResponse methods 319 //processResponse(responseFromDocstore, workBibMarcForm, uuid); 320 321 } else { 322 BibTree bibTree = new BibTree(); 323 bib = new BibMarc(); 324 bib.setCategory(DocCategory.WORK.getCode()); 325 bib.setType(DocType.BIB.getCode()); 326 bib.setFormat(DocFormat.MARC.getCode()); 327 bib.setCreatedBy(user); 328 bib.setCreatedOn(dateStr); 329 bib.setStaffOnly(staffOnlyFlag); 330 bib.setContent(content); 331 if (bibliographicRecordStatus != null) { 332 bib.setStatus(bibliographicRecordStatus.getBibliographicRecordStatusName()); 333 } else { 334 bib.setStatus(""); 335 } 336 bibTree.setBib(bib); 337 HoldingsTree holdingsTree = getHoldingsTree(eResourceID); 338 if (holdingsTree != null && holdingsTree.getHoldings() != null) { 339 holdingsTree.getHoldings().setCreatedBy(user); 340 holdingsTree.getHoldings().setCreatedOn(dateStr); 341 /*if (!(StringUtils.isNotEmpty(eResourceID) || (StringUtils.isNotBlank(editorForm.getLinkToOrderOption()) && editorForm.getLinkToOrderOption().equals(OLEConstants.NB_ELECTRONIC)))) { 342 holdingsTree.getItems().get(0).setCreatedBy(user); 343 }*/ 344 bibTree.getHoldingsTrees().add(holdingsTree); 345 } 346 try { 347 try { 348 docstoreClient.createBib(bib); 349 } catch (DocstoreException e) { 350 LOG.error("Exception :", e); 351 DocstoreException docstoreException = (DocstoreException) e; 352 if (org.apache.commons.lang3.StringUtils.isNotEmpty(docstoreException.getErrorCode())) { 353 GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, docstoreException.getErrorCode()); 354 } else { 355 GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, e.getMessage()); 356 } 357 return workBibMarcForm; 358 } catch (Exception e) { 359 LOG.error("Exception ", e); 360 GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS,"docstore.response", e.getMessage() ); 361 } 362 if (holdingsTree != null && holdingsTree.getHoldings() != null) { 363 holdingsTree.getHoldings().setBib(bib); 364 try { 365 docstoreClient.createHoldingsTree(holdingsTree); 366 } catch (DocstoreException e) { 367 LOG.error("Exception :", e); 368 DocstoreException docstoreException = (DocstoreException) e; 369 if (org.apache.commons.lang3.StringUtils.isNotEmpty(docstoreException.getErrorCode())) { 370 GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, docstoreException.getErrorCode()); 371 } else { 372 GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, e.getMessage()); 373 } 374 return workBibMarcForm; 375 } catch (Exception e) { 376 LOG.error("Exception ", e); 377 GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, "docstore.response", e.getMessage()); 378 } 379 } 380 editorForm.setDocId(bib.getId()); 381 editorForm.setBibId(bib.getId()); 382 editorForm.setCreatedBy(bib.getCreatedBy()); 383 editorForm.setCreatedDate(bib.getCreatedOn()); 384 editorForm.setUpdatedBy(bib.getUpdatedBy()); 385 editorForm.setUpdatedDate(bib.getUpdatedOn()); 386 editorForm.setStatusUpdatedOn(bib.getStatusUpdatedOn()); 387 editorForm.setStatusUpdatedBy(bib.getStatusUpdatedBy()); 388 List<BibTree> bibTreeList = new ArrayList<>(); 389 bibTreeList.add(bibTree); 390 editorForm.setBibTreeList(bibTreeList); 391 editorStatusMessage = OLEConstants.BIB_EDITOR_CREATE_SUCCESS; 392 //TODO:Edit the processResponse methods 393 //processResponse(responseFromDocstore, workBibMarcForm, uuid); 394 processResponse(bib,editorForm.getLinkToOrderOption()); 395 workBibMarcForm.setLeader(""); 396 workBibMarcForm.setControlFields(Arrays.asList(new MarcEditorControlField())); 397 workBibMarcForm.setDataFields(Arrays.asList(new MarcEditorDataField())); 398 workBibMarcForm.setUuid(""); 399 if (holdingsTree != null && holdingsTree.getHoldings() != null) { 400 holdingsId = holdingsTree.getHoldings().getId(); 401 if (holdingsTree.getHoldings().getHoldingsType().equals(OLEConstants.OleHoldings.ELECTRONIC)) { 402 WorkEInstanceOlemlForm eHoldingForm = new WorkEInstanceOlemlForm(); 403 HoldingOlemlRecordProcessor holdingOlemlRecordProcessor = new HoldingOlemlRecordProcessor(); 404 eHoldingForm.seteResourceId(editorForm.geteResourceId()); 405 eHoldingForm.seteResourceTitle(editorForm.geteResourceTitle()); 406 eHoldingForm.setTokenId(editorForm.getTokenId()); 407 //getOleEResourceSearchService().getEResourcesFields(eResourceID, holdingsTree.getHoldings().getContentObject(), eHoldingForm); 408 holdingsTree.getHoldings().setId(holdingsId); 409 holdingsTree.getHoldings().getContentObject().setAccessStatus(OLEConstants.OleHoldings.ACTIVE); 410 holdingsTree.getHoldings().setContent(holdingOlemlRecordProcessor.toXML(holdingsTree.getHoldings().getContentObject())); 411 docstoreClient.updateHoldings(holdingsTree.getHoldings()); 412 } 413 } 414 } catch (Exception e) { 415 LOG.error("Exception :", e); 416 StringBuffer marcEditorErrorMessage = new StringBuffer(OLEConstants.MARC_EDITOR_FAILURE) 417 .append("\n" + e.getMessage()); 418 GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(KRADConstants.GLOBAL_ERRORS, "docstore.response", marcEditorErrorMessage.toString()); 419 } 420 } 421 if (StringUtils.isNotEmpty(bib.getId())) { 422 Map<String, String> tempId = new HashMap<String, String>(); 423 tempId.put(OLEConstants.BIB_ID, bib.getId()); 424 List<OLEEResourceInstance> oleERSInstances = (List<OLEEResourceInstance>) KRADServiceLocator.getBusinessObjectService().findMatching(OLEEResourceInstance.class, tempId); 425 if (oleERSInstances.size() > 0) { 426 for (OLEEResourceInstance oleeResourceInstance : oleERSInstances) { 427 if (oleeResourceInstance.getBibId().equals(bib.getId())) { 428 if (StringUtils.isNotEmpty(oleeResourceInstance.getOleERSIdentifier())) { 429 Map<String, String> eResId = new HashMap<String, String>(); 430 eResId.put(OLEConstants.OLEEResourceRecord.ERESOURCE_IDENTIFIER, oleeResourceInstance.getOleERSIdentifier()); 431 OLEEResourceRecordDocument tempDocument = (OLEEResourceRecordDocument) KRADServiceLocator.getBusinessObjectService().findByPrimaryKey(OLEEResourceRecordDocument.class, eResId); 432 Person principalPerson = SpringContext.getBean(PersonService.class).getPerson(GlobalVariables.getUserSession().getPerson().getPrincipalId()); 433 tempDocument.setDocumentHeader(SpringContext.getBean(DocumentHeaderService.class).getDocumentHeaderById(tempDocument.getDocumentNumber())); 434 tempDocument.getDocumentHeader().setWorkflowDocument(KRADServiceLocatorWeb.getWorkflowDocumentService().loadWorkflowDocument(tempDocument.getDocumentNumber(), principalPerson)); 435 if (tempDocument != null) { 436 try { 437 tempDocument.setSelectInstance(OLEConstants.OLEEResourceRecord.CREATE_NEW_INSTANCE); 438 tempDocument.seteInstanceFlag(true); 439 for (OLEEResourceInstance oleERSInstance : tempDocument.getOleERSInstances()) { 440 if (oleERSInstance.getBibId().equals(bib.getId())) { 441 processResponseForEResource(oleERSInstance.getInstanceId(), bib.getId(), tempDocument.getDocumentNumber()); 442 } 443 } 444 getOleEResourceSearchService().getNewInstance(tempDocument, tempDocument.getDocumentNumber()); 445 getDocumentService().updateDocument(tempDocument); 446 } catch (Exception e) { 447 LOG.error("Exception :", e); 448 throw new RiceRuntimeException( 449 "Exception trying to save document: " + tempDocument 450 .getDocumentNumber(), e); 451 } 452 } 453 } 454 } 455 } 456 } else { 457 if (StringUtils.isNotEmpty(eResourceID)) { 458 Map<String, String> eResId = new HashMap<String, String>(); 459 eResId.put(OLEConstants.OLEEResourceRecord.ERESOURCE_IDENTIFIER, eResourceID); 460 OLEEResourceRecordDocument tempDocument = (OLEEResourceRecordDocument) KRADServiceLocator.getBusinessObjectService().findByPrimaryKey(OLEEResourceRecordDocument.class, eResId); 461 Person principalPerson = SpringContext.getBean(PersonService.class).getPerson(GlobalVariables.getUserSession().getPerson().getPrincipalId()); 462 tempDocument.setDocumentHeader(SpringContext.getBean(DocumentHeaderService.class).getDocumentHeaderById(tempDocument.getDocumentNumber())); 463 tempDocument.getDocumentHeader().setWorkflowDocument(KRADServiceLocatorWeb.getWorkflowDocumentService().loadWorkflowDocument(tempDocument.getDocumentNumber(), principalPerson)); 464 if (tempDocument != null) { 465 try { 466 tempDocument.setSelectInstance(OLEConstants.OLEEResourceRecord.CREATE_NEW_INSTANCE); 467 tempDocument.seteInstanceFlag(true); 468 processResponseForEResource(holdingsId, bib.getId(), tempDocument.getDocumentNumber()); 469 getOleEResourceSearchService().getNewInstance(tempDocument, tempDocument.getDocumentNumber()); 470 getDocumentService().saveDocument(tempDocument); 471 } catch (Exception e) { 472 LOG.error("Exception :", e); 473 throw new RiceRuntimeException( 474 "Exception trying to save document: " + tempDocument 475 .getDocumentNumber(), e); 476 } 477 } 478 } 479 } 480 } 481 } catch (Exception e) { 482 LOG.error("Exception :", e); 483 StringBuffer marcEditorErrorMessage = new StringBuffer(OLEConstants.MARC_EDITOR_FAILURE) 484 .append("\n" + e.getMessage()); 485 GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(KRADConstants.GLOBAL_ERRORS, "record.save.fail.message"); 486 } 487 } else { 488 489 return workBibMarcForm; 490 } 491 workBibMarcForm.setViewId("WorkBibEditorViewPage"); 492 493 WorkBibMarcForm workBibMarcForm1 = (WorkBibMarcForm) loadDocument(editorForm); 494 GlobalVariables.getMessageMap().getInfoMessages().clear(); 495 GlobalVariables.getMessageMap().putInfo(KRADConstants.GLOBAL_INFO, editorStatusMessage); 496 editorForm.setShowClose(true); 497 return workBibMarcForm1; 498 } 499 500 /** 501 * Gets the isNewRecord attribute. 502 * if uuid is null return true else return false. 503 * 504 * @param uuid 505 * @return isNewRecord. 506 */ 507 private boolean isNewRecord(String uuid) { 508 return null == uuid; 509 } 510 511 /** 512 * This method will processResponse,provided the docStore should return response and should have a tokenId 513 * 514 * @param responseFromDocstore 515 * @param editorForm 516 */ 517 public void processResponse(String responseFromDocstore, EditorForm editorForm, String uuid) { 518 ResponseHandler responseHandler = new ResponseHandler(); 519 Response docStoreResponse = responseHandler.toObject(responseFromDocstore); 520 if (isSuccessfull(docStoreResponse)) { 521 if (responseToOLESentRequired()) { 522 if (uuid == null || StringUtils.isEmpty(uuid)) { 523 processNewRecordResponseForOLE(responseFromDocstore); 524 } else { 525 processEditRecordResponseForOLE(responseFromDocstore); 526 } 527 } 528 GlobalVariables.getMessageMap().putInfo(KRADConstants.GLOBAL_INFO, "marc.editor.success.message"); 529 } else 530 editorForm.setMessage(docStoreResponse.getMessage()); 531 } 532 533 public void processResponseForEResource(String instanceId, String bibId, String tokenId) throws Exception { 534 OLEEditorResponse oleEditorResponse = new OLEEditorResponse(); 535 oleEditorResponse.setTokenId(tokenId); 536 oleEditorResponse.setLinkedInstanceId(instanceId); 537 oleEditorResponse.setBib(docstoreClient.retrieveBib(bibId)); 538 HashMap<String, OLEEditorResponse> oleEditorResponseMap = new HashMap<String, OLEEditorResponse>(); 539 oleEditorResponseMap.put(tokenId, oleEditorResponse); 540 OleDocstoreResponse.getInstance().setEditorResponse(oleEditorResponseMap); 541 } 542 543 public void processResponse(Bib bib, String linkToOrderOption) { 544 OLEEditorResponse oleEditorResponse = new OLEEditorResponse(); 545 bib = (Bib) bib.deserializeContent(bib); 546 oleEditorResponse.setBib(bib); 547 oleEditorResponse.setTokenId(tokenId); 548 oleEditorResponse.setLinkToOrderOption(linkToOrderOption); 549 HashMap<String, OLEEditorResponse> oleEditorResponseMap = new HashMap<String, OLEEditorResponse>(); 550 oleEditorResponseMap.put(tokenId, oleEditorResponse); 551 OleDocstoreResponse.getInstance().setEditorResponse(oleEditorResponseMap); 552 } 553 554 /** 555 * The method will process the new record if it receives response form docStore and should have tokenId. 556 * 557 * @param responseFromDocstore 558 */ 559 private void processNewRecordResponseForOLE(String responseFromDocstore) { 560 String instanceUUID = null; 561 List bibInfo = null; 562 DiscoveryHelperService discoveryHelperService = GlobalResourceLoader.getService(OLEConstants.DISCOVERY_HELPER_SERVICE); 563 Response responseRecordForDocstore = getResponseRecordForDocstore(responseFromDocstore); 564 565 OleEditorResponse oleEditorResponse = new OleEditorResponse(); 566 OleBibRecord oleBibRecord = new OleBibRecord(); 567 568 instanceUUID = getUUID(responseRecordForDocstore, OLEConstants.INSTANCE_DOC_TYPE); 569 bibInfo = discoveryHelperService.getBibInformationFromInsatnceId(instanceUUID); 570 if (bibInfo.isEmpty()) { 571 try { 572 Thread.sleep(3000); 573 } catch (Exception ex) { 574 LOG.error("Exception :", ex); 575 } 576 bibInfo = discoveryHelperService.getBibInformationFromInsatnceId(instanceUUID); 577 } 578 oleBibRecord.setBibAssociatedFieldsValueMap((Map<String, ?>) bibInfo.get(0)); 579 oleBibRecord.setLinkedInstanceId(instanceUUID); 580 oleBibRecord.setBibUUID(getUUID(responseRecordForDocstore, OLEConstants.BIB_DOC_TYPE)); 581 582 oleEditorResponse.setOleBibRecord(oleBibRecord); 583 oleEditorResponse.setTokenId(tokenId); 584 585 OleEditorResponseHandler oleEditorResponseHandler = new OleEditorResponseHandler(); 586 String editorResponseXMLForOLE = oleEditorResponseHandler.toXML(oleEditorResponse); 587 588 589 OleExposedWebServiceImpl oleExposedWebService = (OleExposedWebServiceImpl) SpringContext.getBean("oleExposedWebService"); 590 591 oleExposedWebService.addDoctoreResponse(editorResponseXMLForOLE); 592 } 593 594 /** 595 * The method will process the edit record if it receives response form docStore and should have tokenId. 596 * 597 * @param responseFromDocstore 598 */ 599 private void processEditRecordResponseForOLE(String responseFromDocstore) { 600 String bibUUID = null; 601 List bibInfo = null; 602 DiscoveryHelperService discoveryHelperService = GlobalResourceLoader.getService(OLEConstants.DISCOVERY_HELPER_SERVICE); 603 Response responseRecordForDocstore = getResponseRecordForDocstore(responseFromDocstore); 604 OleEditorResponse oleEditorResponse = new OleEditorResponse(); 605 OleBibRecord oleBibRecord = new OleBibRecord(); 606 bibUUID = getUUID(responseRecordForDocstore, OLEConstants.BIB_DOC_TYPE); 607 bibInfo = discoveryHelperService.getBibInformationFromBibId(bibUUID); 608 oleBibRecord.setBibAssociatedFieldsValueMap((Map<String, ?>) bibInfo.get(0)); 609 HashMap instanceIdentifierHashMap = (HashMap) bibInfo.get(0); 610 ArrayList instanceIdentifierList = (ArrayList) instanceIdentifierHashMap.get(OLEConstants.BIB_INSTANCE_ID); 611 String instanceId = (String) instanceIdentifierList.get(0); 612 oleBibRecord.setLinkedInstanceId(instanceId); 613 oleBibRecord.setBibUUID(getUUID(responseRecordForDocstore, OLEConstants.BIB_DOC_TYPE)); 614 oleEditorResponse.setOleBibRecord(oleBibRecord); 615 oleEditorResponse.setTokenId(tokenId); 616 OleEditorResponseHandler oleEditorResponseHandler = new OleEditorResponseHandler(); 617 String editorResponseXMLForOLE = oleEditorResponseHandler.toXML(oleEditorResponse); 618 OleExposedWebServiceImpl oleExposedWebService = (OleExposedWebServiceImpl) SpringContext.getBean("oleExposedWebService"); 619 oleExposedWebService.addDoctoreResponse(editorResponseXMLForOLE); 620 } 621 622 623 /** 624 * Gets the isSuccessfull attribute 625 * 626 * @param docStoreResponse 627 * @return Returns isSuccessfull 628 */ 629 private boolean isSuccessfull(Response docStoreResponse) { 630 return docStoreResponse.getStatus().equalsIgnoreCase(OLEConstants.OLE_DOCSTORE_RESPONSE_STATUS); 631 } 632 633 634 /** 635 * This method returns True if tokenId is not null,else return False. 636 * 637 * @return boolean 638 */ 639 public boolean responseToOLESentRequired() { 640 return null != tokenId; 641 } 642 643 /** 644 * This method invokes another method to get uuid based on response and docType. 645 * 646 * @param response 647 * @param docType 648 * @return uuid 649 */ 650 private String getUUID(Response response, String docType) { 651 List<ResponseDocument> documents = response.getDocuments(); 652 return getUUID(documents, docType); 653 } 654 655 /** 656 * This method gets the uuid based on the List of responseDocument and docType 657 * 658 * @param documents 659 * @param docType 660 * @return uuid 661 */ 662 private String getUUID(List<ResponseDocument> documents, String docType) { 663 for (Iterator<ResponseDocument> iterator = documents.iterator(); iterator.hasNext(); ) { 664 ResponseDocument responseDocument = iterator.next(); 665 if (responseDocument.getType().equals(docType)) { 666 return responseDocument.getUuid(); 667 } else { 668 return getUUID(responseDocument.getLinkedDocuments(), docType); 669 } 670 } 671 return null; 672 } 673 674 675 /** 676 * Gets the webservice URL using PropertyUtil. 677 * 678 * @return String 679 */ 680 public String getURL() { 681 String url = ConfigContext.getCurrentContextConfig().getProperty("oleExposedWebService.url"); 682 return url; 683 } 684 685 /** 686 * This method returns a response record based on the responseFromDocstore. 687 * 688 * @param responseFromDocstore 689 * @return Response 690 */ 691 private Response getResponseRecordForDocstore(String responseFromDocstore) { 692 return new ResponseHandler().toObject(responseFromDocstore); 693 } 694 695 696 private void updateTreeData(EditorForm editorForm) { 697 int indexOfDocument = 0; 698 /* List<WorkBibDocument> workBibDocumentList = editorForm.getWorkBibDocumentList(); 699 int i = 0; 700 for (WorkBibDocument bibDocument : workBibDocumentList) { 701 if (editorForm.getDocId().equals(bibDocument.getId())) { 702 indexOfDocument = i; 703 break; 704 } 705 i++; 706 } 707 DocstoreHelperService docstoreHelperService = new DocstoreHelperService(); 708 WorkBibDocument workBibDocument = new WorkBibDocument(); 709 workBibDocument.setId(editorForm.getDocId()); 710 workBibDocument = docstoreHelperService.getInfoForBibTree(workBibDocument); 711 workBibDocumentList.set(indexOfDocument, workBibDocument); 712 editorForm.setWorkBibDocumentList(workBibDocumentList);*/ 713 714 List<Bib> bibList = editorForm.getBibList(); 715 int i = 0; 716 for (Bib bib : bibList) { 717 if (editorForm.getDocId().equals(bib.getId())) { 718 indexOfDocument = i; 719 break; 720 } 721 i++; 722 } 723 Bib bib = null; 724 try { 725 bib = docstoreClient.retrieveBib(editorForm.getDocId()); 726 } catch (Exception e) { 727 LOG.error("Exception :", e); 728 DocstoreException docstoreException = (DocstoreException) e; 729 if (org.apache.commons.lang3.StringUtils.isNotEmpty(docstoreException.getErrorCode())) { 730 GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, docstoreException.getErrorCode()); 731 } else { 732 GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, e.getMessage()); 733 }; 734 } 735 bibList.set(indexOfDocument, bib); 736 editorForm.setBibList(bibList); 737 } 738 739 /** 740 * This method will Validate the MarcEditorForm and return either True or False 741 * Validation happen based on existence of leader,Tags and values for controlFields and dataFields . 742 * 743 * @param workBibMarcForm 744 * @return valid 745 */ 746 public boolean validateMarcEditorData(WorkBibMarcForm workBibMarcForm) { 747 boolean valid; 748 WorkBibMarcRecordValidator wbmRecordValidator = new WorkBibMarcRecordValidator(); 749 WorkBibMarcRecord workBibMarcRecord = ConvertMarcFormToMarcRecord(workBibMarcForm); 750 List<DocStoreValidationError> docStoreValidationErrors = wbmRecordValidator.validate(workBibMarcRecord); 751 if (docStoreValidationErrors.size() > 0) { 752 for (DocStoreValidationError docStoreValidationError : docStoreValidationErrors) { 753 List<String> errorParams = docStoreValidationError.getErrorParams(); 754 String param1 = ""; 755 String param2 = ""; 756 if (errorParams != null) { 757 if (errorParams.size() == 1) { 758 param1 = errorParams.get(0); 759 } 760 if (errorParams.size() == 2) { 761 param1 = errorParams.get(0); 762 param2 = errorParams.get(1); 763 } 764 } 765 GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, 766 docStoreValidationError.getErrorId(), param1, param2); 767 } 768 valid = false; 769 } else { 770 valid = true; 771 } 772 773 return valid; 774 } 775 776 private WorkBibMarcRecord ConvertMarcFormToMarcRecord(WorkBibMarcForm workBibMarcForm) { 777 WorkBibMarcRecord workBibMarcRecord = new WorkBibMarcRecord(); 778 List<ControlField> controlFields = new ArrayList<>(); 779 List<DataField> dataFields = new ArrayList<DataField>(); 780 for (MarcEditorControlField MEControlFiled : workBibMarcForm.getControlFields()) { 781 ControlField controlField = new ControlField(); 782 controlField.setTag(MEControlFiled.getTag()); 783 controlField.setValue(MEControlFiled.getValue()); 784 controlFields.add(controlField); 785 } 786 for (MarcEditorDataField MEDataField : workBibMarcForm.getDataFields()) { 787 buildDataField(MEDataField, dataFields); 788 } 789 workBibMarcRecord.setLeader(workBibMarcForm.getLeader()); 790 workBibMarcRecord.setControlFields(controlFields); 791 workBibMarcRecord.setDataFields(dataFields); 792 return workBibMarcRecord; 793 } 794 795 private void buildDataField(MarcEditorDataField meDataField, List<DataField> dataFields) { 796 DataField dataField = new DataField(); 797 dataField.setTag(meDataField.getTag()); 798 799 if (meDataField.getValue().length() > 1 && !meDataField.getValue().startsWith("|") && !meDataField.getValue().contains("|a")) { 800 meDataField.setValue("|a " + meDataField.getValue()); 801 } 802 803 804 if (meDataField.getValue().startsWith("|") && meDataField.getValue().length() > 1) { 805 String[] values = meDataField.getValue().split("\\|"); 806 for (int i = 1; i < values.length; i++) { 807 SubField subField = new SubField(); 808 subField.setCode(values[i].substring(0, 1)); 809 subField.setValue(values[i].substring(1, values[i].length())); 810 dataField.addSubField(subField); 811 } 812 } else { 813 SubField subField = new SubField(); 814 subField.setValue(meDataField.getValue()); 815 subField.setCode(""); 816 dataField.addSubField(subField); 817 } 818 819 if (meDataField.getInd1() != null && !meDataField.getInd1().isEmpty()) { 820 dataField.setInd1(meDataField.getInd1()); 821 } else { 822 dataField.setInd1(" "); 823 } 824 825 if (meDataField.getInd2() != null && !meDataField.getInd2().isEmpty()) { 826 dataField.setInd2(meDataField.getInd2()); 827 } else { 828 dataField.setInd2(" "); 829 } 830 dataFields.add(dataField); 831 } 832 833 private void buildDataFieldList(WorkBibMarcForm workBibMarcForm) { 834 List<MarcEditorDataField> dataFieldList = workBibMarcForm.getDataFields(); 835 List<MarcEditorDataField> dataFieldList1 = new ArrayList<>(); 836 int count = 0; 837 if (dataFieldList.size() > 1) { 838 for (MarcEditorDataField dataField : dataFieldList) { 839 840 if (dataField.getInd1().equals("") || dataField.getInd1().equals("#") || dataField.getInd1() == null) { 841 dataField.setInd1(" "); 842 } 843 844 if (dataField.getInd2().equals("") || dataField.getInd2().equals("#") || dataField.getInd2() == null) { 845 dataField.setInd2(" "); 846 } 847 848 if (dataField.getTag().equals("") && dataField.getValue().equals("") && (dataField.getInd1().equals("") || dataField.getInd1().equals(" ") || dataField.getInd1().equals("#") || dataField.getInd1() == null) && (dataField.getInd2().equals("") || dataField.getInd2().equals(" ") || dataField.getInd2().equals("#") || dataField.getInd2() == null)) { 849 count++; 850 } 851 if (!dataField.getTag().equals("") || !dataField.getValue().equals("") || !(dataField.getInd1().equals("") || dataField.getInd1().equals(" ") || dataField.getInd1().equals("#") || dataField.getInd1() == null) || !(dataField.getInd2().equals("") || dataField.getInd2().equals(" ") || dataField.getInd2().equals("#") || dataField.getInd2() == null)) { 852 853 dataFieldList1.add(dataField); 854 } 855 if (count == dataFieldList.size()) { 856 if (dataField.getTag().equals("") && dataField.getValue().equals("") && (dataField.getInd1().equals("") || dataField.getInd1().equals(" ") || dataField.getInd1().equals("#") || dataField.getInd1() == null) && (dataField.getInd2().equals("") || dataField.getInd2().equals(" ") || dataField.getInd2().equals("#") || dataField.getInd2() == null)) { 857 858 dataFieldList1.add(dataFieldList.get(0)); 859 860 } 861 } 862 863 864 } 865 workBibMarcForm.setDataFields(dataFieldList1); 866 } else { 867 workBibMarcForm.setDataFields(dataFieldList); 868 } 869 870 } 871 872 873 private void buildLeader(WorkBibMarcForm workBibMarcForm) { 874 workBibMarcForm.setLeader(workBibMarcForm.getLeader().replace("#", " ")); 875 } 876 877 @Override 878 public EditorForm deleteDocument(EditorForm editorForm) { 879 return new WorkBibMarcForm(); 880 } 881 882 @Override 883 public String saveDocument(BibTree bibTree, EditorForm form) { 884 String str = " success"; 885 try { 886 docstoreClient.updateBib(bibTree.getBib()); 887 } catch (DocstoreException e) { 888 LOG.error("Exception :", e); 889 DocstoreException docstoreException = (DocstoreException) e; 890 if (org.apache.commons.lang3.StringUtils.isNotEmpty(docstoreException.getErrorCode())) { 891 GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, docstoreException.getErrorCode()); 892 } else { 893 GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, e.getMessage()); 894 } 895 } catch (Exception e) { 896 LOG.error("Exception ", e); 897 GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS,"docstore.response", e.getMessage() ); 898 } 899 return str; 900 } 901 902 @Override 903 public EditorForm createNewRecord(EditorForm editorForm, BibTree bibTree) { 904// editorForm.setHeaderText("Import Bib Step-4 Bibliographic Editor - MARC Format"); 905 editorForm.setHeaderText("Import Bib Step-4 Bibliographic Editor"); 906 WorkBibMarcForm workBibMarcForm = new WorkBibMarcForm(); 907 908 Bib bib = bibTree.getBib(); 909 if(StringUtils.isEmpty(bib.getCreatedBy())) { 910 bib.setCreatedBy(GlobalVariables.getUserSession().getPrincipalName()); 911 } 912 if (bib.getContent() != null) { 913 914 BibMarcRecords bibMarcRecords = bibMarcRecordProcessor.fromXML(bib.getContent()); 915 916 List<BibMarcRecord> bibMarcRecordsRecords = bibMarcRecords.getRecords(); 917 for (BibMarcRecord bibMarcRecord : bibMarcRecordsRecords) { 918 workBibMarcForm.setLeader(bibMarcRecord.getLeader()); 919 workBibMarcForm.setControlFields(getMarcFormDataHandler().buildMarcEditorControlFields(workBibMarcForm, 920 bibMarcRecord.getControlFields())); 921 editorForm.setTitle(getMarcFormDataHandler().buildMarcEditorTitleField(bibMarcRecord.getDataFields())); 922 workBibMarcForm.setDataFields( 923 getMarcFormDataHandler().buildMarcEditorDataFields(bibMarcRecord.getDataFields())); 924 OleBibliographicRecordStatus bibliographicRecordStatus = null; 925 BusinessObjectService boService = KRADServiceLocator.getBusinessObjectService(); 926 String bibStatusName = bib.getStatus(); 927 928 editorForm.setBibStatus(bibStatusName); 929 Map parentCriteria = new HashMap(); 930 parentCriteria.put("bibliographicRecordStatusName", bibStatusName); 931 bibliographicRecordStatus = boService 932 .findByPrimaryKey(OleBibliographicRecordStatus.class, parentCriteria); 933 if (bibliographicRecordStatus != null) { 934 editorForm.setOleBibliographicRecordStatus(bibliographicRecordStatus); 935 } 936 editorForm.setMessage("Please edit details for the Bib record."); 937 GlobalVariables.getMessageMap().putInfo(KRADConstants.GLOBAL_ERRORS, "info.edit.details.bib.record"); 938 } 939 } 940 941 // Add a node for this document to the left pane tree. 942 addDocumentToTree(editorForm); 943 editorForm.setNeedToCreateInstance(true); 944 945 workBibMarcForm.setViewId("WorkBibEditorViewPage"); 946 setControlFields(workBibMarcForm); 947 return workBibMarcForm; 948 } 949 950 951 public void setControlFields(WorkBibMarcForm workBibMarcForm) { 952 List<ControlField006Text> controlField006Texts = workBibMarcForm.getMarcControlFields().getControlFields006List(); 953 List<ControlField006Text> controlField006EditText = new ArrayList<>(); 954 for (ControlField006Text controlField006Text : controlField006Texts) { 955 if (controlField006Text.getRawText() != null) { 956 controlField006Text.setRawText(controlField006Text.getRawText().replaceAll(" ", "#")); 957 controlField006EditText.add(controlField006Text); 958 } 959 } 960 if (controlField006EditText.size() > 0) { 961 workBibMarcForm.getMarcControlFields().setControlFields006List(controlField006EditText); 962 } 963 List<ControlField007Text> controlField007Texts = workBibMarcForm.getMarcControlFields().getControlFields007List 964 (); 965 List<ControlField007Text> controlField007EditText = new ArrayList<>(); 966 for (ControlField007Text controlField007Text : controlField007Texts) { 967 if (controlField007Text.getRawText() != null) { 968 controlField007Text.setRawText(controlField007Text.getRawText().replaceAll(" ", "#")); 969 controlField007EditText.add(controlField007Text); 970 } 971 } 972 if (controlField007EditText.size() > 0) { 973 workBibMarcForm.getMarcControlFields().setControlFields007List(controlField007EditText); 974 } 975 ControlField008 controlField008 = workBibMarcForm.getMarcControlFields().getControlField008(); 976 if (controlField008 != null) { 977 controlField008.setRawText(controlField008.getRawText().replaceAll(" ", "#")); 978 workBibMarcForm.getMarcControlFields().setControlField008(controlField008); 979 } 980 if (workBibMarcForm.getLeader() != null) { 981 workBibMarcForm.setLeader(workBibMarcForm.getLeader().replaceAll(" ", "#")); 982 } 983 } 984 985 @Override 986 public EditorForm editNewRecord(EditorForm editorForm, BibTree bibTree) { 987 WorkBibMarcForm workBibMarcForm = (WorkBibMarcForm) editorForm.getDocumentForm(); 988 if (!validateMarcEditorData(workBibMarcForm)) { 989 workBibMarcForm.setValidInput(false); 990 return workBibMarcForm; 991 } 992 String bibliographicRecordStatusCode = editorForm.getOleBibliographicRecordStatus() 993 .getBibliographicRecordStatusCode(); 994 String content = getMarcFormDataHandler().buildBibRecordForDocStore(workBibMarcForm); 995 bibTree.getBib().setContent(content); 996 editorForm.setCreatedBy(bibTree.getBib().getCreatedBy()); 997 editorForm.setCreatedDate(bibTree.getBib().getCreatedOn()); 998 OleBibliographicRecordStatus bibliographicRecordStatus = null; 999 BusinessObjectService boService = KRADServiceLocator.getBusinessObjectService(); 1000 if (bibliographicRecordStatusCode != null) { 1001 Map parentCriteria = new HashMap(); 1002 parentCriteria.put("bibliographicRecordStatusCode", bibliographicRecordStatusCode); 1003 bibliographicRecordStatus = boService 1004 .findByPrimaryKey(OleBibliographicRecordStatus.class, parentCriteria); 1005 } 1006 1007 if (bibliographicRecordStatus != null) { 1008 bibTree.getBib().setStatus(bibliographicRecordStatus.getBibliographicRecordStatusName()); 1009 editorForm.setOleBibliographicRecordStatus(bibliographicRecordStatus); 1010 1011 } else { 1012 bibTree.getBib().setStatus(""); 1013 } 1014 bibTree.getBib().setStaffOnly(editorForm.isStaffOnlyFlagForBib()); 1015 1016 return editorForm; 1017 } 1018 1019 private void addDocumentToTree(EditorForm editorForm) { 1020 // TODO: Make sure the same document is not added more than once. 1021 1022 List<BibTree> bibTreeList = editorForm.getBibTreeList(); 1023 List<Bib> bibList = new ArrayList<>(); 1024 int indexOfDocument = 0; 1025 int i = 0; 1026 String title = "New Bib1"; 1027 boolean updateTitle = false; 1028 if (null == bibTreeList) { 1029 bibTreeList = new ArrayList<BibTree>(); 1030 } 1031 BibTree tempBibTree = new BibTree(); 1032 if (null == editorForm.getDocId()) { 1033 LOG.info("bibTreeList size before remove-->" + bibTreeList.size()); 1034 for (BibTree bibTree : bibTreeList) { 1035 if (bibTree.getBib().getTitle().equalsIgnoreCase("New Bib1")) { 1036 tempBibTree = bibTree; 1037 // workBibDocumentList.remove(workBibDocument); 1038 } 1039 } 1040 bibTreeList.remove(tempBibTree); 1041 LOG.info("workBibDocumentList size after remove-->" + bibTreeList.size()); 1042 1043 BibTree bibTree = new BibTree(); 1044 Bib bib = new Bib(); 1045 bib.setTitle(title); 1046 bibTree.setBib(bib); 1047 /*bibTree.getBib().setTitle(title);*/ 1048 bibTreeList.add(bibTree); 1049 } else { 1050 boolean isUpdated = false; 1051 for (BibTree bibTree : bibTreeList) { 1052 if (bibTree.getBib() != null) { 1053 if (bibTree.getBib().getId() != null && bibTree.getBib().getId().equals(editorForm.getDocId())) { 1054 isUpdated = true; 1055 break; 1056 } else if (bibTree.getBib().getTitle().equals(title)) { 1057 indexOfDocument = i; 1058 updateTitle = true; 1059 break; 1060 } 1061 } 1062 i++; 1063 } 1064 if (!isUpdated) { 1065 Bib bib = null; 1066 try { 1067 bib = docstoreClient.retrieveBib(editorForm.getDocId()); 1068 } catch (Exception e) { 1069 LOG.error("Exception :", e); 1070 DocstoreException docstoreException = (DocstoreException) e; 1071 if (org.apache.commons.lang3.StringUtils.isNotEmpty(docstoreException.getErrorCode())) { 1072 GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, docstoreException.getErrorCode()); 1073 } else { 1074 GlobalVariables.getMessageMap().putError(KRADConstants.GLOBAL_ERRORS, e.getMessage()); 1075 } 1076 } 1077 if (updateTitle && bibList.size() > 0) { 1078 bibList.set(indexOfDocument, bib); 1079 } else { 1080 bibList.add(bib); 1081 } 1082 1083 } 1084 1085 } 1086 editorForm.setBibTreeList(bibTreeList); 1087 } 1088 1089 @Override 1090 public EditorForm addORDeleteFields(EditorForm editorForm, HttpServletRequest request) { 1091 1092 String methodName = request.getParameter("methodToCall"); 1093 if (methodName.equalsIgnoreCase("addControlField006")) { 1094 WorkBibMarcForm marcEditorForm = (WorkBibMarcForm) editorForm.getDocumentForm(); 1095 int index = Integer.parseInt(editorForm.getActionParamaterValue(UifParameters.SELECTED_LINE_INDEX)); 1096 index++; 1097 List<ControlField006Text> marcEditorControlFieldList = marcEditorForm.getMarcControlFields().getControlFields006List(); 1098 marcEditorControlFieldList.add(index, new ControlField006Text()); 1099 marcEditorForm.getMarcControlFields().setControlFields006List(marcEditorControlFieldList); 1100 editorForm.setDocumentForm(marcEditorForm); 1101 } else if (methodName.equalsIgnoreCase("removeControlField006")) { 1102 WorkBibMarcForm marcEditorForm = (WorkBibMarcForm) editorForm.getDocumentForm(); 1103 int index = Integer.parseInt(editorForm.getActionParamaterValue(UifParameters.SELECTED_LINE_INDEX)); 1104 List<ControlField006Text> marcEditorControlFieldList = marcEditorForm.getMarcControlFields().getControlFields006List(); 1105 if (marcEditorControlFieldList.size() > 1) { 1106 marcEditorControlFieldList.remove(index); 1107 } 1108 editorForm.setDocumentForm(marcEditorForm); 1109 } else if (methodName.equalsIgnoreCase("addControlField007")) { 1110 WorkBibMarcForm marcEditorForm = (WorkBibMarcForm) editorForm.getDocumentForm(); 1111 int index = Integer.parseInt(editorForm.getActionParamaterValue(UifParameters.SELECTED_LINE_INDEX)); 1112 index++; 1113 List<ControlField007Text> marcEditorControlFieldList = marcEditorForm.getMarcControlFields().getControlFields007List(); 1114 marcEditorControlFieldList.add(index, new ControlField007Text()); 1115 marcEditorForm.getMarcControlFields().setControlFields007List(marcEditorControlFieldList); 1116 editorForm.setDocumentForm(marcEditorForm); 1117 } else if (methodName.equalsIgnoreCase("removeControlField007")) { 1118 WorkBibMarcForm marcEditorForm = (WorkBibMarcForm) editorForm.getDocumentForm(); 1119 int index = Integer.parseInt(editorForm.getActionParamaterValue(UifParameters.SELECTED_LINE_INDEX)); 1120 List<ControlField007Text> marcEditorControlFieldList = marcEditorForm.getMarcControlFields().getControlFields007List(); 1121 if (marcEditorControlFieldList.size() > 1) { 1122 marcEditorControlFieldList.remove(index); 1123 } 1124 editorForm.setDocumentForm(marcEditorForm); 1125 } else if (methodName.equalsIgnoreCase("addDataField")) { 1126 WorkBibMarcForm marcEditorForm = (WorkBibMarcForm) editorForm.getDocumentForm(); 1127 int index = Integer.parseInt(editorForm.getActionParamaterValue(UifParameters.SELECTED_LINE_INDEX)); 1128 index++; 1129 List<MarcEditorDataField> editorDataFieldList = marcEditorForm.getDataFields(); 1130 for (MarcEditorDataField editorDataField : editorDataFieldList) { 1131 String modifiedValue = editorDataField.getValue().replace("\"", """); 1132 editorDataField.setValue(modifiedValue); 1133 } 1134 editorDataFieldList.add(index, new MarcEditorDataField()); 1135 marcEditorForm.setDataFields(editorDataFieldList); 1136 editorForm.setDocumentForm(marcEditorForm); 1137 } else if (methodName.equalsIgnoreCase("removeDataField")) { 1138 WorkBibMarcForm marcEditorForm = (WorkBibMarcForm) editorForm.getDocumentForm(); 1139 int index = Integer.parseInt(editorForm.getActionParamaterValue(UifParameters.SELECTED_LINE_INDEX)); 1140 List<MarcEditorDataField> marcEditorDataFieldList = marcEditorForm.getDataFields(); 1141 if (marcEditorDataFieldList.size() > 1) { 1142 marcEditorDataFieldList.remove(index); 1143 } 1144 for (MarcEditorDataField marcDataField : marcEditorDataFieldList) { 1145 String modifiedValue = marcDataField.getValue().replace("\"", """); 1146 marcDataField.setValue(modifiedValue); 1147 } 1148 marcEditorForm.setDataFields(marcEditorDataFieldList); 1149 editorForm.setDocumentForm(marcEditorForm); 1150 } 1151 return editorForm; 1152 } 1153 1154 /** 1155 * Gets the MarcEditorFormDataHandler attribute. 1156 * 1157 * @return MarcEditorFormDataHandler 1158 */ 1159 private MarcEditorFormDataHandler getMarcFormDataHandler() { 1160 if (null == marcEditorFormDataHandler) { 1161 marcEditorFormDataHandler = new MarcEditorFormDataHandler(); 1162 } 1163 return marcEditorFormDataHandler; 1164 } 1165 1166 1167 @Override 1168 public EditorForm deleteVerify(EditorForm editorForm) throws Exception { 1169 WorkBibMarcForm workBibMarcForm = new WorkBibMarcForm(); 1170 String docId = editorForm.getDocId(); 1171 editorForm.setShowDeleteTree(true); 1172 List<String> uuidList = new ArrayList<>(0); 1173 uuidList.add(editorForm.getDocId()); 1174 DocumentSelectionTree documentSelectionTree = new DocumentSelectionTree(); 1175 Node<DocumentTreeNode, String> docTree = documentSelectionTree.add(uuidList, DocType.BIB.getDescription()); 1176 editorForm.getDocTree().setRootElement(docTree); 1177 workBibMarcForm.setViewId("DeleteViewPage"); 1178 return workBibMarcForm; 1179 } 1180 1181 1182 private Node<DocumentTreeNode, String> buildDocSelectionTree(String responseXml) throws SolrServerException { 1183 Response response = new ResponseHandler().toObject(responseXml); 1184 List<ResponseDocument> responseDocumentList = response.getDocuments(); 1185 List<WorkItemDocument> workItemDocumentList = new ArrayList<WorkItemDocument>(); 1186 List<WorkBibDocument> bibDocumentList = new ArrayList<WorkBibDocument>(); 1187 List<WorkInstanceDocument> instanceDocumentList = new ArrayList<WorkInstanceDocument>(); 1188 WorkHoldingsDocument workHoldingsDocument = null; 1189 WorkInstanceDocument workInstanceDocument = null; 1190 WorkBibDocument workBibDocument = null; 1191 WorkItemDocument workItemDocument = null; 1192 List<String> uuidList = new ArrayList<String>(); 1193 String docType = null; 1194 for (ResponseDocument responseDocument : responseDocumentList) { 1195 1196 if (responseDocument.getType().equalsIgnoreCase(DocType.ITEM.getCode())) { 1197 workItemDocument = new WorkItemDocument(); 1198 workItemDocument.setItemIdentifier(responseDocument.getUuid()); 1199 uuidList.add(responseDocument.getUuid()); 1200 docType = responseDocument.getType(); 1201 workItemDocumentList.add(workItemDocument); 1202 } else if (responseDocument.getType().equalsIgnoreCase(DocType.HOLDINGS.getCode())) { 1203 workHoldingsDocument = new WorkHoldingsDocument(); 1204 docType = responseDocument.getType(); 1205 workHoldingsDocument.setHoldingsIdentifier(responseDocument.getUuid()); 1206 uuidList.add(responseDocument.getUuid()); 1207 } else if (responseDocument.getType().equalsIgnoreCase(DocType.BIB.getDescription())) { 1208 workBibDocument = new WorkBibDocument(); 1209 uuidList.add(responseDocument.getUuid()); 1210 workBibDocument.setId(responseDocument.getUuid()); 1211 docType = responseDocument.getType(); 1212 bibDocumentList.add(workBibDocument); 1213 } else if (responseDocument.getType().equalsIgnoreCase(DocType.INSTANCE.getCode())) { 1214 workInstanceDocument = new WorkInstanceDocument(); 1215 workInstanceDocument.setInstanceIdentifier(responseDocument.getUuid()); 1216 uuidList.add(responseDocument.getUuid()); 1217 docType = responseDocument.getType(); 1218 instanceDocumentList.add(workInstanceDocument); 1219 } 1220 } 1221 if (workItemDocumentList.size() > 0) { 1222 if (workInstanceDocument != null) { 1223 workInstanceDocument.setHoldingsDocument(workHoldingsDocument); 1224 workInstanceDocument.setItemDocumentList(workItemDocumentList); 1225 } 1226 } 1227 if (instanceDocumentList.size() > 0) { 1228 if (workBibDocument != null) { 1229 workBibDocument.setWorkInstanceDocumentList(instanceDocumentList); 1230 } 1231 } 1232 DocumentSelectionTree documentSelectionTree = new DocumentSelectionTree(); 1233 Node<DocumentTreeNode, String> rootNode = documentSelectionTree.add(uuidList, docType); 1234 return rootNode; 1235 } 1236 1237 /** 1238 * This method deletes the bib record from docstore by the doc id. 1239 * @param editorForm 1240 * @return 1241 * @throws Exception 1242 */ 1243 @Override 1244 public EditorForm delete(EditorForm editorForm) throws Exception { 1245 return deleteFromDocStore(editorForm); 1246 } 1247 1248 @Override 1249 public EditorForm addORRemoveExtentOfOwnership(EditorForm editorForm, HttpServletRequest request) { 1250 return null; //To change body of implemented methods use File | Settings | File Templates. 1251 } 1252 1253 @Override 1254 public EditorForm addORRemoveAccessInformationAndHoldingsNotes(EditorForm editorForm, HttpServletRequest request) { 1255 return null; //To change body of implemented methods use File | Settings | File Templates. 1256 } 1257 1258 @Override 1259 public EditorForm addORRemoveItemNote(EditorForm editorForm, HttpServletRequest request) { 1260 return null; //To change body of implemented methods use File | Settings | File Templates. 1261 } 1262 1263 /** 1264 * Set tag and value for Control field 1265 * 1266 * @param tag 1267 * @param value 1268 * @return 1269 */ 1270 private MarcEditorControlField getMarcEditorControlField(String tag, String value) { 1271 MarcEditorControlField marcEditorControlField = new MarcEditorControlField(); 1272 marcEditorControlField.setTag(tag); 1273 marcEditorControlField.setValue(value); 1274 return marcEditorControlField; 1275 } 1276 1277 /** 1278 * Build controlField list with tag and value pairs. 1279 * 1280 * @param workBibMarcForm 1281 */ 1282 private void buildControlFieldList(WorkBibMarcForm workBibMarcForm) { 1283 ControlFields controlFields = workBibMarcForm.getMarcControlFields(); 1284 1285 Date dt = new Date(); 1286 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss.S"); 1287 controlFields.setControlField005(sdf.format(dt).substring(0, 16)); 1288 1289 List<MarcEditorControlField> marcEditorControlFields = new ArrayList<MarcEditorControlField>(); 1290 if (StringUtils.isNotEmpty(controlFields.getControlField001())) { 1291 marcEditorControlFields.add(getMarcEditorControlField(ControlFields.CONTROL_FIELD_001, 1292 controlFields.getControlField001())); 1293 } 1294 if (StringUtils.isNotEmpty(controlFields.getControlField003())) { 1295 marcEditorControlFields.add(getMarcEditorControlField(ControlFields.CONTROL_FIELD_003, 1296 controlFields.getControlField003())); 1297 } 1298 if (StringUtils.isNotEmpty(controlFields.getControlField005())) { 1299 marcEditorControlFields.add(getMarcEditorControlField(ControlFields.CONTROL_FIELD_005, 1300 controlFields.getControlField005())); 1301 } 1302 if (controlFields.getControlFields006List().size() > 0) { 1303 for (ControlField006Text controlField006Text : controlFields.getControlFields006List()) { 1304 if (controlField006Text.getRawText() != null && StringUtils.isNotEmpty(controlField006Text.getRawText())) 1305 marcEditorControlFields.add(getMarcEditorControlField(ControlFields.CONTROL_FIELD_006, 1306 controlField006Text.getRawText().replace("#", " "))); 1307 } 1308 } 1309 if (controlFields.getControlFields007List().size() > 0) { 1310 for (ControlField007Text controlField007Text : controlFields.getControlFields007List()) { 1311 if (controlField007Text.getRawText() != null && StringUtils.isNotEmpty(controlField007Text.getRawText())) 1312 marcEditorControlFields.add(getMarcEditorControlField(ControlFields.CONTROL_FIELD_007, 1313 controlField007Text.getRawText().replace("#", " "))); 1314 } 1315 } 1316 if (StringUtils.isNotEmpty(controlFields.getControlField008().getRawText())) { 1317 sdf = new SimpleDateFormat("yyMMdd"); 1318 if (controlFields.getControlField008().getRawText().length() == 40 && controlFields.getControlField008().getRawText().substring(0, 6).contains("#")) { 1319 controlFields.getControlField008().setRawText(sdf.format(dt) + controlFields.getControlField008().getRawText 1320 ().substring(6, 40)); 1321 } 1322 1323 marcEditorControlFields.add(getMarcEditorControlField(ControlFields.CONTROL_FIELD_008, 1324 controlFields.getControlField008().getRawText().replace("#", " "))); 1325 } 1326 workBibMarcForm.setControlFields(marcEditorControlFields); 1327 } 1328 1329 @Override 1330 public EditorForm showBibs(EditorForm editorForm) { 1331 return null; 1332 } 1333 1334 public EditorForm copy(EditorForm editorForm) { 1335 return null; 1336 } 1337 1338 @Override 1339 public Boolean isValidUpdate(EditorForm editorForm) { 1340 String docId = editorForm.getDocId(); 1341 Boolean isValidUpdate = true; 1342 if (StringUtils.isNotEmpty(docId)) { 1343 try { 1344 if (editorForm.getDocType().equalsIgnoreCase("bibliographic")) { 1345 Bib bib = docstoreClient.retrieveBib(editorForm.getDocId()); 1346 if (bib.getUpdatedOn() != null) { 1347 if (editorForm.getUpdatedDate() == null) { 1348 isValidUpdate = false; 1349 } 1350 } 1351 if (!editorForm.getUpdatedDate().equals(bib.getUpdatedOn())) { 1352 isValidUpdate = false; 1353 } 1354 } 1355 if (editorForm.getDocType().equalsIgnoreCase("holdings")) { 1356 Holdings holdings = docstoreClient.retrieveHoldings(editorForm.getDocId()); 1357 if (editorForm.getUpdatedDate().equals(holdings.getUpdatedOn())) { 1358 isValidUpdate = false; 1359 } 1360 1361 } 1362 if (editorForm.getDocType().equalsIgnoreCase("item")) { 1363 Item item = docstoreClient.retrieveItem(editorForm.getDocId()); 1364 if (editorForm.getUpdatedDate().equals(item.getUpdatedOn())) { 1365 isValidUpdate = false; 1366 } 1367 1368 } 1369 } catch (Exception e) { 1370 LOG.error("New Record....." + docId); 1371 } 1372 } 1373 return isValidUpdate; 1374 } 1375 1376 1377}