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

IQSS / dataverse / #22693

03 Jul 2024 01:09PM CUT coverage: 20.626% (-0.09%) from 20.716%
#22693

push

github

web-flow
Merge pull request #10664 from IQSS/develop

merge develop into master for 6.3

195 of 1852 new or added lines in 82 files covered. (10.53%)

72 existing lines in 33 files now uncovered.

17335 of 84043 relevant lines covered (20.63%)

0.21 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.Dataset;
4
import edu.harvard.iq.dataverse.DatasetFieldType;
5
import edu.harvard.iq.dataverse.Dataverse;
6
import edu.harvard.iq.dataverse.Dataverse.DataverseType;
7
import edu.harvard.iq.dataverse.DataverseFieldTypeInputLevel;
8
import edu.harvard.iq.dataverse.authorization.Permission;
9

10
import static edu.harvard.iq.dataverse.dataverse.DataverseUtil.validateDataverseMetadataExternally;
11
import edu.harvard.iq.dataverse.engine.command.AbstractCommand;
12
import edu.harvard.iq.dataverse.engine.command.CommandContext;
13
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
14
import edu.harvard.iq.dataverse.engine.command.RequiredPermissions;
15
import edu.harvard.iq.dataverse.engine.command.exception.CommandException;
16
import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException;
17

18
import java.util.ArrayList;
19
import java.util.List;
20
import java.util.logging.Logger;
21

22
/**
23
 * Update an existing dataverse.
24
 * @author michael
25
 */
26
@RequiredPermissions( Permission.EditDataverse )
27
public class UpdateDataverseCommand extends AbstractCommand<Dataverse> {
28
        private static final Logger logger = Logger.getLogger(UpdateDataverseCommand.class.getName());
×
29
        
30
        private final Dataverse editedDv;
31
        private final List<DatasetFieldType> facetList;
32
    private final List<Dataverse> featuredDataverseList;
33
    private final List<DataverseFieldTypeInputLevel> inputLevelList;
34

NEW
35
    private boolean datasetsReindexRequired = false;
×
36

37
        public UpdateDataverseCommand(Dataverse editedDv, List<DatasetFieldType> facetList, List<Dataverse> featuredDataverseList, 
38
                    DataverseRequest aRequest,  List<DataverseFieldTypeInputLevel> inputLevelList ) {
39
            super(aRequest, editedDv);
×
40
            this.editedDv = editedDv;
×
41
            // add update template uses this command but does not
42
            // update facet list or featured dataverses
43
            if (facetList != null){
×
44
               this.facetList = new ArrayList<>(facetList); 
×
45
            } else {
46
               this.facetList = null;
×
47
            }
48
            if (featuredDataverseList != null){
×
49
                this.featuredDataverseList = new ArrayList<>(featuredDataverseList);
×
50
            } else {
51
                this.featuredDataverseList = null;
×
52
            }
53
            if (inputLevelList != null){
×
54
               this.inputLevelList = new ArrayList<>(inputLevelList); 
×
55
            } else {
56
               this.inputLevelList = null;
×
57
            }
58
        }
×
59
        
60
        @Override
61
        public Dataverse execute(CommandContext ctxt) throws CommandException {
62
            logger.fine("Entering update dataverse command");
×
63
            
64
            // Perform any optional validation steps, if defined:
65
            if (ctxt.systemConfig().isExternalDataverseValidationEnabled()) {
×
66
                // For admins, an override of the external validation step may be enabled: 
67
                if (!(getUser().isSuperuser() && ctxt.systemConfig().isExternalValidationAdminOverrideEnabled())) {
×
68
                    String executable = ctxt.systemConfig().getDataverseValidationExecutable();
×
69
                    boolean result = validateDataverseMetadataExternally(editedDv, executable, getRequest());
×
70

71
                    if (!result) {
×
72
                        String rejectionMessage = ctxt.systemConfig().getDataverseUpdateValidationFailureMsg();
×
73
                        throw new IllegalCommandException(rejectionMessage, this);
×
74
                    }
75
                }
76
            }
77
            
78
            Dataverse oldDv = ctxt.dataverses().find(editedDv.getId());
×
79
            
80
            DataverseType oldDvType = oldDv.getDataverseType();
×
81
            String oldDvAlias = oldDv.getAlias();
×
82
            String oldDvName = oldDv.getName();
×
83
            oldDv = null; 
×
84
            
85
            Dataverse result = ctxt.dataverses().save(editedDv);
×
86
            
87
            if ( facetList != null ) {
×
88
                ctxt.facets().deleteFacetsFor(result);
×
89
                int i=0;
×
90
                for ( DatasetFieldType df : facetList ) {
×
91
                    ctxt.facets().create(i++, df.getId(), result.getId());
×
92
                }
×
93
            }
94
            if ( featuredDataverseList != null ) {
×
95
                ctxt.featuredDataverses().deleteFeaturedDataversesFor(result);
×
96
                int i=0;
×
97
                for ( Object obj : featuredDataverseList ) {
×
98
                    Dataverse dv = (Dataverse) obj;
×
99
                    ctxt.featuredDataverses().create(i++, dv.getId(), result.getId());
×
100
                }
×
101
            }
102
            if ( inputLevelList != null ) {
×
103
                ctxt.fieldTypeInputLevels().deleteFacetsFor(result);
×
104
                for ( DataverseFieldTypeInputLevel obj : inputLevelList ) {               
×
105
                    ctxt.fieldTypeInputLevels().create(obj);
×
106
                }
×
107
            }
108
            
109
            // We don't want to reindex the children datasets unnecessarily: 
110
            // When these values are changed we need to reindex all children datasets
111
            // This check is not recursive as all the values just report the immediate parent
112
            if (!oldDvType.equals(editedDv.getDataverseType())
×
113
                || !oldDvName.equals(editedDv.getName())
×
114
                || !oldDvAlias.equals(editedDv.getAlias())) {
×
115
                datasetsReindexRequired = true;
×
116
            }
117
            
118
            return result;
×
119
        }
120
        
121
    @Override
122
    public boolean onSuccess(CommandContext ctxt, Object r) {
123
        
124
        // first kick of async index of datasets
125
        // TODO: is this actually needed? Is there a better way to handle
126
        // It appears that we at some point lost some extra logic here, where
127
        // we only reindex the underlying datasets if one or more of the specific set
128
        // of fields have been changed (since these values are included in the 
129
        // indexed solr documents for dataasets). So I'm putting that back. -L.A.
130
        Dataverse result = (Dataverse) r;
×
131
        
132
        if (datasetsReindexRequired) {
×
133
            List<Dataset> datasets = ctxt.datasets().findByOwnerId(result.getId());
×
134
            ctxt.index().asyncIndexDatasetList(datasets, true);
×
135
        }
136
        
137
        return ctxt.dataverses().index((Dataverse) r);
×
138
    }  
139

140
}
141

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