Skip to content
Open
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,26 +1,5 @@
package edu.harvard.iq.dataverse.persistence;

import edu.harvard.iq.dataverse.persistence.datafile.DataFile;
import edu.harvard.iq.dataverse.persistence.dataset.Dataset;
import edu.harvard.iq.dataverse.persistence.dataverse.Dataverse;
import edu.harvard.iq.dataverse.persistence.user.AuthenticatedUser;
import edu.harvard.iq.dataverse.persistence.user.RoleAssignment;

import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Index;
import javax.persistence.Inheritance;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.UniqueConstraint;

import static javax.persistence.CascadeType.ALL;
import static javax.persistence.CascadeType.MERGE;
import static javax.persistence.CascadeType.PERSIST;
Expand All @@ -32,41 +11,35 @@
import static org.apache.commons.lang3.StringUtils.SPACE;
import static org.apache.commons.lang3.StringUtils.isNotEmpty;

import java.io.Serializable;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.io.Serializable;

/**
* Base of the object hierarchy for "anything that can be inside a dataverse".
*
* @author michael
*/
import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Index;
import javax.persistence.Inheritance;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.UniqueConstraint;

import edu.harvard.iq.dataverse.persistence.datafile.DataFile;
import edu.harvard.iq.dataverse.persistence.dataset.Dataset;
import edu.harvard.iq.dataverse.persistence.dataverse.Dataverse;
import edu.harvard.iq.dataverse.persistence.user.AuthenticatedUser;
import edu.harvard.iq.dataverse.persistence.user.RoleAssignment;

@SuppressWarnings("serial")
@NamedQueries({
@NamedQuery(name = "DvObject.findAll",
query = "SELECT o FROM DvObject o ORDER BY o.id"),
@NamedQuery(name = "DvObject.findById",
query = "SELECT o FROM DvObject o WHERE o.id=:id"),
@NamedQuery(name = "DvObject.ownedObjectsById",
query = "SELECT COUNT(obj) FROM DvObject obj WHERE obj.owner.id=:id"),
@NamedQuery(name = "DvObject.findByGlobalId",
query = "SELECT o FROM DvObject o WHERE o.identifier=:identifier and o.authority=:authority and o.protocol=:protocol and o.dtype=:dtype"),

@NamedQuery(name = "DvObject.findByAlternativeGlobalId",
query = "SELECT o FROM DvObject o, AlternativePersistentIdentifier a WHERE o.id = a.dvObject.id and a.identifier=:identifier and a.authority=:authority and a.protocol=:protocol and o.dtype=:dtype"),

@NamedQuery(name = "DvObject.findByProtocolIdentifierAuthority",
query = "SELECT o FROM DvObject o WHERE o.identifier=:identifier and o.authority=:authority and o.protocol=:protocol"),
@NamedQuery(name = "DvObject.findByOwnerId",
query = "SELECT o FROM DvObject o WHERE o.owner.id=:ownerId"),
@NamedQuery(name = "DvObject.findByAuthenticatedUserId",
query = "SELECT o FROM DvObject o WHERE o.creator.id=:ownerId or o.releaseUser.id=:releaseUserId")
})
@Entity
// Inheritance strategy "JOINED" will create 4 db tables -
// the top-level dvobject, with the common columns, and the 3 child classes -
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package edu.harvard.iq.dataverse.persistence;

import java.util.List;
import java.util.Optional;

import javax.ejb.Stateless;

@Stateless
public class DvObjectRepository extends JpaRepository<Long, DvObject> {

public DvObjectRepository() {
super(DvObject.class);
}

public List<DvObject> findByOwnerId(final Long id) {
return createQuery("SELECT o FROM DvObject o WHERE o.owner.id=:id")
.setParameter("id", id)
.getResultList();
}

public boolean hasData(final Long id) {
return this.em.createQuery(
"SELECT COUNT(obj) FROM DvObject obj WHERE obj.owner.id=:id",
Long.class)
.setParameter("id", id)
.getSingleResult() > 0;
}

public List<DvObject> findByAuthenticatedUserId(final Long id) {
return createQuery(
"SELECT o FROM DvObject o WHERE o.creator.id=:id or o.releaseUser.id=:id")
.setParameter("id", id)
.getResultList();
}

public Optional<DvObject> findByGlobalId(final String protocol,
final String authority, final String identifier) {
return getSingleResult(createQuery(
"SELECT o FROM DvObject o " +
"WHERE o.identifier=:identifier and o.authority=:authority and o.protocol=:protocol")
.setParameter("protocol", protocol)
.setParameter("authority", authority)
.setParameter("identifier", identifier));
}

public Optional<DvObject> findByGlobalId(final String protocol,
final String authority, final String identifier, final String type) {
return getSingleResult(createQuery(
"SELECT o FROM DvObject o " +
"WHERE o.identifier=:identifier and o.authority=:authority " +
"and o.protocol=:protocol and o.dtype=:type")
.setParameter("protocol", protocol)
.setParameter("authority", authority)
.setParameter("identifier", identifier)
.setParameter("type", type));
}

public Optional<DvObject> findByAlternativeGlobalId(final String protocol,
final String authority, final String identifier, final String type) {
return getSingleResult(createQuery(
"SELECT o FROM DvObject o, AlternativePersistentIdentifier a " +
" WHERE o.id = a.dvObject.id and a.identifier=:identifier " +
" and a.authority=:authority and a.protocol=:protocol " +
" and o.dtype=:type")
.setParameter("protocol", protocol)
.setParameter("authority", authority)
.setParameter("identifier", identifier)
.setParameter("type", type));
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package edu.harvard.iq.dataverse.persistence.dataset;

import org.apache.commons.lang3.StringUtils;

import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toMap;
import static org.apache.commons.lang3.StringUtils.isNotBlank;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.apache.commons.lang3.StringUtils;

public class FieldValueDivider {
private static final FieldValueDivider EMPTY = new FieldValueDivider();
Expand All @@ -24,57 +24,57 @@ private FieldValueDivider() { }
// -------------------- LOGIC --------------------

@SuppressWarnings("unchecked")
public static FieldValueDivider create(DatasetFieldType fieldType) {
boolean hasDivider = fieldType.hasMetadata("divider");
if (!hasDivider) {
return EMPTY;
}
Map<String, Object> dividerData = (Map<String, Object>) fieldType.getMetadata("divider");
FieldValueDivider divider = new FieldValueDivider();
divider.sourceFieldName = (String) dividerData.get("source");
divider.fieldsToCopyNames.addAll((List<String>) dividerData.get("copy"));
return divider;
}
public static FieldValueDivider create(final DatasetFieldType fieldType) {
if (fieldType.hasMetadata("divider")) {
final Map<String, Object> dividerData = (Map<String, Object>) fieldType.getMetadata("divider");
final FieldValueDivider divider = new FieldValueDivider();
divider.sourceFieldName = (String) dividerData.get("source");
divider.fieldsToCopyNames.addAll((List<String>) dividerData.get("copy"));
return divider;
} else {
return EMPTY;
}
}

public List<DatasetField> divide(DatasetField sourceCompound, String delimiter) {
List<DatasetField> fields = new ArrayList<>();
DatasetField sourceField = sourceCompound.getDatasetFieldsChildren().stream()
.filter(f -> sourceFieldName.equals(f.getTypeName()))
.findFirst().orElse(null);
if (sourceField == null) {
return fields;
}
List<String> values = splitValue(sourceField, delimiter);
Map<String, String> valuesToCopy = prepareValuesToCopy(sourceCompound);
for (int i = 0; i < values.size(); i++) {
fields.add(i == 0
? sourceCompound
: DatasetField.createNewEmptyDatasetField(sourceCompound.getDatasetFieldType(), null));
for (DatasetField subfield : fields.get(i).getDatasetFieldsChildren()) {
String name = subfield.getTypeName();
if (sourceFieldName.equals(name)) {
subfield.setFieldValue(values.get(i));
} else if (valuesToCopy.containsKey(name)) {
subfield.setFieldValue(valuesToCopy.get(name));
}
}
}
return fields;
final List<DatasetField> result = new ArrayList<>();
sourceCompound.getDatasetFieldsChildren().stream()
.filter(f -> this.sourceFieldName.equals(f.getTypeName()))
.findFirst()
.map(sourceField -> splitValue(sourceField, delimiter))
.ifPresent(values -> {
final Map<String, String> valuesToCopy = prepareValuesToCopy(sourceCompound);
for (int i = 0; i < values.size(); i++) {
result.add(i == 0
? sourceCompound
: DatasetField.createNewEmptyDatasetField(sourceCompound.getDatasetFieldType(), null));
for (DatasetField subfield : result.get(i).getDatasetFieldsChildren()) {
String name = subfield.getTypeName();
if (this.sourceFieldName.equals(name)) {
subfield.setFieldValue(values.get(i));
} else if (valuesToCopy.containsKey(name)) {
subfield.setFieldValue(valuesToCopy.get(name));
}
}
}
});
return result;
}

// -------------------- PRIVATE --------------------

private List<String> splitValue(DatasetField sourceField, String delimiter) {
String value = sourceField.getFieldValue().getOrElse(StringUtils.EMPTY);
private List<String> splitValue(final DatasetField sourceField, final String delimiter) {
final String value = sourceField.getFieldValue().getOrElse(StringUtils.EMPTY);
return Arrays.stream(value.split(delimiter))
.filter(StringUtils::isNotBlank)
.map(String::trim)
.collect(Collectors.toList());
.collect(toList());
}

private Map<String, String> prepareValuesToCopy(DatasetField sourceCompound) {
private Map<String, String> prepareValuesToCopy(final DatasetField sourceCompound) {
return sourceCompound.getDatasetFieldsChildren().stream()
.filter(f -> fieldsToCopyNames.contains(f.getTypeName())
.filter(f -> this.fieldsToCopyNames.contains(f.getTypeName())
&& isNotBlank(f.getFieldValue().getOrElse(StringUtils.EMPTY)))
.collect(toMap(DatasetField::getTypeName, f -> f.getFieldValue().get(), (prev, next) -> next));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import edu.harvard.iq.dataverse.dataaccess.ImageThumbConverter;
import edu.harvard.iq.dataverse.dataaccess.StorageIO;
import edu.harvard.iq.dataverse.globalid.GlobalIdServiceBean;
import edu.harvard.iq.dataverse.persistence.DvObjectRepository;
import edu.harvard.iq.dataverse.persistence.GlobalId;
import edu.harvard.iq.dataverse.persistence.datafile.DataFile;
import edu.harvard.iq.dataverse.persistence.datafile.DataFileRepository;
Expand Down Expand Up @@ -73,6 +74,8 @@ public class DataFileServiceBean implements Serializable {
private DataFileRepository fileRepo;
@Inject
private FileMetadataRepository fileMetadataRepo;
@Inject
private DvObjectRepository dvObjectRepository;

@PersistenceContext(unitName = "VDCNet-ejbPU")
private EntityManager em;
Expand All @@ -87,7 +90,7 @@ public Optional<DataFile> find(final Long id) {

public DataFile findByGlobalId(final String globalId) {
return (DataFile) this.dvObjectService.findByGlobalId(globalId,
DataFile.DATAFILE_DTYPE_STRING);
DataFile.DATAFILE_DTYPE_STRING).orElse(null);
}

public Optional<DataFile> findReplacementFile(final Long previousFileId) {
Expand Down Expand Up @@ -432,20 +435,17 @@ public String generateDataFileIdentifier(DataFile datafile, GlobalIdServiceBean
*
* @return {@code true} iff the global identifier is unique.
*/
public boolean isGlobalIdUnique(String userIdentifier, DataFile datafile, GlobalIdServiceBean idServiceBean) {
public boolean isGlobalIdUnique(String userIdentifier, DataFile datafile,
GlobalIdServiceBean idServiceBean) {
String testAuthority = datafile.getAuthority() != null
? datafile.getAuthority()
: settingsService.getValueForKey(Authority);
String testProtocol = datafile.getProtocol() != null
? datafile.getProtocol()
: settingsService.getValueForKey(Protocol);

boolean unique = em.createNamedQuery("DvObject.findByProtocolIdentifierAuthority")
.setParameter("protocol", testProtocol)
.setParameter("authority", testAuthority)
.setParameter("identifier", userIdentifier)
.getResultList().isEmpty();

boolean unique = ! this.dvObjectRepository.
findByGlobalId(testProtocol, testAuthority, userIdentifier).isPresent();
try {
if (idServiceBean.alreadyExists(new GlobalId(testProtocol,
testAuthority, userIdentifier))) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

import edu.harvard.iq.dataverse.dataset.DatasetService;
import edu.harvard.iq.dataverse.persistence.DvObject;
import edu.harvard.iq.dataverse.persistence.DvObjectRepository;
import edu.harvard.iq.dataverse.persistence.dataset.Dataset;
import edu.harvard.iq.dataverse.persistence.dataverse.Dataverse;

Expand All @@ -17,11 +18,15 @@ public class DvObjectDao {

private DataverseDao dataverseDao;
private DatasetService datasetService;
private DvObjectRepository dvObjectRepository;

@Inject
public DvObjectDao(DataverseDao dataverseDao, DatasetService datasetService) {
public DvObjectDao(final DataverseDao dataverseDao,
final DatasetService datasetService,
final DvObjectRepository dvObjectRepository) {
this.dataverseDao = dataverseDao;
this.datasetService = datasetService;
this.dvObjectRepository = dvObjectRepository;
}

public DvObjectDao() {
Expand All @@ -40,16 +45,10 @@ public DvObjectDao() {
*/
public DvObject findDvo(String id) {
if (isNumeric(id)) {
return this.findDvo(Long.valueOf(id));
return this.dvObjectRepository.getById(Long.valueOf(id));
} else {
Dataverse d = dataverseDao.findByAlias(id);
final Dataverse d = dataverseDao.findByAlias(id);
return (d != null) ? d : datasetService.findByGlobalId(id);
}
}

private DvObject findDvo(Long id) {
return em.createNamedQuery("DvObject.findById", DvObject.class)
.setParameter("id", id)
.getSingleResult();
}
}
Loading
Loading