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}