Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package edu.harvard.iq.dataverse.persistence.dataset;

import static edu.harvard.iq.dataverse.common.BundleUtil.getStringFromBundle;
import static org.apache.commons.lang3.StringUtils.EMPTY;
import static org.apache.commons.lang3.StringUtils.isBlank;

import java.io.Serializable;
Expand All @@ -12,8 +13,11 @@
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import javax.persistence.CascadeType;
import javax.persistence.Column;
Expand Down Expand Up @@ -126,6 +130,13 @@ public Template getTemplate() {
public List<DatasetField> getDatasetFieldsChildren() {
return datasetFieldsChildren;
}

public Optional<DatasetField> getChildByName(final String name) {
return this.datasetFieldsChildren.
stream().
filter(child -> child.isNamed(name)).
findFirst();
}

public Option<DatasetField> getDatasetFieldParent() {
return Option.of(datasetFieldParent);
Expand Down Expand Up @@ -251,15 +262,15 @@ public String getParentDisplayFormat() {
return getDatasetFieldParent()
.map(DatasetField::getDatasetFieldType)
.map(DatasetFieldType::getDisplayFormat)
.filter(displayFormat -> !StringUtils.equals(displayFormat, "#NEWLINE"))
.getOrElse(StringUtils.EMPTY);
.filter(displayFormat -> !"#NEWLINE".equals(displayFormat))
.getOrElse(EMPTY);
}

public boolean getParentDisplayFormatIsNewLine() {
return getDatasetFieldParent()
.map(DatasetField::getDatasetFieldType)
.map(DatasetFieldType::getDisplayFormat)
.map(displayFormat -> StringUtils.equals(displayFormat, "#NEWLINE"))
.map(displayFormat -> "#NEWLINE".equals(displayFormat))
.getOrElse(false);
}

Expand Down Expand Up @@ -418,6 +429,38 @@ public boolean isVisibleThroughAnonymizedUrl() {
public DatasetField copy() {
return DatasetFieldUtil.copyDatasetField(this);
}

public void copyValueFrom(final DatasetField source) {
final String sourceValue = source.getValue();
setValue(sourceValue);
if(sourceValue != null && allowsControlledVocabulary()) {
this.controlledVocabularyValues.add(this.datasetFieldType.getControlledVocabularyValue(sourceValue));
}
}

public void copyChildValuesFrom(final DatasetField source) {
this.datasetFieldType.forEachCopyPairFrom(source.getTypeName(), (from, to) -> {
final Optional<DatasetField> sourceChild = source.getChildByName(from);
final Optional<DatasetField> targetChild = getChildByName(to);
if (sourceChild.isPresent() && targetChild.isPresent()) {
targetChild.get().copyValueFrom(sourceChild.get());
}
});

this.datasetFieldType.forEachSetPairFrom(source.getTypeName(), (value, to) -> {
getChildByName(to).ifPresent(child -> {
child.setValue(value);
if (value != null && child.allowsControlledVocabulary()) {
child.controlledVocabularyValues.add(
child.datasetFieldType.getControlledVocabularyValue(value));
}
});
});
}

public boolean allowsControlledVocabulary() {
return this.datasetFieldType.isAllowControlledVocabulary();
}

public void trimTrailingSpaces() {
datasetFieldsChildren.stream()
Expand All @@ -444,6 +487,17 @@ public Option<DatasetField> getParent() {
public List<DatasetField> getChildren() {
return getDatasetFieldsChildren();
}

public Stream<DatasetField> streamSiblings() {
if(this.datasetFieldParent == null) {
return Stream.empty();
} else {
return this.datasetFieldParent
.getChildren()
.stream()
.filter(child -> !child.isOfType(this.datasetFieldType));
}
}

@Override
public List<String> getValidatableValues() {
Expand Down Expand Up @@ -623,9 +677,7 @@ public DatasetField setFieldValue(String fieldValue) {

@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
return Objects.hashCode(this.id);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import static edu.harvard.iq.dataverse.persistence.dataset.FieldType.NONE;
import static edu.harvard.iq.dataverse.persistence.dataset.FieldType.TEXT;
import static edu.harvard.iq.dataverse.persistence.dataset.FieldType.TEXTBOX;
import static java.util.Collections.emptyList;
import static java.util.Collections.emptyMap;
import static javax.persistence.CascadeType.MERGE;
import static javax.persistence.CascadeType.PERSIST;
Expand All @@ -20,6 +21,7 @@
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
Expand All @@ -28,6 +30,7 @@
import java.util.Optional;
import java.util.Set;
import java.util.TreeMap;
import java.util.function.BiConsumer;

import javax.faces.model.SelectItem;
import javax.faces.model.SelectItemGroup;
Expand Down Expand Up @@ -730,6 +733,27 @@ public void setMetadata(Map<String, Object> metadata) {
public void setDefaultValue(String defaultValue) {
this.defaultValue = defaultValue;
}

void forEachCopyPairFrom(final String sourceFieldName, final BiConsumer<String, String> consumer) {
for(final Map<String, String> pair : findPairsBySourceName(sourceFieldName, "copy")) {
consumer.accept(pair.get("from"), pair.get("to"));
}
}
void forEachSetPairFrom(final String sourceFieldName, final BiConsumer<String, String> consumer) {
for(final Map<String, String> pair : findPairsBySourceName(sourceFieldName, "set")) {
consumer.accept(pair.get("value"), pair.get("to"));
}
}

@SuppressWarnings("unchecked")
private List<Map<String, String>> findPairsBySourceName(final String sourceFieldName, final String tag) {
return ((List<Map<String, Object>>) getMetadata("copyFrom")).
stream().
filter(copyData -> sourceFieldName.equals(copyData.get("source"))).
findFirst().
map(copyData -> (List<Map<String, String>>) copyData.get(tag)).
orElse(emptyList());
}

// -------------------- hashCode & equals --------------------

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,12 +78,15 @@ public void divide(int position, String delimiter) {
}

public void copyValues(List<DatasetField> sources, String sourceName, int position) {
List<DatasetField> copied = FieldValueCopy.create(datasetFieldType, sourceName).copy(sources, datasetFields.get(position));

if (datasetFields.size() > 1 || !sources.isEmpty()) { // remove field only if that won't left us with no fields
datasetFields.remove(position);
}
datasetFields.addAll(position, copied);

final int totalRequiredLength = position + sources.size();
while(totalRequiredLength > this.datasetFields.size()) {
this.datasetFields.add(DatasetField.createNewEmptyChildDatasetField(this.datasetFieldType, null));
}

for (final DatasetField source : sources) {
this.datasetFields.get(position++).copyChildValuesFrom(source);
}
}

public void removeDatasetField(int position) {
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
import edu.harvard.iq.dataverse.persistence.user.Permission;
import org.assertj.core.util.Lists;

import static java.util.Arrays.asList;

import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.Month;
Expand Down Expand Up @@ -47,7 +49,7 @@ public static Long nextId() {
return Long.valueOf(NEXT_ID.incrementAndGet());
}

public static Date date(int year, int month, int day) {
public static Date date(final int year, int month, int day) {
return new Date(LocalDate.of(year, Month.of(month), day).toEpochDay());
}

Expand Down Expand Up @@ -195,7 +197,8 @@ public static MetadataBlock makeMetadataBlock(String name, String displayName, i
return makeMetadataBlock(nextId(), name, displayName, displayOrder);
}

public static MetadataBlock makeMetadataBlock(long id, String name, String displayName, int displayOrder) {
public static MetadataBlock makeMetadataBlock(long id, String name,
String displayName, int displayOrder) {
MetadataBlock metadataBlock = new MetadataBlock();
metadataBlock.setId(id);
metadataBlock.setName(name);
Expand All @@ -211,7 +214,8 @@ public static DatasetFieldType makeDatasetFieldType() {
return retVal;
}

public static DatasetFieldType makeDatasetFieldType(String name, FieldType fieldType, boolean allowMultiple, MetadataBlock metadataBlock) {
public static DatasetFieldType makeDatasetFieldType(String name, FieldType fieldType,
boolean allowMultiple, MetadataBlock metadataBlock) {
final Long id = nextId();
DatasetFieldType retVal = new DatasetFieldType(name, fieldType, allowMultiple);
retVal.setId(id);
Expand All @@ -224,7 +228,8 @@ public static DatasetFieldType makeDatasetFieldType(String name, FieldType field
return retVal;
}

public static DatasetFieldType makeControlledVocabDatasetFieldType(String name, boolean allowMultiple, MetadataBlock metadataBlock, String... vocabularyStrValues) {
public static DatasetFieldType makeControlledVocabDatasetFieldType(String name,
boolean allowMultiple, MetadataBlock metadataBlock, String... vocabularyStrValues) {
final Long id = nextId();
DatasetFieldType retVal = new DatasetFieldType(name, FieldType.TEXT, allowMultiple);
retVal.setControlledVocabularyValues(new ArrayList<>());
Expand All @@ -242,7 +247,9 @@ public static DatasetFieldType makeControlledVocabDatasetFieldType(String name,
return retVal;
}

public static DatasetFieldType makeComplexDatasetFieldType(String name, boolean allowMultiple, MetadataBlock metadataBlock, DatasetFieldType... childDatasetTypes) {
public static DatasetFieldType makeComplexDatasetFieldType(String name,
boolean allowMultiple, MetadataBlock metadataBlock,
DatasetFieldType... childDatasetTypes) {
final Long id = nextId();
DatasetFieldType retVal = new DatasetFieldType(name, FieldType.NONE, allowMultiple);
retVal.getChildDatasetFieldTypes().addAll(Arrays.asList(childDatasetTypes));
Expand All @@ -256,14 +263,16 @@ public static DatasetFieldType makeComplexDatasetFieldType(String name, boolean
return retVal;
}

public static DatasetFieldType makeChildDatasetFieldType(String name, FieldType fieldType, boolean allowMultiple) {
public static DatasetFieldType makeChildDatasetFieldType(String name,
FieldType fieldType, boolean allowMultiple) {
final Long id = nextId();
DatasetFieldType retVal = new DatasetFieldType(name, fieldType, allowMultiple);
retVal.setId(id);
return retVal;
}

public static DatasetField makeEmptyDatasetField(DatasetFieldType datasetFieldType, int numberOfValues) {
public static DatasetField makeEmptyDatasetField(DatasetFieldType datasetFieldType,
int numberOfValues) {
DatasetField datasetField = new DatasetField();

datasetField.setDatasetFieldType(datasetFieldType);
Expand Down Expand Up @@ -377,5 +386,35 @@ public static FileMetadata makeFileMetadata(Long id, String label, int displayOr
public static ExplicitGroup makeExplicitGroup() {
return makeExplicitGroup(null);
}

public static DatasetFieldType newType(final long id, final String name) {
final DatasetFieldType type = new DatasetFieldType();
type.setId(id);
type.setName(name);
type.setTitle(name);
type.setDisplayFormat("#NAME: #VALUE");
return type;
}

public static DatasetField newField(final long id, final String value,
final DatasetFieldType type) {
final DatasetField field = new DatasetField();
field.setId(id);
field.setValue(value);
field.setDatasetFieldType(type);
return field;
}

public static DatasetField newControlledField(final long id, final String value,
final DatasetFieldType type) {
final DatasetField field = new DatasetField();
field.setId(id);
final ControlledVocabularyValue cValue = new ControlledVocabularyValue();
cValue.setId(id);
cValue.setStrValue(value);
field.setControlledVocabularyValues(asList(cValue));
field.setDatasetFieldType(type);
return field;
}

}
Loading
Loading