• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

IQSS / dataverse / #23769

18 Nov 2024 04:04PM CUT coverage: 21.859%. First build
#23769

Pull #11026

github

GPortas
Added: IT cases for updateDataverse API endpoint
Pull Request #11026: Update Dataverse API relations reset when passing null metadata blocks and/or facets and/or input levels

15 of 25 new or added lines in 5 files covered. (60.0%)

18873 of 86338 relevant lines covered (21.86%)

0.22 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/main/java/edu/harvard/iq/dataverse/engine/command/impl/UpdateDataverseCommand.java
1
package edu.harvard.iq.dataverse.engine.command.impl;
2

3
import edu.harvard.iq.dataverse.*;
4
import edu.harvard.iq.dataverse.Dataverse.DataverseType;
5
import edu.harvard.iq.dataverse.api.dto.DataverseDTO;
6
import edu.harvard.iq.dataverse.authorization.Permission;
7

8
import static edu.harvard.iq.dataverse.dataverse.DataverseUtil.validateDataverseMetadataExternally;
9

10
import edu.harvard.iq.dataverse.engine.command.CommandContext;
11
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
12
import edu.harvard.iq.dataverse.engine.command.RequiredPermissions;
13
import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException;
14

15
import java.util.ArrayList;
16
import java.util.List;
17

18
/**
19
 * Update an existing dataverse.
20
 *
21
 * @author michael
22
 */
23
@RequiredPermissions(Permission.EditDataverse)
24
public class UpdateDataverseCommand extends AbstractWriteDataverseCommand {
25
    private final List<Dataverse> featuredDataverseList;
26
    private final DataverseDTO updatedDataverseDTO;
27

28
    private boolean datasetsReindexRequired = false;
×
29

30
    public UpdateDataverseCommand(Dataverse dataverse,
31
                                  List<DatasetFieldType> facets,
32
                                  List<Dataverse> featuredDataverses,
33
                                  DataverseRequest request,
34
                                  List<DataverseFieldTypeInputLevel> inputLevels) {
NEW
35
        this(dataverse, facets, featuredDataverses, request, inputLevels, null, null, false);
×
36
    }
×
37

38
    public UpdateDataverseCommand(Dataverse dataverse,
39
                                  List<DatasetFieldType> facets,
40
                                  List<Dataverse> featuredDataverses,
41
                                  DataverseRequest request,
42
                                  List<DataverseFieldTypeInputLevel> inputLevels,
43
                                  List<MetadataBlock> metadataBlocks,
44
                                  DataverseDTO updatedDataverseDTO,
45
                                  boolean resetRelationsOnNullValues) {
NEW
46
        super(dataverse, dataverse, request, facets, inputLevels, metadataBlocks, resetRelationsOnNullValues);
×
47
        if (featuredDataverses != null) {
×
48
            this.featuredDataverseList = new ArrayList<>(featuredDataverses);
×
49
        } else {
50
            this.featuredDataverseList = null;
×
51
        }
52
        this.updatedDataverseDTO = updatedDataverseDTO;
×
53
    }
×
54

55
    @Override
56
    protected Dataverse innerExecute(CommandContext ctxt) throws IllegalCommandException {
57
        // Perform any optional validation steps, if defined:
58
        if (ctxt.systemConfig().isExternalDataverseValidationEnabled()) {
×
59
            // For admins, an override of the external validation step may be enabled:
60
            if (!(getUser().isSuperuser() && ctxt.systemConfig().isExternalValidationAdminOverrideEnabled())) {
×
61
                String executable = ctxt.systemConfig().getDataverseValidationExecutable();
×
62
                boolean result = validateDataverseMetadataExternally(dataverse, executable, getRequest());
×
63

64
                if (!result) {
×
65
                    String rejectionMessage = ctxt.systemConfig().getDataverseUpdateValidationFailureMsg();
×
66
                    throw new IllegalCommandException(rejectionMessage, this);
×
67
                }
68
            }
69
        }
70

71
        Dataverse oldDv = ctxt.dataverses().find(dataverse.getId());
×
72

73
        DataverseType oldDvType = oldDv.getDataverseType();
×
74
        String oldDvAlias = oldDv.getAlias();
×
75
        String oldDvName = oldDv.getName();
×
76

77
        // We don't want to reindex the children datasets unnecessarily:
78
        // When these values are changed we need to reindex all children datasets
79
        // This check is not recursive as all the values just report the immediate parent
80
        if (!oldDvType.equals(dataverse.getDataverseType())
×
81
                || !oldDvName.equals(dataverse.getName())
×
82
                || !oldDvAlias.equals(dataverse.getAlias())) {
×
83
            datasetsReindexRequired = true;
×
84
        }
85

86
        if (featuredDataverseList != null) {
×
87
            ctxt.featuredDataverses().deleteFeaturedDataversesFor(dataverse);
×
88
            int i = 0;
×
89
            for (Object obj : featuredDataverseList) {
×
90
                Dataverse dv = (Dataverse) obj;
×
91
                ctxt.featuredDataverses().create(i++, dv.getId(), dataverse.getId());
×
92
            }
×
93
        }
94

95
        if (updatedDataverseDTO != null) {
×
96
            updateDataverseFromDTO(dataverse, updatedDataverseDTO);
×
97
        }
98

99
        return dataverse;
×
100
    }
101

102
    private void updateDataverseFromDTO(Dataverse dataverse, DataverseDTO dto) {
103
        if (dto.getAlias() != null) {
×
104
            dataverse.setAlias(dto.getAlias());
×
105
        }
106
        if (dto.getName() != null) {
×
107
            dataverse.setName(dto.getName());
×
108
        }
109
        if (dto.getDescription() != null) {
×
110
            dataverse.setDescription(dto.getDescription());
×
111
        }
112
        if (dto.getAffiliation() != null) {
×
113
            dataverse.setAffiliation(dto.getAffiliation());
×
114
        }
115
        if (dto.getDataverseContacts() != null) {
×
116
            dataverse.setDataverseContacts(dto.getDataverseContacts());
×
117
            for (DataverseContact dc : dataverse.getDataverseContacts()) {
×
118
                dc.setDataverse(dataverse);
×
119
            }
×
120
        }
121
        if (dto.getDataverseType() != null) {
×
122
            dataverse.setDataverseType(dto.getDataverseType());
×
123
        }
124
    }
×
125

126
    @Override
127
    public boolean onSuccess(CommandContext ctxt, Object r) {
128

129
        // first kick of async index of datasets
130
        // TODO: is this actually needed? Is there a better way to handle
131
        // It appears that we at some point lost some extra logic here, where
132
        // we only reindex the underlying datasets if one or more of the specific set
133
        // of fields have been changed (since these values are included in the
134
        // indexed solr documents for datasets). So I'm putting that back. -L.A.
135
        Dataverse result = (Dataverse) r;
×
136

137
        if (datasetsReindexRequired) {
×
138
            List<Dataset> datasets = ctxt.datasets().findByOwnerId(result.getId());
×
139
            ctxt.index().asyncIndexDatasetList(datasets, true);
×
140
        }
141

142
        return ctxt.dataverses().index((Dataverse) r);
×
143
    }
144
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc