Mercurial > hg > LGDataverses
diff src/main/java/edu/harvard/iq/dataverse/Template.java @ 10:a50cf11e5178
Rewrite LGDataverse completely upgrading to dataverse4.0
| author | Zoe Hong <zhong@mpiwg-berlin.mpg.de> |
|---|---|
| date | Tue, 08 Sep 2015 17:00:21 +0200 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/edu/harvard/iq/dataverse/Template.java Tue Sep 08 17:00:21 2015 +0200 @@ -0,0 +1,364 @@ +package edu.harvard.iq.dataverse; + +import java.io.Serializable; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import javax.persistence.Transient; +import javax.validation.constraints.Size; +import org.hibernate.validator.constraints.NotBlank; + +/** + * + * @author skraffmiller + */ +@Entity +public class Template implements Serializable { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + public Template() { + + } + + //Constructor for create + public Template(Dataverse dataverseIn) { + dataverse = dataverseIn; + datasetFields = initDatasetFields(); + initMetadataBlocksForCreate(); + } + + public Long getId() { + return this.id; + } + + @NotBlank(message = "Please add in a name for the dataset template.") + @Size(max = 255, message = "Name must be at most 255 characters.") + @Column( nullable = false ) + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + private Long usageCount; + + public Long getUsageCount() { + return usageCount; + } + + public void setUsageCount(Long usageCount) { + this.usageCount = usageCount; + } + + @Temporal(value = TemporalType.TIMESTAMP) + @Column( nullable = false ) + private Date createTime; + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getCreateDate() { + return new SimpleDateFormat("MMMM d, yyyy").format(createTime); + } + + @OneToMany(mappedBy = "template", orphanRemoval = true, cascade = {CascadeType.REMOVE, CascadeType.MERGE, CascadeType.PERSIST}) + //@OrderBy("datasetField.displayOrder") + private List<DatasetField> datasetFields = new ArrayList(); + + public List<DatasetField> getDatasetFields() { + return datasetFields; + } + + @Transient + private Map<MetadataBlock, List<DatasetField>> metadataBlocksForView = new HashMap(); + @Transient + private Map<MetadataBlock, List<DatasetField>> metadataBlocksForEdit = new HashMap(); + + @Transient + private boolean isDefaultForDataverse; + + public boolean isIsDefaultForDataverse() { + return isDefaultForDataverse; + } + + public void setIsDefaultForDataverse(boolean isDefaultForDataverse) { + this.isDefaultForDataverse = isDefaultForDataverse; + } + + @Transient + private List<Dataverse> dataversesHasAsDefault; + + public List<Dataverse> getDataversesHasAsDefault() { + return dataversesHasAsDefault; + } + + public void setDataversesHasAsDefault(List<Dataverse> dataversesHasAsDefault) { + this.dataversesHasAsDefault = dataversesHasAsDefault; + } + + + 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; + } + + @ManyToOne + @JoinColumn(nullable=true) + private Dataverse dataverse; + + public Dataverse getDataverse() { + return dataverse; + } + + public void setDataverse(Dataverse dataverse) { + this.dataverse = dataverse; + } + + private List<DatasetField> initDatasetFields() { + //retList - Return List of values + List<DatasetField> retList = new ArrayList(); + for (DatasetField dsf : this.getDatasetFields()) { + retList.add(initDatasetField(dsf)); + } + + //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.getDataverse().getMetadataBlocks()) { + for (DatasetFieldType dsfType : mdb.getDatasetFieldTypes()) { + if (!dsfType.isSubField()) { + boolean add = true; + //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)); + } + } + } + } + + //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; + } + + private void initMetadataBlocksForCreate() { + metadataBlocksForView.clear(); + metadataBlocksForEdit.clear(); + for (MetadataBlock mdb : this.getDataverse().getMetadataBlocks()) { + List<DatasetField> datasetFieldsForView = new ArrayList(); + List<DatasetField> datasetFieldsForEdit = new ArrayList(); + for (DatasetField dsf : this.getDatasetFields()) { + + if (dsf.getDatasetFieldType().getMetadataBlock().equals(mdb)) { + datasetFieldsForEdit.add(dsf); + } + } + + if (!datasetFieldsForView.isEmpty()) { + metadataBlocksForView.put(mdb, sortDatasetFields(datasetFieldsForView)); + } + if (!datasetFieldsForEdit.isEmpty()) { + metadataBlocksForEdit.put(mdb, sortDatasetFields(datasetFieldsForEdit)); + } + } + } + + public void setMetadataValueBlocks() { + //TODO: A lot of clean up on the logic of this method + metadataBlocksForView.clear(); + metadataBlocksForEdit.clear(); + List<DatasetField> filledInFields = this.getDatasetFields(); + + + List <MetadataBlock> actualMDB = new ArrayList(); + + actualMDB.addAll(this.getDataverse().getMetadataBlocks()); + for (DatasetField dsfv : filledInFields) { + if (!dsfv.isEmptyForDisplay()) { + MetadataBlock mdbTest = dsfv.getDatasetFieldType().getMetadataBlock(); + if (!actualMDB.contains(mdbTest)) { + actualMDB.add(mdbTest); + } + } + } + + for (MetadataBlock mdb : actualMDB) { + List<DatasetField> datasetFieldsForView = new ArrayList(); + List<DatasetField> datasetFieldsForEdit = new ArrayList(); + for (DatasetField dsf : this.getDatasetFields()) { + if (dsf.getDatasetFieldType().getMetadataBlock().equals(mdb)) { + datasetFieldsForEdit.add(dsf); + if (!dsf.isEmpty()) { + datasetFieldsForView.add(dsf); + } + } + } + + if (!datasetFieldsForView.isEmpty()) { + metadataBlocksForView.put(mdb, sortDatasetFields(datasetFieldsForView)); + } + if (!datasetFieldsForEdit.isEmpty()) { + metadataBlocksForEdit.put(mdb, sortDatasetFields(datasetFieldsForEdit)); + } + } + } + + // 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) { + 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 = true; + 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; + } + + public Template cloneNewTemplate(Template source) { + Template newTemplate = new Template(); + Template latestVersion = source; + //if the latest version has values get them copied over + if (latestVersion.getDatasetFields() != null && !latestVersion.getDatasetFields().isEmpty()) { + newTemplate.setDatasetFields(newTemplate.copyDatasetFields(source.getDatasetFields())); + } + return newTemplate; + } + + public List<DatasetField> copyDatasetFields(List<DatasetField> copyFromList) { + List<DatasetField> retList = new ArrayList(); + + for (DatasetField sourceDsf : copyFromList) { + //the copy needs to have the current version + retList.add(sourceDsf.copy(this)); + } + + return retList; + } + + public void setDatasetFields(List<DatasetField> datasetFields) { + for (DatasetField dsf : datasetFields) { + dsf.setTemplate(this); + } + this.datasetFields = datasetFields; + } + + public List<DatasetField> getFlatDatasetFields() { + return getFlatDatasetFields(getDatasetFields()); + } + + private List<DatasetField> getFlatDatasetFields(List<DatasetField> dsfList) { + List<DatasetField> retList = new LinkedList(); + for (DatasetField dsf : dsfList) { + retList.add(dsf); + if (dsf.getDatasetFieldType().isCompound()) { + for (DatasetFieldCompoundValue compoundValue : dsf.getDatasetFieldCompoundValues()) { + retList.addAll(getFlatDatasetFields(compoundValue.getChildDatasetFields())); + } + + } + } + return retList; + } + + @Override + public int hashCode() { + int hash = 0; + hash += (this.id != null ? this.id.hashCode() : 0); + return hash; + } + + @Override + public boolean equals(Object object) { + // TODO: Warning - this method won't work in the case the id fields are not set + if (!(object instanceof Template)) { + return false; + } + Template other = (Template) object; + if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) { + return false; + } + return true; + } + +}
