001package org.kuali.ole; 002 003import com.thoughtworks.xstream.XStream; 004import org.kuali.ole.docstore.model.xmlpojo.work.bib.marc.ControlField; 005import org.kuali.ole.docstore.model.xmlpojo.work.bib.marc.DataField; 006import org.kuali.ole.docstore.model.xmlpojo.work.bib.marc.LeaderTag; 007import org.kuali.ole.docstore.model.xmlpojo.work.bib.marc.SubField; 008import org.kuali.ole.docstore.model.xstream.work.bib.marc.ControlFieldConverter; 009import org.kuali.ole.docstore.model.xstream.work.bib.marc.DataFieldConverter; 010import org.kuali.ole.docstore.model.xstream.work.bib.marc.LeaderConverter; 011import org.kuali.ole.docstore.model.xstream.work.bib.marc.SubFieldConverter; 012import org.kuali.ole.pojo.bib.BibliographicRecord; 013import org.kuali.ole.pojo.bib.Collection; 014 015 016import java.util.*; 017 018 019/** 020 * Created by IntelliJ IDEA. 021 * User: pvsubrah 022 * Date: 4/2/12 023 * Time: 3:57 PM 024 * To change this template use File | Settings | File Templates. 025 */ 026public class BibliographicRecordHandler { 027 private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(BibliographicRecordHandler.class); 028 private Map<String, String> valuesMap = new HashMap<String, String>(); 029 private StringBuilder errBuilder; 030 private static final String ERR_BIB = "Error BIB:: "; 031 private static final String TIME_STAMP = " ::TIME STAMP:: "; 032 private static final String ERR_CAUSE = " ::Error Caused:: "; 033 private static final String lineSeparator = System.getProperty("line.separator"); 034 private int errCnt; 035 private int successCnt; 036 private final static String RECORD = "record"; 037 private final static String CONTROLFIELD = "controlfield"; 038 private final static String DATAFIELD = "datafield"; 039 private final static String SUBFIELD = "subfield"; 040 private final static String CONTROLFIELDS = "controlfields"; 041 private final static String DATAFIELDS = "datafields"; 042 private final static String SUBFIELDS = "subFields"; 043 private final static String LEADER = "leader"; 044 045 public BibliographicRecordHandler() { 046 }// default Constructor 047 048 public BibliographicRecordHandler(StringBuilder errBuilder) { 049 this.errBuilder = errBuilder; 050 } 051 052 /** 053 * Converts given bib record to xml returns null if any error occured 054 * @param bibliographicRecord 055 * @return 056 */ 057 public String generateXML(BibliographicRecord bibliographicRecord) { 058 StringBuffer stringBuffer = new StringBuffer(); 059 try{ 060 stringBuffer.append("<collection xmlns=\"http://www.loc.gov/MARC21/slim\">"); 061 stringBuffer.append("\n"); 062 063 XStream xStream = new XStream(); 064 xStream.alias(LEADER, LeaderTag.class); 065 xStream.alias(RECORD, BibliographicRecord.class); 066 xStream.alias(CONTROLFIELD, ControlField.class); 067 xStream.alias(DATAFIELD, DataField.class); 068 xStream.alias(SUBFIELD, SubField.class); 069 xStream.addImplicitCollection(BibliographicRecord.class, DATAFIELDS, DataField.class); 070 xStream.addImplicitCollection(DataField.class, SUBFIELDS,SubField.class); 071 xStream.addImplicitCollection(BibliographicRecord.class, CONTROLFIELDS,ControlField.class); 072 xStream.registerConverter(new DataFieldConverter()); 073 xStream.registerConverter(new ControlFieldConverter()); 074 xStream.registerConverter(new LeaderConverter()); 075 String xml = xStream.toXML(bibliographicRecord); 076 stringBuffer.append(xml); 077 stringBuffer.append("\n"); 078 stringBuffer.append("</collection>"); 079 successCnt++; 080 } catch (Exception ex) { 081 LOG.error("Error while converting BibliographicRecord to string for Bib Record id:: " + bibliographicRecord.getRecordId(), ex); 082 errBuilder.append(ERR_BIB).append(bibliographicRecord.getRecordId()).append(TIME_STAMP) 083 .append(new Date()).append(ERR_CAUSE).append(ex.getMessage()).append(" ::At:: ").append("generateXML() for mrc").append(lineSeparator); 084 errCnt++; 085 return null; 086 } 087 return stringBuffer.toString(); 088 } 089 090 /** 091 * generates the xml string with all the records under one collection tag 092 * @param bibliographicRecord 093 * @return 094 */ 095 public String generateXML(List<BibliographicRecord> bibliographicRecord) { 096 StringBuffer stringBuffer = new StringBuffer(); 097 //stringBuffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><collection xmlns=\"http://www.loc.gov/MARC21/slim\">"); 098 stringBuffer.append("<collection xmlns=\"http://www.loc.gov/MARC21/slim\">"); 099 for (BibliographicRecord record : bibliographicRecord) { 100 try { 101 if (record != null) { 102 stringBuffer.append(lineSeparator); 103 104 XStream xStream = new XStream(); 105 xStream.alias(LEADER, LeaderTag.class); 106 xStream.alias(RECORD, BibliographicRecord.class); 107 xStream.alias(CONTROLFIELD, ControlField.class); 108 xStream.alias(DATAFIELD, DataField.class); 109 xStream.alias(SUBFIELD, SubField.class); 110 xStream.addImplicitCollection(BibliographicRecord.class, DATAFIELDS, DataField.class); 111 xStream.addImplicitCollection(DataField.class, SUBFIELDS, SubField.class); 112 xStream.addImplicitCollection(BibliographicRecord.class, CONTROLFIELDS, ControlField.class); 113 xStream.registerConverter(new DataFieldConverter()); 114 xStream.registerConverter(new ControlFieldConverter()); 115 xStream.registerConverter(new LeaderConverter()); 116 String xml = xStream.toXML(record); 117 stringBuffer.append(xml); 118 successCnt++; 119 } 120 } catch (Exception ex) { 121 LOG.error("Error while converting BibliographicRecord to string for Bib Record id:: " + record.getRecordId(), ex); 122 errBuilder.append(ERR_BIB).append(record.getRecordId()).append(TIME_STAMP) 123 .append(new Date()).append(ERR_CAUSE).append(ex.getMessage()).append(" ::At:: ").append("generateXML()").append(lineSeparator); 124 errCnt++; 125 } 126 } 127 stringBuffer.append(lineSeparator); 128 stringBuffer.append("</collection>"); 129 return stringBuffer.toString(); 130 } 131 132 public BibliographicRecord getModifiedBibWithout8xxFields(BibliographicRecord bibliographicRecord) { 133 List<DataField> dataFields = new ArrayList<DataField>(); 134 BibliographicRecord newBibliographicRecord = new BibliographicRecord(); 135 newBibliographicRecord.setLeader(bibliographicRecord.getLeader()); 136 newBibliographicRecord.setControlfields(bibliographicRecord.getControlfields()); 137 List<DataField> datafields = bibliographicRecord.getDatafields(); 138 for (Iterator<DataField> iterator1 = datafields.iterator(); iterator1.hasNext(); ) { 139 DataField dataField = iterator1.next(); 140 if (!dataField.getTag().contains("8")) { 141 dataFields.add(dataField); 142 } 143 } 144 newBibliographicRecord.setDatafields(dataFields); 145 146 return newBibliographicRecord; 147 } 148 149 public Collection fromXML(String marcXMLContent) { 150 XStream xStream = new XStream(); 151 xStream.alias("collection", Collection.class); 152 xStream.alias(LEADER, LeaderTag.class); 153 xStream.alias("record", BibliographicRecord.class); 154 xStream.alias("controlfield", ControlField.class); 155 xStream.alias("datafield", DataField.class); 156 xStream.alias("subfield", SubField.class); 157 xStream.addImplicitCollection(BibliographicRecord.class, "datafields", DataField.class); 158 xStream.addImplicitCollection(BibliographicRecord.class, "controlfields", ControlField.class); 159 xStream.addImplicitCollection(Collection.class, "collection"); 160 xStream.registerConverter(new DataFieldConverter()); 161 xStream.registerConverter(new SubFieldConverter()); 162 xStream.registerConverter(new ControlFieldConverter()); 163 xStream.registerConverter(new LeaderConverter()); 164 return (Collection) xStream.fromXML(marcXMLContent); 165 } 166 167 /* public Map<String, String> valuesMapFromXML(String marcXMLContent) { 168 Collection bibliographicRecordCollection = fromXML(marcXMLContent); 169 List<BibliographicRecord> records = bibliographicRecordCollection.getRecords(); 170 for (Iterator<BibliographicRecord> iterator = records.iterator(); iterator.hasNext(); ) { 171 BibliographicRecord record = iterator.next(); 172 valuesMap.put("leader", record.getLeader()); 173 List<ControlField> controlFields = record.getControlfields(); 174 for (Iterator<ControlField> controlFieldIterator = controlFields.iterator(); controlFieldIterator.hasNext(); ) { 175 ControlField controlField = controlFieldIterator.next(); 176 valuesMap.put(controlField.getTag(), controlField.getValue()); 177 } 178 List<DataField> datafields = record.getDatafields(); 179 for (Iterator<DataField> dataFieldIterator = datafields.iterator(); dataFieldIterator.hasNext(); ) { 180 DataField dataField = dataFieldIterator.next(); 181 String tag = dataField.getTag(); 182 List<SubField> subfields = dataField.getSubFields(); 183 for (Iterator<SubField> marcSubFieldIterator = subfields.iterator(); marcSubFieldIterator.hasNext(); ) { 184 SubField subField = marcSubFieldIterator.next(); 185 valuesMap.put(tag + subField.getCode(), subField.getValue()); 186 } 187 } 188 } 189 return valuesMap; 190 }*/ 191 192 193 public String generateXML(Collection bibliographicRecords) { 194 StringBuffer stringBuffer = new StringBuffer(); 195 stringBuffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); 196 stringBuffer.append("\n"); 197 198 XStream xStream = new XStream(); 199 xStream.alias("collection", Collection.class); 200 xStream.alias(LEADER, LeaderTag.class); 201 xStream.alias("record", BibliographicRecord.class); 202 xStream.alias("controlfield", ControlField.class); 203 xStream.alias("datafield", DataField.class); 204 xStream.alias("subfield", SubField.class); 205 xStream.addImplicitCollection(BibliographicRecord.class, "datafields", DataField.class); 206 xStream.addImplicitCollection(BibliographicRecord.class, "controlfields", ControlField.class); 207 xStream.addImplicitCollection(Collection.class, "collection"); 208 xStream.registerConverter(new DataFieldConverter()); 209 xStream.registerConverter(new SubFieldConverter()); 210 xStream.registerConverter(new ControlFieldConverter()); 211 xStream.registerConverter(new LeaderConverter()); 212 String xml = xStream.toXML(bibliographicRecords); 213 stringBuffer.append(xml); 214 stringBuffer.append("\n"); 215 return stringBuffer.toString(); 216 } 217 218 public String generateXMLWithoutCollectionTag(BibliographicRecord bibliographicRecord) { 219 StringBuffer stringBuffer = new StringBuffer(); 220 //stringBuffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><collection xmlns=\"http://www.loc.gov/MARC21/slim\">"); 221 //stringBuffer.append("<collection xmlns=\"http://www.loc.gov/MARC21/slim\">"); 222 //stringBuffer.append("\n"); 223 224 XStream xStream = new XStream(); 225 xStream.alias(RECORD, BibliographicRecord.class); 226 xStream.alias(CONTROLFIELD, ControlField.class); 227 xStream.alias(DATAFIELD, DataField.class); 228 xStream.alias(SUBFIELD, SubField.class); 229 xStream.alias(LEADER, LeaderTag.class); 230 xStream.addImplicitCollection(BibliographicRecord.class, DATAFIELDS,DataField.class); 231 xStream.addImplicitCollection(DataField.class, SUBFIELDS,SubField.class); 232 xStream.addImplicitCollection(BibliographicRecord.class, CONTROLFIELDS,ControlField.class); 233 xStream.registerConverter(new DataFieldConverter()); 234 xStream.registerConverter(new ControlFieldConverter()); 235 xStream.registerConverter(new LeaderConverter()); 236 String xml = xStream.toXML(bibliographicRecord); 237 stringBuffer.append(xml); 238 stringBuffer.append("\n"); 239 // stringBuffer.append("</collection>"); 240 return stringBuffer.toString(); 241 } 242 243 /** 244 * gets the errBuilder value 245 * 246 * @return 247 */ 248 public String getErrBuilder() { 249 return errBuilder.toString(); 250 } 251 252 public int getErrCnt() { 253 return errCnt; 254 } 255 256 public int getSuccessCnt() { 257 return successCnt; 258 } 259 260 261}