001/*
002 * Copyright 2011 The Kuali Foundation.
003 * 
004 * Licensed under the Educational Community License, Version 1.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 * 
008 * http://www.opensource.org/licenses/ecl1.php
009 * 
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.kuali.batchingest;
017
018import java.util.ArrayList;
019import java.util.HashMap;
020import java.util.Iterator;
021import java.util.List;
022import java.util.Map;
023import java.util.StringTokenizer;
024
025import javax.xml.parsers.SAXParser;
026import javax.xml.parsers.SAXParserFactory;
027
028import org.kuali.ole.select.businessobject.BibInfoBean;
029import org.kuali.ole.select.service.impl.OleBatchIngestServiceImpl;
030import org.xml.sax.Attributes;
031import org.xml.sax.SAXException;
032import org.xml.sax.helpers.DefaultHandler;
033
034public class MarcDataFormatTransformer {
035    private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(MarcDataFormatTransformer.class);
036    
037    private BibInfoBean bibInfoBean;
038    StringBuilder defaultValues = null; 
039    String requestorSourceType = "";
040  //  Map<String,String> vendorCodeMap = new HashMap<String,String>();
041    Map<String,String> deliverToName = new HashMap<String,String>();
042    Map<String, Map<String, String>> fundCodesForMarcXMLTags = new HashMap<String, Map<String, String>>();
043   
044    public MarcDataFormatTransformer() {
045        
046    //    vendorCodeMap.put("YBP", "12106-0");
047        //vendorCodeMap.put("L&H", "12106-0");
048        
049        deliverToName.put("JLL", "ole-jolevinson");
050        deliverToName.put("CM", "ole-mschramm");
051        deliverToName.put("AK", "ole-gkrau");
052        deliverToName.put("RB", "ole-mbelton");
053        
054        HashMap<String, String> map1 = new HashMap<String, String>();
055        map1.put("2947430", "7112");
056        fundCodesForMarcXMLTags.put("43", map1);
057        HashMap<String, String> map2 = new HashMap<String, String>();
058        map2.put("2947485", "7112");
059        fundCodesForMarcXMLTags.put("13", map2);
060        HashMap<String, String> map3 = new HashMap<String, String>();
061        map3.put("2947483", "7112");
062        fundCodesForMarcXMLTags.put("74", map3);
063        HashMap<String, String> map4 = new HashMap<String, String>();
064        map4.put("2947499", "7112");
065        fundCodesForMarcXMLTags.put("98", map4);
066        HashMap<String, String> map5 = new HashMap<String, String>();
067        map5.put("2947494", "7112");
068        fundCodesForMarcXMLTags.put("65", map5);
069        HashMap<String, String> map6 = new HashMap<String, String>();
070        map6.put("2947486", "7112");
071        fundCodesForMarcXMLTags.put("19", map6);
072        HashMap<String, String> map7 = new HashMap<String, String>();
073        map7.put("2947493", "7112");
074        fundCodesForMarcXMLTags.put("64", map7);
075        HashMap<String, String> map8 = new HashMap<String, String>();
076        map8.put("2947496", "7112");
077        fundCodesForMarcXMLTags.put("93", map8);
078        HashMap<String, String> map9 = new HashMap<String, String>();
079        map9.put("2947497", "7112");
080        fundCodesForMarcXMLTags.put("94", map9);
081        HashMap<String, String> map10 = new HashMap<String, String>();
082        map10.put("2947488", "7112");
083        fundCodesForMarcXMLTags.put("35", map10);
084        HashMap<String, String> map11 = new HashMap<String, String>();
085        map11.put("2947498", "7112");
086        fundCodesForMarcXMLTags.put("95", map11);
087        HashMap<String, String> map12 = new HashMap<String, String>();
088        map12.put("2947487", "7112");
089        fundCodesForMarcXMLTags.put("21", map12);
090        HashMap<String, String> map13 = new HashMap<String, String>();
091        map13.put("2947489", "7112");
092        fundCodesForMarcXMLTags.put("37", map13);
093        HashMap<String, String> map14 = new HashMap<String, String>();
094        map14.put("2947482", "7112");
095        fundCodesForMarcXMLTags.put("27", map14);
096        HashMap<String, String> map15 = new HashMap<String, String>();
097        map15.put("2947490", "7112");
098        fundCodesForMarcXMLTags.put("50", map15);
099        HashMap<String, String> map16 = new HashMap<String, String>();
100        map16.put("2947492", "7112");
101        fundCodesForMarcXMLTags.put("53", map16);
102        HashMap<String, String> map17 = new HashMap<String, String>();
103        map17.put("2947491", "7112");
104        fundCodesForMarcXMLTags.put("51", map17);
105        HashMap<String, String> map18 = new HashMap<String, String>();
106        map18.put("2947495", "7112");
107        fundCodesForMarcXMLTags.put("86", map18);
108    }
109    
110    
111    public void parseDefaultValues() throws Exception{
112        
113      
114        
115        String path = getClass().getClassLoader().getResource("KualiETLConfig.xml").toString();
116        SAXParserFactory factory = SAXParserFactory.newInstance();
117        SAXParser saxParser = factory.newSAXParser();
118        DefaultHandler handler = new DefaultHandler() { 
119            
120        boolean deliveryCampusCode = false;
121       // boolean deliverytoName = false;
122        boolean deliveryBuildingCode = false;
123        boolean deliveryBuildingLine1Address = false;
124        boolean deliveryBuildingRoomNumber = false;
125        boolean deliveryCityName = false;
126        boolean deliveryStateCode = false;
127        boolean deliveryPostalCode = false;
128        boolean deliveryCountryCode = false;    
129        boolean purchaseOrderTransmissionMethodCode = false;
130        boolean purchaseOrderCostSourceCode = false;
131        boolean requestorPersonName = false;
132        boolean requestorPersonEmailAddress = false;
133        boolean requestorPersonPhoneNumber = false;
134        boolean requisitionDescription = false;
135        boolean financialYear = false;
136        boolean fundingSource = false;
137        boolean uom = false;
138        boolean chart = false;
139      //  boolean objectCode = false;
140        boolean percent = false;
141        boolean chartOfAccountsCode = false;
142        boolean organizationCode = false;
143        boolean documentFundingSourceCode = false; 
144        boolean useTaxIndicator = false;
145        boolean deliveryBuildingOtherIndicator = false;
146        boolean organizationAutomaticPurchaseOrderLimit = false;
147        boolean purchaseOrderAutomaticIndicator = false;
148        boolean receivingDocumentRequiredIndicator = false;
149        boolean paymentRequestPositiveApprovalIndicator = false;
150        boolean itemTypeCode = false;
151        boolean billingName = false;
152        boolean billingLine1Address = false;
153        boolean billingCityName = false;
154        boolean billingStateCode = false;
155        boolean billingPostalCode = false;
156        boolean billingCountryCode = false;
157        boolean billingPhoneNumber = false;
158        boolean vendorcustomernumber = false;
159        boolean requestorsource = false;
160       // boolean ybp = false;
161
162        //Event Handlers
163        public void startElement(String uri, String localName, String qName,
164            Attributes attributes) throws SAXException {
165            //reset
166                
167            if (qName.equalsIgnoreCase("CONFIG")) {
168                bibInfoBean = new BibInfoBean();
169               defaultValues = new StringBuilder();
170           }
171            if (qName.equalsIgnoreCase("DELIVERYCAMPUSCODE")) {
172                    bibInfoBean = new BibInfoBean();
173                   defaultValues = new StringBuilder();
174                   deliveryCampusCode = true;
175               }/*else if (qName.equalsIgnoreCase("DELIVERYTONAME")) {
176                   defaultValues = new StringBuilder();
177                   deliverytoName = true;
178               }*/else if (qName.equalsIgnoreCase("DELIVERYBUILDINGCODE")) {
179                   defaultValues = new StringBuilder();
180                   deliveryBuildingCode = true;
181               }else if (qName.equalsIgnoreCase("DELIVERYBUILDINGLINE1ADDRESS")) {
182                   defaultValues = new StringBuilder();
183                   deliveryBuildingLine1Address = true;
184               }else if (qName.equalsIgnoreCase("DELIVERYBUILDINGROOMNUMBER")) {
185                   defaultValues = new StringBuilder();
186                   deliveryBuildingRoomNumber = true;
187               }else if (qName.equalsIgnoreCase("DELIVERYCITYNAME")) {
188                   defaultValues = new StringBuilder();
189                   deliveryCityName = true;
190               }else if (qName.equalsIgnoreCase("DELIVERYSTATECODE")) {
191                   defaultValues = new StringBuilder();
192                   deliveryStateCode = true;
193               }else if (qName.equalsIgnoreCase("DELIVERYPOSTALCODE")) {
194                   defaultValues = new StringBuilder();
195                   deliveryPostalCode = true;
196               }else if (qName.equalsIgnoreCase("DELIVERYCOUNTRYCODE")) {
197                   defaultValues = new StringBuilder();
198                   deliveryCountryCode = true;
199               }else if (qName.equalsIgnoreCase("REQUISITIONDESCRIPTION")) {
200                   defaultValues = new StringBuilder();
201                   requisitionDescription = true;
202               }else if (qName.equalsIgnoreCase("FINANCIALYEAR")) {
203                   defaultValues = new StringBuilder();
204                   financialYear = true;
205               }else if (qName.equalsIgnoreCase("FUNDINGSOURCE")) {
206                   defaultValues = new StringBuilder();
207                   fundingSource = true;
208               }else if (qName.equalsIgnoreCase("PURCHASEORDERTRANSMISSIONMETHODCODE")) {
209                   defaultValues = new StringBuilder();
210                   purchaseOrderTransmissionMethodCode = true;
211               }else if (qName.equalsIgnoreCase("PURCHASEORDERCOSTSOURCECODE")) {
212                   defaultValues = new StringBuilder();
213                   purchaseOrderCostSourceCode = true;
214               }else if (qName.equalsIgnoreCase("REQUESTORPERSONNAME")) {
215                   defaultValues = new StringBuilder();
216                   requestorPersonName = true;
217               }else if (qName.equalsIgnoreCase("REQUESTORPERSONEMAILADDRESS")) {
218                   defaultValues = new StringBuilder();
219                   requestorPersonEmailAddress = true;
220               }else if (qName.equalsIgnoreCase("REQUESTORPERSONPHONENUMBER")) {
221                   defaultValues = new StringBuilder();
222                   requestorPersonPhoneNumber = true;
223               }else if (qName.equalsIgnoreCase("UOM")) {
224                   defaultValues = new StringBuilder();
225                   uom = true;
226               }else if (qName.equalsIgnoreCase("CHART")) {
227                   defaultValues = new StringBuilder();
228                   chart = true;
229               }/*else if (qName.equalsIgnoreCase("OBJECTCODE")) {
230                   defaultValues = new StringBuilder();
231                   objectCode = true;
232               }*/else if (qName.equalsIgnoreCase("PERCENT")) {
233                   defaultValues = new StringBuilder();
234                   percent = true;
235               }else if (qName.equalsIgnoreCase("CHARTOFACCOUNTSCODE")) {
236                   defaultValues = new StringBuilder();
237                   chartOfAccountsCode = true;
238               }else if (qName.equalsIgnoreCase("ORGANIZATIONCODE")) {
239                   defaultValues = new StringBuilder();
240                   organizationCode = true;
241               }else if (qName.equalsIgnoreCase("DOCUMENTFUNDINGSOURCECODE")) {
242                   defaultValues = new StringBuilder();
243                   documentFundingSourceCode = true;
244               }else if (qName.equalsIgnoreCase("USETAXINDICATOR")) {
245                   defaultValues = new StringBuilder();
246                   useTaxIndicator = true;
247               }else if (qName.equalsIgnoreCase("DELIVERYBUILDINGOTHERINDICATOR")) {
248                   defaultValues = new StringBuilder();
249                   deliveryBuildingOtherIndicator = true;
250               }else if (qName.equalsIgnoreCase("ORGANIZATIONAUTOMATICPURCHASEORDERLIMIT")) {
251                   defaultValues = new StringBuilder();
252                   organizationAutomaticPurchaseOrderLimit = true;
253               }else if (qName.equalsIgnoreCase("PURCHASEORDERAUTOMATICINDICATOR")) {
254                   defaultValues = new StringBuilder();
255                   purchaseOrderAutomaticIndicator = true;
256               }else if (qName.equalsIgnoreCase("RECEIVINGDOCUMENTREQUIREDINDICATOR")) {
257                   defaultValues = new StringBuilder();
258                   receivingDocumentRequiredIndicator = true;
259               }else if (qName.equalsIgnoreCase("PAYMENTREQUESTPOSITIVEAPPROVALINDICATOR")) {
260                   defaultValues = new StringBuilder();
261                   paymentRequestPositiveApprovalIndicator = true;
262               }else if (qName.equalsIgnoreCase("ITEMTYPECODE")) {
263                   defaultValues = new StringBuilder();
264                   itemTypeCode = true;
265               }else if(qName.equalsIgnoreCase("BILLINGNAME")){ 
266                   defaultValues = new StringBuilder();
267                   billingName = true;
268               }else if(qName.equalsIgnoreCase("BILLINGLINE1ADDRESS")){
269                   defaultValues = new StringBuilder();
270                   billingLine1Address = true;
271               } else if(qName.equalsIgnoreCase("BILLINGCITYNAME")){
272                   defaultValues = new StringBuilder();
273                   billingCityName = true;
274               }else if(qName.equalsIgnoreCase("BILLINGSTATECODE")){
275                   defaultValues = new StringBuilder();
276                   billingStateCode = true;
277               }else if(qName.equalsIgnoreCase("BILLINGPOSTALCODE")){
278                   defaultValues = new StringBuilder();
279                   billingPostalCode = true;
280               }else if(qName.equalsIgnoreCase("BILLINGCOUNTRYCODE")){
281                   defaultValues = new StringBuilder();
282                   billingCountryCode = true;
283               }else if(qName.equalsIgnoreCase("BILLINGPHONENUMBER")){
284                   defaultValues = new StringBuilder();
285                   billingPhoneNumber = true;
286               }else if(qName.equalsIgnoreCase("VENDORCUSTOMERNUMBER")){
287                   defaultValues = new StringBuilder();
288                   vendorcustomernumber = true;
289               }else if(qName.equalsIgnoreCase("REQUESTORSOURCE")){
290                   defaultValues = new StringBuilder();
291                   requestorsource = true;
292               }
293             
294        }
295
296        
297        public void endElement(String uri, String localName,
298                String qName) throws SAXException {
299           
300            
301              if (deliveryCampusCode) {
302                    bibInfoBean.setDeliveryCampusCode(defaultValues.toString());
303                    defaultValues = null;
304                    deliveryCampusCode = false;
305                }/*else if (deliverytoName) {
306                    bibInfoBean.setDeliveryToName(defaultValues.toString());
307                    defaultValues = null;
308                       deliverytoName = false;
309                }*/else if (deliveryBuildingCode) {
310                    bibInfoBean.setDeliveryBuildingCode(defaultValues.toString());
311                    defaultValues = null;
312                     deliveryBuildingCode = false;
313                }else if (deliveryBuildingLine1Address) {
314                    bibInfoBean.setDeliveryBuildingLine1Address(defaultValues.toString());
315                    defaultValues = null;
316                     deliveryBuildingLine1Address = false;
317                }else if (deliveryBuildingRoomNumber) {
318                    bibInfoBean.setDeliveryBuildingRoomNumber(defaultValues.toString());
319                    defaultValues = null;
320                     deliveryBuildingRoomNumber = false;
321                }else if (deliveryCityName) {
322                    bibInfoBean.setDeliveryCityName(defaultValues.toString());
323                    defaultValues = null;
324                     deliveryCityName = false;
325                }else if (deliveryStateCode) {
326                    bibInfoBean.setDeliveryStateCode(defaultValues.toString());
327                    defaultValues = null;
328                     deliveryStateCode = false;
329                }else if (deliveryPostalCode) {
330                    bibInfoBean.setDeliveryPostalCode(defaultValues.toString());
331                    defaultValues = null;
332                     deliveryPostalCode = false;
333                }else if (deliveryCountryCode) {
334                    bibInfoBean.setDeliveryCountryCode(defaultValues.toString());
335                    defaultValues = null;
336                     deliveryCountryCode = false;
337                }else if (purchaseOrderTransmissionMethodCode) {
338                       bibInfoBean.setPurchaseOrderTransmissionMethodCode(defaultValues.toString());
339                       defaultValues = null;
340                       purchaseOrderTransmissionMethodCode = false;
341                   }else if (purchaseOrderCostSourceCode) {
342                       bibInfoBean.setPurchaseOrderCostSourceCode(defaultValues.toString());
343                       defaultValues = null;
344                       purchaseOrderCostSourceCode = false;
345                   }else if (requestorPersonName) {
346                       bibInfoBean.setRequestorPersonName(defaultValues.toString());
347                       defaultValues = null;
348                       requestorPersonName = false;
349                   }else if (requestorPersonEmailAddress) {
350                       bibInfoBean.setRequestorPersonEmailAddress(defaultValues.toString());
351                       defaultValues = null;
352                       requestorPersonEmailAddress = false;
353                   }else if (requestorPersonPhoneNumber) {
354                       bibInfoBean.setRequestorPersonPhoneNumber(defaultValues.toString());
355                       defaultValues = null;
356                       requestorPersonPhoneNumber = false;
357                   }else if (requisitionDescription) {
358                       bibInfoBean.setRequisitionDescription(defaultValues.toString());
359                       defaultValues = null;
360                       requisitionDescription = false;
361                   }else if (financialYear) {
362                       bibInfoBean.setFinantialYear(defaultValues.toString());
363                       defaultValues = null;
364                       financialYear = false;
365                   }else if (fundingSource) {
366                       bibInfoBean.setFundingSource(defaultValues.toString());
367                       defaultValues = null;
368                       fundingSource = false;
369                   } else if (uom) {
370                       bibInfoBean.setUom(defaultValues.toString());
371                       defaultValues = null;
372                       uom = false;
373                   }else if (chart) {
374                       bibInfoBean.setChart(defaultValues.toString());
375                       defaultValues = null;
376                       chart = false;
377                   }/*else if (objectCode) {
378                       bibInfoBean.setObjectCode(defaultValues.toString());
379                       defaultValues = null;
380                       objectCode = false;
381                   }*/else if (percent) {
382                       if(defaultValues.toString().length()>0){
383                           bibInfoBean.setPercent(new Long(defaultValues.toString()));
384                           percent = false;
385                       }
386                       defaultValues = null;
387                   }else if (chartOfAccountsCode) {
388                       bibInfoBean.setChartOfAccountsCode(defaultValues.toString());
389                       defaultValues = null;
390                       chartOfAccountsCode = false;
391                   }else if (organizationCode) {
392                       bibInfoBean.setOrganizationCode(defaultValues.toString());
393                       defaultValues = null;
394                       organizationCode = false;
395                   }else if (documentFundingSourceCode) {
396                       bibInfoBean.setDocumentFundingSourceCode(defaultValues.toString());
397                       defaultValues = null;
398                       documentFundingSourceCode = false;
399                   }else if (useTaxIndicator) {
400                       bibInfoBean.setUseTaxIndicator(defaultValues.toString().equalsIgnoreCase("TRUE") ? true : false);
401                       defaultValues = null;
402                       useTaxIndicator = false;
403                   }else if (deliveryBuildingOtherIndicator) {
404                       bibInfoBean.setDeliveryBuildingOtherIndicator(defaultValues.toString().equalsIgnoreCase("TRUE") ? true : false);
405                       defaultValues = null;
406                       deliveryBuildingOtherIndicator = false;
407                   }else if (organizationAutomaticPurchaseOrderLimit) {
408                       bibInfoBean.setOrganizationAutomaticPurchaseOrderLimit(defaultValues.toString());
409                       defaultValues = null;
410                       organizationAutomaticPurchaseOrderLimit = false;
411                   }else if (purchaseOrderAutomaticIndicator) {
412                       bibInfoBean.setPurchaseOrderAutomaticIndicator(defaultValues.toString().equalsIgnoreCase("TRUE") ? true : false);
413                       defaultValues = null;
414                       purchaseOrderAutomaticIndicator = false;
415                   }else if (receivingDocumentRequiredIndicator) {
416                       bibInfoBean.setReceivingDocumentRequiredIndicator(defaultValues.toString().equalsIgnoreCase("TRUE") ? true : false);
417                       defaultValues = null;
418                       receivingDocumentRequiredIndicator = false;
419                   }else if (paymentRequestPositiveApprovalIndicator) {
420                       bibInfoBean.setPaymentRequestPositiveApprovalIndicator(defaultValues.toString().equalsIgnoreCase("TRUE") ? true : false);
421                       defaultValues = null;
422                       paymentRequestPositiveApprovalIndicator = false;
423                   }else if (itemTypeCode) {
424                       bibInfoBean.setItemTypeCode(defaultValues.toString());
425                       defaultValues = null;
426                       itemTypeCode = false;
427                   }else if (billingName) {
428                       bibInfoBean.setBillingName(defaultValues.toString());
429                       defaultValues = null;
430                       billingName = false;
431                   }else if (billingLine1Address) {
432                       bibInfoBean.setBillingLine1Address(defaultValues.toString());
433                       defaultValues = null;
434                       billingLine1Address = false;
435                   }else if (billingCityName) {
436                       bibInfoBean.setBillingCityName(defaultValues.toString());
437                       defaultValues = null;
438                       billingCityName = false;
439                   }else if (billingStateCode) {
440                       bibInfoBean.setBillingStateCode(defaultValues.toString());
441                       defaultValues = null;
442                       billingStateCode = false;
443                   }else if (billingPostalCode) {
444                       bibInfoBean.setBillingPostalCode(defaultValues.toString());
445                       defaultValues = null;
446                       billingPostalCode = false;
447                   }else if (billingCountryCode) {
448                       bibInfoBean.setBillingCountryCode(defaultValues.toString());
449                       defaultValues = null;
450                       billingCountryCode = false;
451                   }else if (billingPhoneNumber) {
452                       bibInfoBean.setBillingPhoneNumber(defaultValues.toString());
453                       defaultValues = null;
454                       billingPhoneNumber = false;
455                   }else if(vendorcustomernumber){
456                       bibInfoBean.setVendorCustomerNumber(defaultValues.toString());
457                       defaultValues = null;
458                       vendorcustomernumber = false;
459                   }else if(requestorsource){
460                       requestorSourceType = defaultValues.toString();
461                       defaultValues = null;
462                       requestorsource = false;
463                   }
464
465            }
466        
467          public void characters(char ch[], int start, int length)
468           throws SAXException {
469           if(defaultValues != null)
470               defaultValues.append(ch, start, length);
471          }
472        
473        };saxParser.parse(path, handler);
474    }
475    
476    
477    
478    public String transformRawDataToXml(String rawData) throws Exception{
479        StringBuilder xmlString = new StringBuilder();
480        parseDefaultValues();
481        boolean rootFlag = false;
482        String urlxsi = "\"http://www.w3.org/2001/XMLSchema-instance\"";
483        String ns = "xsi:noNamespaceSchemaLocation=";
484        String orderType = "firm_fixed_ybp"; // Need to take it from file name.
485        //String requestorSource = requestorSourceType;
486        if ( LOG.isDebugEnabled() ) { 
487            LOG.debug("Start Checking the Data");
488            LOG.debug(rawData);
489        }
490        xmlString.append("<requisitions  ordertype='" + orderType + "' requestorsource='"+requestorSourceType+"' xmlns:xsi=" + urlxsi + "  " + ns + "\"requisition.xsd\"" + ">\n");
491        boolean emptyFlag = false;
492        StringTokenizer field = new StringTokenizer(rawData, "=");
493        while (field.hasMoreTokens()) {
494
495            String fieldLine = field.nextToken();
496            if((fieldLine.trim().length()>0)&&(fieldLine.trim().length()>=4) ){
497            String fieldCode = fieldLine.substring(0, 4);
498          
499            if (fieldCode.contains("LDR")) {
500                if (rootFlag) {
501                    try{
502                        if(emptyFlag){
503                            parseDefaultValues();
504                            xmlString = getDefaultValues(xmlString);
505                        }
506                    }catch(Exception e){
507                        e.printStackTrace();
508                    }
509                    if(emptyFlag){
510                    xmlString.append("</requisition>\n");
511                    emptyFlag = false;
512                    }
513                }
514                xmlString.append("<requisition>\n");
515                String leader = fieldLine.substring(fieldCode.length(), fieldLine.length());
516                xmlString.append("<leader><![CDATA["+leader.trim()+"]]></leader>\n");
517                emptyFlag = true;
518                rootFlag = true;
519            }else if(fieldCode.contains("008")){
520            String controlField = fieldLine.substring(fieldCode.length(), fieldLine.length());
521            xmlString.append("<controlfield><![CDATA["+controlField.trim()+"]]></controlfield>\n");
522            }else if (fieldCode.contains("020")) {
523                String[] subField = fieldLine.split("\\$");
524                String isbn = "";
525                for (int i = 0; i < subField.length; i++) {
526                    String subFieldCode = String.valueOf(subField[i].charAt(0));
527                    if (subFieldCode != null && subFieldCode != "" && subFieldCode.equalsIgnoreCase("a")) {
528                        isbn = subField[1].substring(1, subField[1].length());
529                        xmlString.append("<ISBN><![CDATA["+isbn.trim()+"]]></ISBN>\n");
530                        emptyFlag = true;
531                    }
532                }
533            } else if (fieldCode.contains("100")) {
534                String[] subField = fieldLine.split("\\$");
535                String author = "";
536                for (int i = 0; i < subField.length; i++) {
537                    String subFieldCode = String.valueOf(subField[i].charAt(0));
538                    if (subFieldCode != null && subFieldCode != "" && subFieldCode.equalsIgnoreCase("a")) {
539                        author = subField[1].substring(1, subField[1].length());
540                        xmlString.append("<author><![CDATA["+author.trim()+"]]></author>\n");
541                        emptyFlag = true;
542                    }
543                }
544            } else if (fieldCode.contains("245")) {
545                String[] subField = fieldLine.split("\\$");
546                String title = "";
547                for (int i = 0; i < subField.length; i++) {
548                    String subFieldCode = String.valueOf(subField[i].charAt(0));
549                    if (subFieldCode != null && subFieldCode != "" && subFieldCode.equalsIgnoreCase("a")) {
550                        title = subField[1].substring(1, subField[1].length());
551                        xmlString.append("<title><![CDATA["+title.trim()+"]]></title>\n");
552                        emptyFlag = true;
553                    }
554                }
555            } else if (fieldCode.contains("250")) {
556                String[] subField = fieldLine.split("\\$");
557                String edition = "";
558                for (int i = 0; i < subField.length; i++) {
559                    String subFieldCode = String.valueOf(subField[i].charAt(0));
560                    if (subFieldCode != null && subFieldCode != "" && subFieldCode.equalsIgnoreCase("a")) {
561                        edition = subField[1].substring(1, subField[1].length());
562                        xmlString.append("<edition><![CDATA["+edition.trim()+"]]></edition>\n");
563                        emptyFlag = true;
564                    }
565                }
566            } else if (fieldCode.contains("260")) {
567                String[] subField = fieldLine.split("\\$");
568                String placeOfPublication = "";
569                String publisher = "";
570                String yearOfPublication = "";
571                xmlString.append("<publicationdetails>\n");
572                for (int i = 0; i < subField.length; i++) {
573                    String subFieldCode = String.valueOf(subField[i].charAt(0));
574
575                    if (subFieldCode != null && subFieldCode != "" && subFieldCode.equalsIgnoreCase("a")) {
576                        placeOfPublication = subField[i].substring(1, subField[i].length());
577                        xmlString.append("<placeofpublication><![CDATA["+placeOfPublication.trim()+"]]></placeofpublication>\n");
578                        emptyFlag = true;
579                    }
580
581                    if (subFieldCode != null && subFieldCode != "" && subFieldCode.equalsIgnoreCase("b")) {
582                        publisher = subField[i].substring(1, subField[i].length());
583                        xmlString.append("<publisher><![CDATA["+publisher.trim()+"]]></publisher>\n");
584                        emptyFlag = true;
585                    }
586
587                    if (subFieldCode != null && subFieldCode != "" && subFieldCode.equalsIgnoreCase("c")) {
588                        yearOfPublication = subField[i].substring(1, subField[i].length());
589                        xmlString.append("<yearofpublication><![CDATA["+yearOfPublication.trim()+"]]></yearofpublication>\n");
590                        emptyFlag = true;
591                    }
592                }
593                xmlString.append("</publicationdetails>\n");
594            } else if (fieldCode.contains("490")) {
595                String[] subField = fieldLine.split("\\$");
596                for (int i = 0; i < subField.length; i++) {
597                    String subFieldCode = String.valueOf(subField[i].charAt(0));
598                    if (subFieldCode != null && subFieldCode != "" && subFieldCode.equalsIgnoreCase("a")) {
599                        String series = subField[1].substring(1, subField[1].length());
600                        xmlString.append("<seriesstatement><![CDATA["+series.replaceAll("&", "&amp;").trim()+"]]></seriesstatement>\n");
601                        emptyFlag = true;
602                    }
603                }
604            } else if (fieldCode.contains("960")) {
605                String[] subField = fieldLine.split("\\$");
606                String accountNumber = "";
607                String location = "";
608                xmlString.append("<funddetails>\n");
609                for (int i = 0; i < subField.length; i++) {
610                    String subFieldCode = String.valueOf(subField[i].charAt(0));
611
612                    if (subFieldCode != null && subFieldCode != "" && subFieldCode.equalsIgnoreCase("a")) {
613                        accountNumber = subField[i].substring(1, subField[i].length());
614                        HashMap<String, String> map = fundCodesForMarcXMLTags.get(accountNumber.trim()) != null?(HashMap<String, String>)fundCodesForMarcXMLTags.get(accountNumber.trim()):null;
615                        
616                        String account="";
617                        String fundCode="";
618                        if(map != null){
619                            for (Iterator key = map.keySet().iterator(); key.hasNext();) {
620                                 account = (String)key.next();
621                                 fundCode = (String)map.get(account);
622                            }
623                        }
624                      
625                        
626                        xmlString.append("<accountno>"+account+"</accountno>\n");
627                        xmlString.append("<objectcode>"+fundCode+"</objectcode>\n");
628                        emptyFlag = true;
629                    }
630
631                    if (subFieldCode != null && subFieldCode != "" && subFieldCode.equalsIgnoreCase("h")) {
632                        location = subField[i].substring(1, subField[i].length());
633                        xmlString.append("<location><![CDATA["+location.trim()+"]]></location>\n");
634                        emptyFlag = true;
635                    }
636                }
637                xmlString.append("</funddetails>\n");
638            } else if (fieldCode.contains("961")) {
639                String[] subField = fieldLine.split("\\$");
640                String libraryNote = "";
641                for (int i = 0; i < subField.length; i++) {
642                    String subFieldCode = String.valueOf(subField[i].charAt(0));
643                    if (subFieldCode != null && subFieldCode != "" && subFieldCode.equalsIgnoreCase("d")) {
644                        libraryNote = subField[1].substring(1, subField[1].length());
645                        xmlString.append("<librarynote><![CDATA["+libraryNote.trim()+"]]></librarynote>\n");
646                        emptyFlag = true;
647                    }
648                }
649            } else if (fieldCode.contains("980")) {
650                String[] subField = fieldLine.split("\\$");
651                String listPrice = "";
652                String quantity = "";
653                xmlString.append("<quantitydetails>\n");
654                for (int i = 0; i < subField.length; i++) {
655                    String subFieldCode = String.valueOf(subField[i].charAt(0));
656                    if (subFieldCode != null && subFieldCode != "" && subFieldCode.equalsIgnoreCase("b")) {
657                        listPrice = subField[i].substring(1, subField[i].length());
658                        xmlString.append("<listprice><![CDATA["+listPrice.trim()+"]]></listprice>\n");
659                        emptyFlag = true;
660                    }
661                    if (subFieldCode != null && subFieldCode != "" && subFieldCode.equalsIgnoreCase("q")) {
662                        quantity = subField[i].substring(1, subField[i].length());
663                        xmlString.append("<quantity><![CDATA["+quantity.trim()+"]]></quantity>\n");
664                        emptyFlag = true;
665                    }
666                }
667                xmlString.append("</quantitydetails>\n");
668
669            } else if (fieldCode.contains("982")) {
670                String[] subField = fieldLine.split("\\$");
671                String ybp = "";
672                String binding = "";
673                String initials = "";
674                xmlString.append("<transactiondata1>\n");
675                for (int i = 0; i < subField.length; i++) {
676                    String subFieldCode = String.valueOf(subField[i].charAt(0));
677                    if (subFieldCode != null && subFieldCode != "" && subFieldCode.equalsIgnoreCase("a")) {
678                        ybp = subField[i].substring(1, subField[i].length());
679                        xmlString.append("<YBP><![CDATA["+ybp.trim()+"]]></YBP>\n");
680                        emptyFlag = true;
681                    }
682                    if (subFieldCode != null && subFieldCode != "" && subFieldCode.equalsIgnoreCase("b")) {
683                        xmlString.append("<subAccountNumber></subAccountNumber>\n");
684                        emptyFlag = true;
685                    }
686                    if (subFieldCode != null && subFieldCode != "" && subFieldCode.equalsIgnoreCase("d")) {
687                        binding = subField[i].substring(1, subField[i].length());
688                        xmlString.append("<binding><![CDATA["+binding.trim()+"]]></binding>\n");
689                        emptyFlag = true;
690                    }
691                    if (subFieldCode != null && subFieldCode != "" && subFieldCode.equalsIgnoreCase("f")) {
692                        initials = subField[i].substring(1, subField[i].length());
693                        xmlString.append("<initials><![CDATA["+initials.trim()+"]]></initials>\n");
694                        xmlString.append("<deliverytoname><![CDATA["+deliverToName.get(initials.trim())+"]]></deliverytoname>\n");
695                        emptyFlag = true;
696                    }
697                }
698                xmlString.append("</transactiondata1>\n");
699
700            } else if (fieldCode.contains("984")) {
701
702                String[] subField = fieldLine.split("\\$");
703                String orderDate = "";
704                String vendorCode = "";
705
706                xmlString.append("<vendor>\n");
707                for (int i = 0; i < subField.length; i++) {
708                    String subFieldCode = String.valueOf(subField[i].charAt(0));
709
710                    if (subFieldCode != null && subFieldCode != "" && subFieldCode.equalsIgnoreCase("a")) {
711                        orderDate = subField[i].substring(1, subField[i].length());
712                        xmlString.append("<dateOrdered><![CDATA["+orderDate.trim()+"]]></dateOrdered>\n");
713                        emptyFlag = true;
714                    }
715
716                    if (subFieldCode != null && subFieldCode != "" && subFieldCode.equalsIgnoreCase("c")) {
717                        vendorCode = subField[i].substring(1, subField[i].length());
718                        xmlString.append("<vendorcode>12106-0</vendorcode>\n");
719                        emptyFlag = true;
720                    }
721                }
722                xmlString.append("</vendor>\n");
723            } else if (fieldCode.contains("987")) {
724                String[] subField = fieldLine.split("\\$");
725                String ybpuid = "";
726                for (int i = 0; i < subField.length; i++) {
727                    String subFieldCode = String.valueOf(subField[i].charAt(0));
728                    if (subFieldCode != null && subFieldCode != "" && subFieldCode.equalsIgnoreCase("a")) {
729                        ybpuid = subField[1].substring(1, subField[1].length());
730                        xmlString.append("<ybpuid><![CDATA["+ybpuid.trim()+"]]></ybpuid>\n");
731                        emptyFlag = true;
732                    }
733                }
734            } else if (fieldCode.contains("993")) {
735                String[] subField = fieldLine.split("\\$");
736                String volumeNumber = "";
737                for (int i = 0; i < subField.length; i++) {
738                    String subFieldCode = String.valueOf(subField[i].charAt(0));
739                    if (subFieldCode != null && subFieldCode != "" && subFieldCode.equalsIgnoreCase("a")) {
740                        volumeNumber = subField[1].substring(1, subField[1].length());
741                        xmlString.append("<volumenumber><![CDATA["+volumeNumber.trim()+"]]></volumenumber>\n");
742                        emptyFlag = true;
743                    }
744                }
745            }
746
747        }
748    }
749        try{
750        if(emptyFlag){    
751            parseDefaultValues();
752            xmlString = getDefaultValues(xmlString);
753        }
754        }catch(Exception e){
755            e.printStackTrace();
756        }
757        if(emptyFlag){
758         xmlString.append("</requisition>\n");
759         emptyFlag = false;
760        }
761        xmlString.append("</requisitions>");
762        return xmlString.toString();
763    }
764    
765    
766    private StringBuilder getDefaultValues(StringBuilder xmlString){
767        xmlString.append("<deliverycampuscode>"+bibInfoBean.getDeliveryCampusCode()+"</deliverycampuscode>\n");
768   //   xmlString.append("<deliverytoname>"+bibInfoBean.getDeliveryToName()+"</deliverytoname>\n");
769        xmlString.append("<deliverybuildingcode>"+bibInfoBean.getDeliveryBuildingCode()+"</deliverybuildingcode>\n");  
770        xmlString.append("<deliverybuildingline1address>"+bibInfoBean.getDeliveryBuildingLine1Address()+"</deliverybuildingline1address>\n");
771        xmlString.append("<deliverybuildingroomnumber>"+bibInfoBean.getDeliveryBuildingRoomNumber()+"</deliverybuildingroomnumber>\n");
772        xmlString.append("<deliverycityname>"+bibInfoBean.getDeliveryCityName()+"</deliverycityname>\n");
773        xmlString.append("<deliverystatecode>"+bibInfoBean.getDeliveryStateCode()+"</deliverystatecode>\n");
774        xmlString.append("<deliverypostalcode>"+bibInfoBean.getDeliveryPostalCode()+"</deliverypostalcode>\n");
775        xmlString.append("<deliverycountrycode>"+bibInfoBean.getDeliveryCountryCode()+"</deliverycountrycode>\n");
776        xmlString.append("<purchaseordertransmissionmethodcode>"+bibInfoBean.getPurchaseOrderTransmissionMethodCode()+"</purchaseordertransmissionmethodcode>\n");
777        xmlString.append("<purchaseordercostsourcecode>"+bibInfoBean.getPurchaseOrderCostSourceCode()+"</purchaseordercostsourcecode>\n");
778        xmlString.append("<requestorpersonname>"+bibInfoBean.getRequestorPersonName()+"</requestorpersonname>\n");
779        xmlString.append("<requestorpersonphonenumber>"+bibInfoBean.getRequestorPersonPhoneNumber()+"</requestorpersonphonenumber>\n");
780        xmlString.append("<requestorpersonemailaddress>"+bibInfoBean.getRequestorPersonEmailAddress()+"</requestorpersonemailaddress>\n");
781        xmlString.append("<requisitiondescription>"+bibInfoBean.getRequisitionDescription()+"</requisitiondescription>\n");
782        xmlString.append("<fundingsource>"+bibInfoBean.getFundingSource()+"</fundingsource>\n");
783        xmlString.append("<financialyear>"+bibInfoBean.getFinancialYear()+"</financialyear>\n");
784        xmlString.append("<uom>"+bibInfoBean.getUom()+"</uom>\n");
785        xmlString.append("<chart>"+bibInfoBean.getChart()+"</chart>\n");
786   //   xmlString.append("<objectcode>"+bibInfoBean.getObjectCode()+"</objectcode>\n");
787        xmlString.append("<percent>"+bibInfoBean.getPercent()+"</percent>\n");
788        xmlString.append("<chartofaccountscode>"+bibInfoBean.getChartOfAccountsCode()+"</chartofaccountscode>\n");
789        xmlString.append("<organizationcode>"+bibInfoBean.getOrganizationCode()+"</organizationcode>\n");
790        xmlString.append("<documentfundingsourcecode>"+bibInfoBean.getDocumentFundingSourceCode()+"</documentfundingsourcecode>\n");
791        xmlString.append("<usetaxindicator>"+bibInfoBean.isUseTaxIndicator()+"</usetaxindicator>\n");
792        xmlString.append("<deliverybuildingotherindicator>"+bibInfoBean.isDeliveryBuildingOtherIndicator()+"</deliverybuildingotherindicator>\n");
793        xmlString.append("<organizationautomaticpurchaseorderlimit>"+bibInfoBean.getOrganizationAutomaticPurchaseOrderLimit()+"</organizationautomaticpurchaseorderlimit>\n");
794        xmlString.append("<purchaseorderautomaticindicator>"+bibInfoBean.isPurchaseOrderAutomaticIndicator()+"</purchaseorderautomaticindicator>\n");
795        xmlString.append("<receivingdocumentrequiredindicator>"+bibInfoBean.isReceivingDocumentRequiredIndicator()+"</receivingdocumentrequiredindicator>\n");
796        xmlString.append("<paymentrequestpositiveapprovalindicator>"+bibInfoBean.isPaymentRequestPositiveApprovalIndicator()+"</paymentrequestpositiveapprovalindicator>\n");
797        xmlString.append("<itemtypecode>"+bibInfoBean.getItemTypeCode()+"</itemtypecode>\n");  
798        xmlString.append("<billingname>"+bibInfoBean.getBillingName()+"</billingname>\n");  
799        xmlString.append("<billingline1address>"+bibInfoBean.getBillingLine1Address()+"</billingline1address>\n");  
800        xmlString.append("<billingcityname>"+bibInfoBean.getBillingCityName()+"</billingcityname>\n");  
801        xmlString.append("<billingstatecode>"+bibInfoBean.getBillingStateCode()+"</billingstatecode>\n");  
802        xmlString.append("<billingpostalcode>"+bibInfoBean.getBillingPostalCode()+"</billingpostalcode>\n");  
803        xmlString.append("<billingcountrycode>"+bibInfoBean.getBillingCountryCode()+"</billingcountrycode>\n");  
804        xmlString.append("<billingphonenumber>"+bibInfoBean.getBillingPhoneNumber()+"</billingphonenumber>\n");
805        xmlString.append("<acquisitionunitvendoraccount>"+bibInfoBean.getVendorCustomerNumber()+"</acquisitionunitvendoraccount>\n");
806        return xmlString;
807    }
808
809    
810    public String getFailureRawData(String rawData,List<List> bibinfoFailure) throws Exception{
811        StringBuilder failureBuilder = new StringBuilder();
812         for(int failure=0;failure<bibinfoFailure.size();failure++){
813            BibInfoBean bibBean = (BibInfoBean)bibinfoFailure.get(failure);
814            String leader = bibBean.getLeader();
815            String ybpUid=bibBean.getYbpuid();
816            StringTokenizer field = new StringTokenizer(rawData, "=");
817            int fromIndex = 0;
818            int toIndex =0;
819            String rawdata = "";
820            while (field.hasMoreTokens()) {
821            
822                String fieldLine = field.nextToken();
823                if(!fieldLine.equalsIgnoreCase("\n")){
824                String fieldCode = fieldLine.substring(0, 4);
825                if (fieldCode.contains("LDR")) {
826                    if(fieldLine.contains(leader)){
827                      fromIndex = rawData.indexOf(fieldLine);
828                    }
829                }
830                if (fieldCode.contains("987")) {
831                    if(fieldLine.contains(ybpUid)){
832                    toIndex = rawData.indexOf(fieldLine);
833                    rawdata = rawData.substring(fromIndex,toIndex);
834                    failureBuilder.append(rawdata+fieldLine+"\nFailure Information :::"+bibBean.getFailure()+"\n\n");
835                }
836                }
837            
838           }
839            }
840        }
841        
842        return failureBuilder.toString();
843    }
844    
845    
846}