1 package org.kuali.ole.ingest;
2
3 import org.kuali.ole.*;
4 import org.kuali.ole.ingest.pojo.*;
5 import org.kuali.ole.describe.service.DocstoreHelperService;
6 import org.kuali.ole.ingest.pojo.IngestRecord;
7 import org.kuali.ole.ingest.pojo.MatchBo;
8 import org.kuali.ole.ingest.pojo.ProfileAttributeBo;
9 import org.kuali.ole.ingest.pojo.ProfileTerm;
10 import org.kuali.ole.pojo.OleBibRecord;
11 import org.kuali.ole.pojo.OleOrderRecord;
12 import org.kuali.ole.pojo.OleTxRecord;
13 import org.kuali.ole.pojo.bib.BibliographicRecord;
14 import org.kuali.ole.pojo.bib.Collection;
15 import org.kuali.ole.pojo.edi.*;
16 import org.kuali.rice.core.api.resourceloader.GlobalResourceLoader;
17 import org.kuali.rice.coreservice.api.CoreServiceApiServiceLocator;
18 import org.kuali.rice.coreservice.api.parameter.Parameter;
19 import org.kuali.rice.coreservice.api.parameter.ParameterKey;
20 import org.kuali.rice.krad.service.BusinessObjectService;
21 import org.kuali.rice.krad.service.KRADServiceLocator;
22 import org.kuali.rice.krms.api.KrmsApiServiceLocator;
23 import org.kuali.rice.krms.api.engine.*;
24 import org.kuali.rice.krms.framework.engine.EngineResultsImpl;
25 import org.kuali.rice.krms.impl.repository.AgendaBo;
26 import org.xml.sax.SAXException;
27
28 import javax.xml.parsers.ParserConfigurationException;
29 import javax.xml.xpath.XPathExpressionException;
30 import java.io.IOException;
31 import java.net.URISyntaxException;
32 import java.util.*;
33
34
35
36
37 public abstract class AbstractIngestProcessor {
38 private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(AbstractIngestProcessor.class);
39 private static final String NAMESPACE_CODE_SELECTOR = "namespaceCode";
40 private static final String NAME_SELECTOR = "name";
41 private BusinessObjectService businessObjectService;
42 private List<EngineResults> engineResults = new ArrayList<EngineResults>();
43 private String user;
44 String marcXMLContent;
45 String ediXMLContent;
46 private IngestRecord ingestRecord;
47 private DocstoreHelperService docstoreHelperService;
48
49 public String getUser() {
50 return user;
51 }
52
53 public void setUser(String user) {
54 this.user = user;
55 }
56
57
58
59
60
61
62 public List<EngineResults> getEngineResults() {
63 return engineResults;
64 }
65
66 public DocstoreHelperService getDocstoreHelperService() {
67 if(docstoreHelperService==null)
68 docstoreHelperService=new DocstoreHelperService();
69 return docstoreHelperService;
70 }
71
72
73
74
75
76
77 public int start(IngestRecord ingestRecord , boolean failure_flag) {
78 this.ingestRecord = ingestRecord;
79 this.setUser(ingestRecord.getUser());
80 byPassLogicForPreProcess(ingestRecord.getMarcFileContent(), ingestRecord.getEdiFileContent(), ingestRecord.getByPassPreProcessing());
81 try {
82 failure_flag=process();
83 ingestRecord.setUpdate(this.ingestRecord.isUpdate());
84 } catch (URISyntaxException e) {
85 LOG.info(e.getMessage());
86 } catch (IOException e) {
87 LOG.info(e.getMessage());
88 } catch (SAXException e) {
89 LOG.info(e.getMessage());
90 } catch (XPathExpressionException e) {
91 LOG.info(e.getMessage());
92 } catch (ParserConfigurationException e) {
93 LOG.info(e.getMessage());
94 } catch (InterruptedException e) {
95 LOG.info(e.getMessage());
96 } catch (Exception e) {
97 LOG.info(e.getMessage());
98 }
99
100 postProcess();
101 int recordCount=engineResults.size();
102 return recordCount;
103 }
104
105
106
107
108
109
110
111 private void byPassLogicForPreProcess(String rawMarcContent, String rawEdiContent, boolean preProcessingReq) {
112 if (preProcessingReq) {
113 preProcess(rawMarcContent, rawEdiContent);
114 } else {
115 marcXMLContent = rawMarcContent;
116 ediXMLContent = rawEdiContent;
117 }
118 }
119
120
121
122
123
124
125 private void preProcess(String rawMarcContent, String rawEdiContent) {
126 marcXMLContent = preProcessMarc(rawMarcContent);
127 ediXMLContent = preProcessEDI(rawEdiContent);
128 }
129
130
131
132
133
134
135
136
137
138
139 public boolean process() throws URISyntaxException, IOException, SAXException, XPathExpressionException, ParserConfigurationException, InterruptedException, Exception {
140
141 Engine engine = KrmsApiServiceLocator.getEngine();
142
143 HashMap<String, String> map = new HashMap<String, String>();
144 map.put("AGENDA_NAME", ingestRecord.getAgendaName());
145 List<MatchBo> matchBos = (List<MatchBo>) getBusinessObjectService().findMatching(MatchBo.class, map);
146
147 HashMap<String, Object> agendaValue = new HashMap<String, Object>();
148 agendaValue.put("nm", ingestRecord.getAgendaName());
149 List<AgendaBo> agendaBos = (List<AgendaBo>) getBusinessObjectService().findMatching(AgendaBo.class, agendaValue);
150 AgendaBo agendaBo = agendaBos.get(0);
151
152 SelectionCriteria selectionCriteria =
153 SelectionCriteria.createCriteria(null, getSelectionContext(agendaBo.getContext().getName()), getAgendaContext(ingestRecord.getAgendaName()));
154
155 ExecutionOptions executionOptions = new ExecutionOptions();
156 executionOptions.setFlag(ExecutionFlag.LOG_EXECUTION, true);
157
158 OLETranscationalRecordGenerator oleTranscationalRecordGenerator = new OLETranscationalRecordGenerator();
159 EDIOrders ediOrders = oleTranscationalRecordGenerator.fromXml(ediXMLContent);
160
161 BibliographicRecordHandler bibliographicRecordHandler = new BibliographicRecordHandler();
162 Collection bibliographicRecords = bibliographicRecordHandler.fromXML(marcXMLContent);
163
164 List<BibliographicRecord> records = bibliographicRecords.getRecords();
165
166 List<ProfileAttributeBo> profileAttributeBos = getProfileAttributeBos(ingestRecord.getAgendaName());
167 List<OverlayOption> overlayOption = getOverlayOption(ingestRecord.getAgendaName());
168
169
170 EDIOrder ediOrder = ediOrders.getOrders().get(0);
171
172
173
174
175 int matchBibEdiRecord=0;
176 for (Iterator<BibliographicRecord> iterator = records.iterator(); iterator.hasNext();matchBibEdiRecord++ ) {
177 BibliographicRecord bibliographicRecord = iterator.next();
178 if(matchBibEdiRecord<records.size() && matchBibEdiRecord<ediOrder.getLineItemOrder().size()) {
179 if(records.get(matchBibEdiRecord)!=null && ediOrder.getLineItemOrder().get(matchBibEdiRecord)!=null){
180 String singleMarcXML = bibliographicRecordHandler.generateXML(bibliographicRecord);
181 Map<String, String> valuesMap = bibliographicRecordHandler.valuesMapFromXML(singleMarcXML);
182 valuesMap.putAll(getvendorLineItemReferenceNumber(ediOrder));
183 Facts.Builder factBuilder = Facts.Builder.create();
184 String termIncominField = null;
185 String termExistingField = null;
186 for (Iterator<MatchBo> matchBoIterator = matchBos.iterator(); matchBoIterator.hasNext(); ) {
187 MatchBo matchBo = matchBoIterator.next();
188 ProfileTerm term = new ProfileTerm();
189 String[] matchTermNames = matchBo.getTermName().split("-");
190 if(matchTermNames[0].equalsIgnoreCase(OLEConstants.INCOMING_FIELD)) {
191 term.setIncomingField(valuesMap.get(matchBo.getIncomingField()));
192 termIncominField = term.getIncomingField();
193
194 factBuilder.addFact(matchBo.getTermName(),termIncominField);
195 }
196 else if(matchTermNames[0].equalsIgnoreCase(OLEConstants.EXISTING_FIELD)){
197 term.setExistingField(matchBo.getExistingField());
198 term.setIncomingField(termIncominField);
199 termExistingField = term.getExistingField();
200
201 factBuilder.addFact(matchBo.getTermName(),termExistingField);
202 }
203 else {
204 factBuilder.addFact(matchBo.getTermName(),null);
205 }
206 }
207 LineItemOrderMatcherForBib lineItemOrderMatcherForBib = new LineItemOrderMatcherForBib();
208 LineItemOrder lineItemOrder = lineItemOrderMatcherForBib.getLineItemOrder(ediOrder.getLineItemOrder(), bibliographicRecord, getVendorProfileCode(profileAttributeBos));
209 DataCarrierService dataCarrierService = GlobalResourceLoader.getService(OLEConstants.DATA_CARRIER_SERVICE);
210 dataCarrierService.addData(OLEConstants.REQUEST_BIB_RECORD, bibliographicRecord);
211 dataCarrierService.addData(OLEConstants.PROFILE_ATTRIBUTE_LIST, profileAttributeBos);
212 dataCarrierService.addData(OLEConstants.OVERLAY_OPTION_LIST, overlayOption);
213
214 dataCarrierService.addData(OLEConstants.REQUEST_LINE_ITEM_ORDER_RECORD,lineItemOrder);
215 dataCarrierService.addData(OLEConstants.EDI_ORDER,ediOrder);
216 dataCarrierService.addData(OLEConstants.PROFILE_NM,ingestRecord.getAgendaName());
217
218 EngineResults engineResult=engine.execute(selectionCriteria, factBuilder.build(), executionOptions);
219 OleOrderRecord oleOrderRecord = (OleOrderRecord) engineResult.getAttribute(OLEConstants.OLE_ORDER_RECORD);
220 if(oleOrderRecord==null){
221 ingestRecord.setUpdate(true);
222 oleOrderRecord = new OleOrderRecord();
223 oleOrderRecord.setOriginalRecord(bibliographicRecord);
224 oleOrderRecord.setOriginalEdi(ediOrder);
225 OleTxRecord oleTxRecord = new OleTxRecord();
226 oleTxRecord.setVendorItemIdentifier(OleTxRecordBuilder.getInstance().getVendorItemIdentifier(lineItemOrder));
227 oleOrderRecord.setOleTxRecord(oleTxRecord);
228 }else {
229 OleTxRecord oleTxRecord = oleOrderRecord.getOleTxRecord();
230 if(oleTxRecord!=null){
231 if(oleTxRecord.getAccountNumber()==null || oleTxRecord.getAccountNumber().isEmpty()){
232 oleTxRecord.setAccountNumber(getParameter(OLEParameterConstants.OVERLAY_ACCOUNT_NUMBER));
233 }
234 if(oleTxRecord.getObjectCode()==null || oleTxRecord.getObjectCode().isEmpty()){
235 oleTxRecord.setObjectCode(getParameter(OLEParameterConstants.OVERLAY_OBJECT_CODE));
236 }
237 if(oleTxRecord.getItemChartCode()==null || oleTxRecord.getItemChartCode().isEmpty()){
238 oleTxRecord.setItemChartCode(getParameter(OLEParameterConstants.OVERLAY_CHART_CODE));
239 }
240 }
241 }
242 oleOrderRecord.setAgendaName(ingestRecord.getAgendaName());
243 oleOrderRecord.setOleOriginalBibRecordFileName(ingestRecord.getOriginalMarcFileName());
244 oleOrderRecord.setOriginalEDIFileName(ingestRecord.getOriginalEdiFileName());
245 oleOrderRecord.setDescription(ingestRecord.getAgendaDescription());
246 boolean validBFNFlag=isValidBFN(ediOrder, bibliographicRecord, profileAttributeBos);
247 oleOrderRecord.addMessageToMap("isValidRecord",true);
248 oleOrderRecord.addMessageToMap("isValidBFN",validBFNFlag);
249 List<ResultEvent> allResults = engineResult.getAllResults();
250 for (Iterator<ResultEvent> resultEventIterator = allResults.iterator(); resultEventIterator.hasNext(); ) {
251 ResultEvent resultEvent = resultEventIterator.next();
252 String ruleEvaluated = null;
253 if (resultEvent.getType().equals("Rule Evaluated")) {
254 if(validBFNFlag)
255 ruleEvaluated = resultEvent.getSource() + " : " + resultEvent.getResult();
256 else
257 ruleEvaluated = resultEvent.getSource() + " : " + "false";
258 List rulesEvaluatedList = (List) oleOrderRecord.getMessageMap().get("rulesEvaluated");
259 if (null == rulesEvaluatedList) {
260 rulesEvaluatedList = new ArrayList();
261 }
262 rulesEvaluatedList.add(ruleEvaluated);
263 oleOrderRecord.addMessageToMap("rulesEvaluated", rulesEvaluatedList);
264 }
265 }
266 if("false".equals((((List)oleOrderRecord.getMessageMap().get("rulesEvaluated")).get(0)).toString().split(":")[1].trim()) && oleOrderRecord.getOleBibRecord()==null)
267 oleOrderRecord.addMessageToMap("isBadControlField",true);
268 else
269 oleOrderRecord.addMessageToMap("isBadControlField",false);
270 oleOrderRecord.addMessageToMap(OLEConstants.USER_ID,this.getUser());
271 engineResult.setAttribute(OLEConstants.OLE_ORDER_RECORD, oleOrderRecord);
272 engineResults.add(engineResult);
273 }
274 }
275 }
276 if(records.size()>ediOrder.getLineItemOrder().size()){
277 for(int i=ediOrder.getLineItemOrder().size();i<records.size();i++){
278 OleOrderRecord oleOrderRecord=new OleOrderRecord();
279 oleOrderRecord.setAgendaName(ingestRecord.getAgendaName());
280 oleOrderRecord.setOleOriginalBibRecordFileName(ingestRecord.getOriginalMarcFileName());
281 oleOrderRecord.setOriginalEDIFileName(ingestRecord.getOriginalEdiFileName());
282 oleOrderRecord.setOriginalRecord(records.get(i));
283 oleOrderRecord.setDescription(ingestRecord.getAgendaDescription());
284 oleOrderRecord.setOriginalEdi(ediOrder);
285 oleOrderRecord.setOleBibRecord(new OleBibRecord());
286
287 oleOrderRecord.setOleTxRecord(null);
288 oleOrderRecord.addMessageToMap("isValidRecord",false);
289 oleOrderRecord.addMessageToMap("isBadControlField",false);
290 Facts.Builder factBuilder = Facts.Builder.create();
291 EngineResults engineResult=new EngineResultsImpl();
292 engineResult.setAttribute(OLEConstants.OLE_ORDER_RECORD, oleOrderRecord);
293 List rulesEvaluatedList = new ArrayList();
294 String ruleEvaluated = "ISBN Validation"+ " : " + "true";
295 rulesEvaluatedList.add(ruleEvaluated);
296 oleOrderRecord.addMessageToMap("rulesEvaluated", rulesEvaluatedList);
297 oleOrderRecord.addMessageToMap("isValidBFN","false");
298 getEngineResults().add(engineResult);
299
300 }
301 }
302 else if(records.size()<ediOrder.getLineItemOrder().size()){
303 for(int i=records.size();i<ediOrder.getLineItemOrder().size();i++){
304 OleOrderRecord oleOrderRecord=new OleOrderRecord();
305 oleOrderRecord.setAgendaName(ingestRecord.getAgendaName());
306 oleOrderRecord.setOleOriginalBibRecordFileName(ingestRecord.getOriginalMarcFileName());
307 oleOrderRecord.setOriginalEDIFileName(ingestRecord.getOriginalEdiFileName());
308 oleOrderRecord.setOriginalRecord(null);
309 oleOrderRecord.setDescription(ingestRecord.getAgendaDescription());
310 oleOrderRecord.setOriginalEdi(ediOrder);
311 oleOrderRecord.setOleBibRecord(new OleBibRecord());
312 OleTxRecord oleTxRecord = getOleTxRecord(ediOrder.getLineItemOrder().get(i), ediOrder, profileAttributeBos);
313 oleOrderRecord.setOleTxRecord(oleTxRecord);
314 oleOrderRecord.addMessageToMap("isValidRecord",false);
315 oleOrderRecord.addMessageToMap("isBadControlField",false);
316 Facts.Builder factBuilder = Facts.Builder.create();
317 EngineResults engineResult=new EngineResultsImpl();
318 engineResult.setAttribute(OLEConstants.OLE_ORDER_RECORD, oleOrderRecord);
319 List rulesEvaluatedList = new ArrayList();
320 String ruleEvaluated = "ISBN Validation"+ " : " + "true";
321 rulesEvaluatedList.add(ruleEvaluated);
322 oleOrderRecord.addMessageToMap("rulesEvaluated", rulesEvaluatedList);
323 oleOrderRecord.addMessageToMap("isValidBFN","false");
324 getEngineResults().add(engineResult);
325
326 }
327 }
328
329 boolean all_records_failure_falg=true;
330
331 List<EngineResults> engineResults = getEngineResults();
332 for (Iterator<EngineResults> iterator = engineResults.iterator(); iterator.hasNext(); ) {
333 EngineResults results = iterator.next();
334 OleOrderRecord oleOrderRecord = (OleOrderRecord) results.getAttribute(OLEConstants.OLE_ORDER_RECORD);
335
336 if("true".equals((oleOrderRecord.getMessageMap().get("isValidRecord")).toString()) &&
337 "true".equals((oleOrderRecord.getMessageMap().get("isValidBFN")).toString()) &&
338 "false".equals((((List)oleOrderRecord.getMessageMap().get("rulesEvaluated")).get(0)).toString().split(":")[1].trim())) {
339 all_records_failure_falg=false;
340 break;
341 }
342 }
343
344
345
346
347
348
349
350 return all_records_failure_falg;
351 }
352
353 public String getParameter(String name){
354 ParameterKey parameterKey = ParameterKey.create(OLEConstants.APPL_ID,OLEConstants.SELECT_NMSPC,OLEConstants.SELECT_CMPNT,name);
355 Parameter parameter = CoreServiceApiServiceLocator.getParameterRepositoryService().getParameter(parameterKey);
356 return parameter!=null?parameter.getValue():null;
357 }
358
359
360
361
362
363
364 private boolean isNumMarcMatchingNumEdiRecords(EDIOrder ediOrder, List<BibliographicRecord> records) {
365 return records.size() == ediOrder.getLineItemOrder().size();
366 }
367
368
369
370
371
372
373 private String getVendorProfileCode(List<ProfileAttributeBo> profileAttributeBo) {
374 for (Iterator<ProfileAttributeBo> iterator = profileAttributeBo.iterator(); iterator.hasNext(); ) {
375 ProfileAttributeBo attributeBo = iterator.next();
376 if (attributeBo.getAttributeName().equals(OLEConstants.VENDOR_PROFILE_CODE)) {
377 return attributeBo.getAttributeValue();
378 }
379 }
380 return null;
381 }
382
383
384
385
386
387
388
389 public List<OverlayOption> getOverlayOption(String agendaName) {
390 HashMap map = new HashMap();
391 map.put("agenda_name", agendaName);
392 List<OverlayOption> matching = (List<OverlayOption>) getBusinessObjectService().findMatching(OverlayOption.class, map);
393 return matching;
394 }
395
396
397
398
399
400
401 public List<ProfileAttributeBo> getProfileAttributeBos(String agendaName) {
402 HashMap map = new HashMap();
403 map.put("agenda_name", agendaName);
404 List<ProfileAttributeBo> matching = (List<ProfileAttributeBo>) getBusinessObjectService().findMatching(ProfileAttributeBo.class, map);
405 return matching;
406 }
407
408
409
410
411
412
413
414 private OleTxRecord getMatchingTxRecord(EDIOrder ediOrder, BibliographicRecord bibliographicRecord, List<ProfileAttributeBo> profileAttributeBos) throws Exception {
415 LineItemOrderMatcherForBib lineItemOrderMatcherForBib = new LineItemOrderMatcherForBib();
416 LineItemOrder lineItemOrder = lineItemOrderMatcherForBib.getLineItemOrder(ediOrder.getLineItemOrder(), bibliographicRecord, getVendorProfileCode(profileAttributeBos));
417 OleTxRecord oleTxRecord = OleTxRecordBuilder.getInstance().build(lineItemOrder, profileAttributeBos, ediOrder);
418 return oleTxRecord;
419 }
420
421 private OleTxRecord getOleTxRecord(LineItemOrder lineItemOrder,EDIOrder ediOrder,List<ProfileAttributeBo> profileAttributeBos) throws Exception {
422 LineItemOrderMatcherForBib lineItemOrderMatcherForBib = new LineItemOrderMatcherForBib();
423 OleTxRecord oleTxRecord = OleTxRecordBuilder.getInstance().build(lineItemOrder, profileAttributeBos, ediOrder);
424 return oleTxRecord;
425 }
426
427 private boolean isValidBFN(EDIOrder ediOrder, BibliographicRecord bibliographicRecord, List<ProfileAttributeBo> profileAttributeBos) throws Exception {
428 LineItemOrderMatcherForBib lineItemOrderMatcherForBib = new LineItemOrderMatcherForBib();
429 LineItemOrder lineItemOrder = lineItemOrderMatcherForBib.getLineItemOrder(ediOrder.getLineItemOrder(), bibliographicRecord, getVendorProfileCode(profileAttributeBos));
430 String bfn=null;
431 if(lineItemOrder!=null){
432 Map<String, String> accountInfo = OleTxRecordBuilder.getInstance().getAccountInfo(lineItemOrder);
433 bfn = accountInfo!=null?"1":null;
434 }
435 if(bfn!=null)
436 return true;
437 return false;
438 }
439
440
441
442
443
444
445
446
447 private BusinessObjectService getBusinessObjectService() {
448 if (null == businessObjectService) {
449 businessObjectService = KRADServiceLocator.getBusinessObjectService();
450 }
451 return businessObjectService;
452 }
453
454
455
456
457
458
459 protected Map<String, String> getSelectionContext(String contextName) {
460 Map<String, String> selector = new HashMap<String, String>();
461 selector.put(NAMESPACE_CODE_SELECTOR, "OLE");
462 selector.put(NAME_SELECTOR, contextName);
463 return selector;
464 }
465
466
467
468
469
470
471 protected Map<String, String> getAgendaContext(String agendaName) {
472 Map<String, String> selector = new HashMap<String, String>();
473 selector.put(NAME_SELECTOR, agendaName);
474 return selector;
475 }
476
477 private Map<String, String> getvendorLineItemReferenceNumber(EDIOrder ediOrder){
478 Map<String, String> referenceNumberMap = new HashMap<String, String>();
479
480 for(LineItemOrder lineItemOrder : ediOrder.getLineItemOrder()){
481 for(BuyerReferenceInformation buyerReferenceInformation : lineItemOrder.getBuyerReferenceInformation()){
482 for(BuyerLineItemReference buyerLineItemReference : buyerReferenceInformation.getBuyerLineItemReference()){
483 referenceNumberMap.put(buyerLineItemReference.getBuyersOrderLine(),buyerLineItemReference.getOrderLineNumber());
484 }
485 }
486 }
487 return referenceNumberMap;
488 }
489
490 public abstract String preProcessMarc(String marcFileContent);
491
492 public abstract String preProcessEDI(String ediFileContent);
493
494 public abstract void postProcess();
495
496 }