/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package edu.harvard.iq.dataverse; import edu.harvard.iq.dataverse.util.MarkupChecker; import edu.harvard.iq.dataverse.util.StringUtil; import java.io.Serializable; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.ejb.EJB; import javax.faces.view.ViewScoped; import javax.inject.Named; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; /** * * @author skraffmiller */ @ViewScoped public class DatasetVersionUI implements Serializable { @EJB DataverseServiceBean dataverseService; @PersistenceContext(unitName = "VDCNet-ejbPU") private EntityManager em; public DatasetVersionUI() { } private Map<MetadataBlock, List<DatasetField>> metadataBlocksForView = new HashMap(); private Map<MetadataBlock, List<DatasetField>> metadataBlocksForEdit = new HashMap(); public Map<MetadataBlock, List<DatasetField>> getMetadataBlocksForView() { return metadataBlocksForView; } public void setMetadataBlocksForView(Map<MetadataBlock, List<DatasetField>> metadataBlocksForView) { this.metadataBlocksForView = metadataBlocksForView; } public Map<MetadataBlock, List<DatasetField>> getMetadataBlocksForEdit() { return metadataBlocksForEdit; } public void setMetadataBlocksForEdit(Map<MetadataBlock, List<DatasetField>> metadataBlocksForEdit) { this.metadataBlocksForEdit = metadataBlocksForEdit; } public DatasetVersionUI initDatasetVersionUI(DatasetVersion datasetVersion, boolean createBlanks) { /*takes in the values of a dataset version and apportions them into lists for viewing and editng in the dataset page. */ setDatasetVersion(datasetVersion); //this.setDatasetAuthors(new ArrayList()); this.setDatasetRelPublications(new ArrayList()); // loop through vaues to get fields for view mode for (DatasetField dsf : datasetVersion.getDatasetFields()) { //Special Handling for various fields displayed above tabs in dataset page view. if (dsf.getDatasetFieldType().getName().equals(DatasetFieldConstant.title)) { setTitle(dsf); } else if (dsf.getDatasetFieldType().getName().equals(DatasetFieldConstant.description)) { setDescription(dsf); String descriptionString = ""; if(dsf.getDatasetFieldCompoundValues() != null && dsf.getDatasetFieldCompoundValues().get(0) != null){ DatasetFieldCompoundValue descriptionValue = dsf.getDatasetFieldCompoundValues().get(0); for (DatasetField subField : descriptionValue.getChildDatasetFields()) { if (subField.getDatasetFieldType().getName().equals(DatasetFieldConstant.descriptionText) && !subField.isEmptyForDisplay()) { descriptionString = subField.getValue(); } } } setDescriptionDisplay(MarkupChecker.sanitizeBasicHTML(descriptionString) ); } else if (dsf.getDatasetFieldType().getName().equals(DatasetFieldConstant.keyword)) { setKeyword(dsf); String keywordString = ""; for (DatasetFieldCompoundValue keywordValue : dsf.getDatasetFieldCompoundValues()) { for (DatasetField subField : keywordValue.getChildDatasetFields()) { if (subField.getDatasetFieldType().getName().equals(DatasetFieldConstant.keywordValue) && !subField.isEmptyForDisplay()) { if (keywordString.isEmpty()){ keywordString = subField.getValue(); } else { keywordString += ", " + subField.getValue(); } } } } setKeywordDisplay(keywordString); } else if (dsf.getDatasetFieldType().getName().equals(DatasetFieldConstant.subject) && !dsf.isEmptyForDisplay()) { setSubject(dsf); } else if (dsf.getDatasetFieldType().getName().equals(DatasetFieldConstant.notesText) && !dsf.isEmptyForDisplay()) { this.setNotes(dsf); } else if (dsf.getDatasetFieldType().getName().equals(DatasetFieldConstant.publication)) { //Special handling for Related Publications // Treated as below the tabs for editing, but must get first value for display above tabs if (this.datasetRelPublications.isEmpty()) { for (DatasetFieldCompoundValue relPubVal : dsf.getDatasetFieldCompoundValues()) { DatasetRelPublication datasetRelPublication = new DatasetRelPublication(); datasetRelPublication.setTitle(dsf.getDatasetFieldType().getTitle()); datasetRelPublication.setDescription(dsf.getDatasetFieldType().getDescription()); for (DatasetField subField : relPubVal.getChildDatasetFields()) { if (subField.getDatasetFieldType().getName().equals(DatasetFieldConstant.publicationCitation)) { datasetRelPublication.setText(subField.getValue()); } if (subField.getDatasetFieldType().getName().equals(DatasetFieldConstant.publicationIDNumber)) { datasetRelPublication.setIdNumber(subField.getValue()); } if (subField.getDatasetFieldType().getName().equals(DatasetFieldConstant.publicationIDType)) { datasetRelPublication.setIdType(subField.getValue()); } if (subField.getDatasetFieldType().getName().equals(DatasetFieldConstant.publicationURL)) { datasetRelPublication.setUrl(subField.getValue()); } } this.getDatasetRelPublications().add(datasetRelPublication); } } } } datasetVersion.setDatasetFields(initDatasetFields(createBlanks)); setMetadataValueBlocks(datasetVersion); return this; } private Dataset getDataset() { return this.datasetVersion.getDataset(); } private DatasetVersion datasetVersion; public DatasetVersion getDatasetVersion() { return datasetVersion; } public void setDatasetVersion(DatasetVersion datasetVersion) { this.datasetVersion = datasetVersion; } private DatasetField title; private DatasetField description; private DatasetField keyword; private DatasetField subject; private DatasetField notes; private String keywordDisplay; public String getKeywordDisplay() { return keywordDisplay; } public void setKeywordDisplay(String keywordDisplay) { this.keywordDisplay = keywordDisplay; } private String descriptionDisplay; public String getDescriptionDisplay() { return descriptionDisplay; } public void setDescriptionDisplay(String descriptionDisplay) { this.descriptionDisplay = descriptionDisplay; } private List<DatasetRelPublication> datasetRelPublications; public DatasetField getTitle() { return title; } public void setTitle(DatasetField title) { this.title = title; } public DatasetField getDescription() { return description; } public void setDescription(DatasetField description) { this.description = description; } public DatasetField getKeyword() { return keyword; } public void setKeyword(DatasetField keyword) { this.keyword = keyword; } public DatasetField getSubject() { return subject; } public void setSubject(DatasetField subject) { this.subject = subject; } public DatasetField getNotes() { return notes; } public void setNotes(DatasetField notes) { this.notes = notes; } public List<DatasetRelPublication> getDatasetRelPublications() { return datasetRelPublications; } public void setDatasetRelPublications(List<DatasetRelPublication> datasetRelPublications) { this.datasetRelPublications = datasetRelPublications; } public String getRelPublicationCitation() { if (this.datasetRelPublications != null && !this.datasetRelPublications.isEmpty()) { return this.getDatasetRelPublications().get(0).getText(); } else { return ""; } } public String getRelPublicationId() { if (!this.datasetRelPublications.isEmpty()) { if (!(this.getDatasetRelPublications().get(0).getIdNumber() == null) && !this.getDatasetRelPublications().get(0).getIdNumber().isEmpty()){ return this.getDatasetRelPublications().get(0).getIdType() + ": " + this.getDatasetRelPublications().get(0).getIdNumber(); } else { return ""; } } else { return ""; } } public String getRelPublicationUrl() { if (!this.datasetRelPublications.isEmpty()) { return this.getDatasetRelPublications().get(0).getUrl(); } else { return ""; } } public String getUNF() { //todo get UNF to calculate and display here. return ""; } //TODO - make sure getCitation works private String getYearForCitation(String dateString) { //get date to first dash only if (dateString.indexOf("-") > -1) { return dateString.substring(0, dateString.indexOf("-")); } return dateString; } public String getReleaseDate() { if (datasetVersion.getReleaseTime() != null) { Date relDate = datasetVersion.getReleaseTime(); Calendar calendar = Calendar.getInstance(); calendar.setTime(relDate); return Integer.toString(calendar.get(Calendar.YEAR)); } return ""; } public String getCreateDate() { if (datasetVersion.getCreateTime() != null) { Date relDate = datasetVersion.getCreateTime(); Calendar calendar = Calendar.getInstance(); calendar.setTime(relDate); return Integer.toString(calendar.get(Calendar.YEAR)); } return ""; } public String getProductionDate() { for (DatasetField dsfv : datasetVersion.getDatasetFields()) { if (dsfv.getDatasetFieldType().getName().equals(DatasetFieldConstant.productionDate)) { return dsfv.getValue(); } } return ""; } public String getDistributionDate() { for (DatasetField dsfv : datasetVersion.getDatasetFields()) { if (dsfv.getDatasetFieldType().getName().equals(DatasetFieldConstant.distributionDate)) { return dsfv.getValue(); } } return ""; } // TODO: clean up init methods and get them to work, cascading all the way down. // right now, only work for one level of compound objects private DatasetField initDatasetField(DatasetField dsf, boolean createBlanks) { if (dsf.getDatasetFieldType().isCompound()) { for (DatasetFieldCompoundValue cv : dsf.getDatasetFieldCompoundValues()) { // for each compound value; check the datasetfieldTypes associated with its type for (DatasetFieldType dsfType : dsf.getDatasetFieldType().getChildDatasetFieldTypes()) { boolean add = createBlanks; for (DatasetField subfield : cv.getChildDatasetFields()) { if (dsfType.equals(subfield.getDatasetFieldType())) { add = false; break; } } if (add) { cv.getChildDatasetFields().add(DatasetField.createNewEmptyChildDatasetField(dsfType, cv)); } } sortDatasetFields(cv.getChildDatasetFields()); } } return dsf; } private List<DatasetField> initDatasetFields(boolean createBlanks) { //retList - Return List of values List<DatasetField> retList = new ArrayList(); for (DatasetField dsf : this.datasetVersion.getDatasetFields()) { retList.add(initDatasetField(dsf, createBlanks)); } //Test to see that there are values for // all fields in this dataset via metadata blocks //only add if not added above for (MetadataBlock mdb : this.getDataset().getOwner().getMetadataBlocks()) { for (DatasetFieldType dsfType : mdb.getDatasetFieldTypes()) { if (!dsfType.isSubField()) { boolean add = createBlanks; //don't add if already added as a val for (DatasetField dsf : retList) { if (dsfType.equals(dsf.getDatasetFieldType())) { add = false; break; } } if (add) { retList.add(DatasetField.createNewEmptyDatasetField(dsfType, this.datasetVersion)); } } } } //sort via display order on dataset field Collections.sort(retList, new Comparator<DatasetField>() { public int compare(DatasetField d1, DatasetField d2) { int a = d1.getDatasetFieldType().getDisplayOrder(); int b = d2.getDatasetFieldType().getDisplayOrder(); return Integer.valueOf(a).compareTo(Integer.valueOf(b)); } }); return sortDatasetFields(retList); } private List<DatasetField> sortDatasetFields (List<DatasetField> dsfList) { Collections.sort(dsfList, new Comparator<DatasetField>() { public int compare(DatasetField d1, DatasetField d2) { int a = d1.getDatasetFieldType().getDisplayOrder(); int b = d2.getDatasetFieldType().getDisplayOrder(); return Integer.valueOf(a).compareTo(Integer.valueOf(b)); } }); return dsfList; } public void setMetadataValueBlocks(DatasetVersion datasetVersion) { //TODO: A lot of clean up on the logic of this method metadataBlocksForView.clear(); metadataBlocksForEdit.clear(); Long dvIdForInputLevel = datasetVersion.getDataset().getOwner().getId(); if (!dataverseService.find(dvIdForInputLevel).isMetadataBlockRoot()){ dvIdForInputLevel = dataverseService.find(dvIdForInputLevel).getMetadataRootId(); } List<DatasetField> filledInFields = this.datasetVersion.getDatasetFields(); List <MetadataBlock> actualMDB = new ArrayList(); actualMDB.addAll(this.datasetVersion.getDataset().getOwner().getMetadataBlocks()); for (DatasetField dsfv : filledInFields) { if (!dsfv.isEmptyForDisplay()) { MetadataBlock mdbTest = dsfv.getDatasetFieldType().getMetadataBlock(); if (!actualMDB.contains(mdbTest)) { actualMDB.add(mdbTest); } } } for (MetadataBlock mdb : actualMDB) { mdb.setEmpty(true); mdb.setHasRequired(false); List<DatasetField> datasetFieldsForView = new ArrayList(); List<DatasetField> datasetFieldsForEdit = new ArrayList(); for (DatasetField dsf : datasetVersion.getDatasetFields()) { if (dsf.getDatasetFieldType().getMetadataBlock().equals(mdb)) { datasetFieldsForEdit.add(dsf); if (dsf.isRequired()) { mdb.setHasRequired(true); } if (!dsf.isEmptyForDisplay()) { mdb.setEmpty(false); datasetFieldsForView.add(dsf); } } } if (!datasetFieldsForView.isEmpty()) { metadataBlocksForView.put(mdb, datasetFieldsForView); } if (!datasetFieldsForEdit.isEmpty()) { metadataBlocksForEdit.put(mdb, datasetFieldsForEdit); } } } }