001package org.kuali.ole.describe.bo;
002
003import org.apache.commons.lang.StringUtils;
004import org.jfree.util.Log;
005import org.kuali.ole.UnQualifiedDublinRecordHandler;
006import org.kuali.ole.describe.form.EditorForm;
007import org.kuali.ole.docstore.model.enums.DocFormat;
008import org.kuali.ole.docstore.model.xmlpojo.work.bib.dublin.DCValue;
009import org.kuali.ole.docstore.model.xmlpojo.work.bib.dublin.WorkBibDublinRecord;
010import org.kuali.ole.docstore.model.xmlpojo.work.bib.dublin.unqualified.*;
011import org.kuali.ole.pojo.dublin.unqualified.UnQualifiedDublinRecord;
012import org.kuali.rice.krad.web.form.UifFormBase;
013
014import java.util.ArrayList;
015import java.util.List;
016
017/**
018 * DublinEditorFormDataHandler is the data handler class for Dublin Editor
019 */
020public class WorkDublinEditorFormDataHandler {
021    /**
022     * This method returns response Xml from the docStore for Duplin Record, This method will ingest new record to docstore if uuid is null, else it will update existing record.
023     * the toXml method in UnQualifiedDublinRecordHandler will convert the unQualifiedDublinRecord in to responseXml.
024     *
025     * @param uifFormBase
026     * @param uuid
027     * @return content
028     */
029    public String buildDublinRecordForDocStore(UifFormBase uifFormBase, String uuid) {
030
031        String content = "";
032        EditorForm dublinEditorForm = (EditorForm) uifFormBase;
033        if (dublinEditorForm.getDocFormat().equals(DocFormat.DUBLIN_UNQUALIFIED.getCode())) {
034            UnQualifiedDublinRecord unQualifiedDublinRecord = new UnQualifiedDublinRecord();
035            if (uuid != null && !uuid.trim().equals("")) {
036                unQualifiedDublinRecord.setListRecords(buildDublinDCValuesForEdit(dublinEditorForm));
037            } else {
038                unQualifiedDublinRecord.setListRecords(buildDublinDCValues(dublinEditorForm.getDublinFieldList()));
039            }
040            dublinEditorForm.setTitle(buildDublinUnqTitleField(dublinEditorForm, unQualifiedDublinRecord));
041            content = new UnQualifiedDublinRecordHandler().toXml(unQualifiedDublinRecord);
042        } else if (dublinEditorForm.getDocFormat().equals(DocFormat.DUBLIN_CORE.getCode())) {
043            //System.out.println("Enter Dublin Save");
044            Log.info("Enter Dublin Save");
045            //TODO: code for building content.
046            //            WorkBibDublinRecord workBibDublinRecord = new WorkBibDublinRecord();
047            //            List<DCValue> dcValues = new ArrayList<DCValue>();
048            //            DCValue dcValue = new DCValue();
049            //            dcValue.setQualifier("contributor");
050            //            dcValue.setElement("contributor");
051            //            dcValue.setValue("contributor");
052            //            dcValues.add(dcValue);
053            //            workBibDublinRecord.setDcValues(dcValues);
054            //            content = new QualifiedDublinRecordHandler().toXml(workBibDublinRecord);
055        }
056        return content;
057    }
058
059    /**
060     * This method returns List of DublinDcValue records,
061     * In this method each record contains a metadata with oaiDcDocList,
062     * each oaiDcDocList contains list of oaiDcDoc with tagName and value.
063     *
064     * @param dublinFields
065     * @return listRecords
066     */
067    private ListRecords buildDublinDCValues(List<WorkDublinEditorField> dublinFields) {
068        ListRecords listRecords = new ListRecords();
069        Record record = new Record();
070        MetaData metaData = new MetaData();
071        OaiDcDoc oaiDcDoc = new OaiDcDoc();
072        List<OaiDcDoc> oaiDcDocList = new ArrayList<OaiDcDoc>();
073        for (int i = 0; i < dublinFields.size(); i++) {
074            if (!dublinFields.get(i).getElement().equalsIgnoreCase("default")) {
075                oaiDcDoc.put(dublinFields.get(i).getElement(), dublinFields.get(i).getValue());
076            }
077        }
078        oaiDcDocList.add(oaiDcDoc);
079        metaData.setOaiDcDocs(oaiDcDocList);
080        record.setMetadata(metaData);
081        listRecords.addRecord(record);
082        return listRecords;
083    }
084
085    private ListRecords buildDublinDCValues1(List<WorkDublinEditorField> dublinFields) {
086        ListRecords listRecords = new ListRecords();
087        Record record = new Record();
088        MetaData metaData = new MetaData();
089        OaiDcDoc oaiDcDoc = new OaiDcDoc();
090        List<OaiDcDoc> oaiDcDocList = new ArrayList<OaiDcDoc>();
091        for (int i = 0; i < dublinFields.size(); i++) {
092            if (!dublinFields.get(i).getElement().equalsIgnoreCase("default")) {
093                oaiDcDoc.put(dublinFields.get(i).getElement(), dublinFields.get(i).getValue());
094            }
095        }
096        oaiDcDocList.add(oaiDcDoc);
097        metaData.setOaiDcDocs(oaiDcDocList);
098        record.setMetadata(metaData);
099        listRecords.addRecord(record);
100        return listRecords;
101    }
102
103    /**
104     * This method returns List of  DublinEditorField,
105     * each dublinEditorField object sets the tagName and value got from unQualifiedDublinRecord.
106     *
107     * @param unQualifiedDublinRecord
108     * @return dublinEditorFieldList
109     */
110
111    public List<WorkDublinEditorField> buildDublinUnqEditorFields(EditorForm editorForm, UnQualifiedDublinRecord unQualifiedDublinRecord) {
112        ListRecords listRecords = unQualifiedDublinRecord.getListRecords();
113        List<Tag> tagList = listRecords.getRecords().get(0).getMetadata().getOaiDcDocs().get(0).getAllTags();
114        //   List<WorkDublinEditorField> dublinEditorFieldList = editorForm.getDublinFieldList();
115        List<WorkDublinEditorField> dublinEditorFieldList = new ArrayList<WorkDublinEditorField>();
116        for (int i = 0; i < tagList.size(); i++) {
117            WorkDublinEditorField dublinEditorField = new WorkDublinEditorField();
118            dublinEditorField.setElement(tagList.get(i).getName());
119            dublinEditorField.setValue(tagList.get(i).getValue());
120            dublinEditorFieldList.add(dublinEditorField);
121        }
122
123        return dublinEditorFieldList;
124    }
125
126    public String buildDublinUnqTitleField(EditorForm editorForm, UnQualifiedDublinRecord unQualifiedDublinRecord) {
127
128        String title = "";
129        String author = "";
130        ListRecords listRecords = unQualifiedDublinRecord.getListRecords();
131        List<Tag> tagList = listRecords.getRecords().get(0).getMetadata().getOaiDcDocs().get(0).getAllTags();
132        List<WorkDublinEditorField> dublinEditorFieldList = new ArrayList<WorkDublinEditorField>();
133        for (Tag tag : tagList) {
134            if (tag.getName().contains("title")) {
135                if (!(StringUtils.isBlank(tag.getValue()))) {
136                    title = tag.getValue();
137                }
138            }
139
140            if (tag.getName().contains("creator")) {
141                if (!StringUtils.isBlank(tag.getValue())) {
142                    author = tag.getValue();
143                }
144            }
145        }
146        return title + " / " + author;
147
148    }
149
150    public List<WorkDublinEditorField> buildDublinEditorFields(EditorForm editorForm, WorkBibDublinRecord workBibDublinRecord) {
151        List<DCValue> listRecords = workBibDublinRecord.getDcValues();
152        List<WorkDublinEditorField> dublinEditorFieldList = editorForm.getDublinFieldList();
153        for (int i = 0; i < listRecords.size(); i++) {
154            WorkDublinEditorField dublinEditorField = new WorkDublinEditorField();
155            dublinEditorField.setElement(listRecords.get(i).getElement());
156            dublinEditorField.setValue(listRecords.get(i).getValue());
157            dublinEditorFieldList.add(dublinEditorField);
158        }
159        return dublinEditorFieldList;
160    }
161
162    /**
163     * This method returns updated ListRecords to be set in UnQualifiedDublinRecord  to update the existing docStore records.
164     * In this method each record contains updated metadata with oaiDcDocList,
165     * each oaiDcDocList contains updated list of oaiDcDoc with tagName and value.
166     *
167     * @param dublinEditorForm
168     * @return listRecords
169     */
170    private ListRecords buildDublinDCValuesForEdit(EditorForm dublinEditorForm) {
171        ListRecords listRecords = new ListRecords();
172        String element = "";
173        String value = "";
174        Record record = new Record();
175        List<String> elementList = new ArrayList<String>();
176        MetaData metaData = new MetaData();
177        OaiDcDoc oaiDcDoc = new OaiDcDoc();
178        List<OaiDcDoc> oaiDcDocList = new ArrayList<OaiDcDoc>();
179        List<WorkDublinEditorField> newElementList = dublinEditorForm.getDublinFieldList();
180        List<WorkDublinEditorField> existingElementList = dublinEditorForm.getExistingDublinFieldList();
181        for (int i = 0; i < newElementList.size(); i++) {
182            if (!newElementList.get(i).getElement().equalsIgnoreCase("default")) {
183                element = newElementList.get(i).getElement();
184                value = newElementList.get(i).getValue();
185                if (!elementList.contains(element)) {
186                    elementList.add(element);
187                    oaiDcDoc.put(element, value);
188                }
189
190            }
191        }
192//        for (int i = 0; i < existingElementList.size(); i++) {
193//            if (!existingElementList.get(i).getElement().equalsIgnoreCase("default")) {
194//                oaiDcDoc.put(existingElementList.get(i).getElement(), existingElementList.get(i).getValue());
195//            }
196//        }
197        oaiDcDocList.add(oaiDcDoc);
198        metaData.setOaiDcDocs(oaiDcDocList);
199        record.setMetadata(metaData);
200        listRecords.addRecord(record);
201        return listRecords;
202    }
203
204}