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

IQSS / dataverse / #22775

25 Jul 2024 10:51PM CUT coverage: 20.663% (+0.01%) from 20.651%
#22775

push

github

web-flow
Merge pull request #10644 from IQSS/10633-create-collection-api-ext

addDataverse API endpoint extension for input levels and facet list setup

28 of 106 new or added lines in 7 files covered. (26.42%)

4 existing lines in 2 files now uncovered.

17385 of 84134 relevant lines covered (20.66%)

0.21 hits per line

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

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

3
import edu.harvard.iq.dataverse.*;
4
import edu.harvard.iq.dataverse.authorization.DataverseRole;
5
import edu.harvard.iq.dataverse.authorization.Permission;
6
import edu.harvard.iq.dataverse.authorization.groups.Group;
7
import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
8
import edu.harvard.iq.dataverse.authorization.users.User;
9
import edu.harvard.iq.dataverse.engine.command.AbstractCommand;
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.CommandException;
14
import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException;
15
import edu.harvard.iq.dataverse.settings.SettingsServiceBean;
16

17
import java.sql.Timestamp;
18
import java.util.ArrayList;
19
import java.util.Arrays;
20
import java.util.Date;
21
import java.util.List;
22

23
/**
24
 * TODO make override the date and user more active, so prevent code errors.
25
 * e.g. another command, with explicit parameters.
26
 *
27
 * @author michael
28
 */
29
@RequiredPermissions(Permission.AddDataverse)
30
public class CreateDataverseCommand extends AbstractCommand<Dataverse> {
31

32
    private final Dataverse created;
33
    private final List<DataverseFieldTypeInputLevel> inputLevelList;
34
    private final List<DatasetFieldType> facetList;
35
    private final List<MetadataBlock> metadataBlocks;
36

37
    public CreateDataverseCommand(Dataverse created,
38
                                  DataverseRequest aRequest,
39
                                  List<DatasetFieldType> facetList,
40
                                  List<DataverseFieldTypeInputLevel> inputLevelList) {
41
        this(created, aRequest, facetList, inputLevelList, null);
1✔
42
    }
1✔
43

44
    public CreateDataverseCommand(Dataverse created,
45
                                  DataverseRequest aRequest,
46
                                  List<DatasetFieldType> facetList,
47
                                  List<DataverseFieldTypeInputLevel> inputLevelList,
48
                                  List<MetadataBlock> metadataBlocks) {
49
        super(aRequest, created.getOwner());
1✔
50
        this.created = created;
1✔
51
        if (facetList != null) {
1✔
52
            this.facetList = new ArrayList<>(facetList);
1✔
53
        } else {
54
            this.facetList = null;
1✔
55
        }
56
        if (inputLevelList != null) {
1✔
57
            this.inputLevelList = new ArrayList<>(inputLevelList);
1✔
58
        } else {
59
            this.inputLevelList = null;
1✔
60
        }
61
        if (metadataBlocks != null) {
1✔
NEW
62
            this.metadataBlocks = new ArrayList<>(metadataBlocks);
×
63
        } else {
64
            this.metadataBlocks = null;
1✔
65
        }
66
    }
1✔
67

68
    @Override
69
    public Dataverse execute(CommandContext ctxt) throws CommandException {
70

71
        Dataverse owner = created.getOwner();
1✔
72
        if (owner == null) {
1✔
73
            if (ctxt.dataverses().isRootDataverseExists()) {
1✔
74
                throw new IllegalCommandException("Root Dataverse already exists. Cannot create another one", this);
1✔
75
            }
76
        }
77

78
        if (metadataBlocks != null && !metadataBlocks.isEmpty()) {
1✔
NEW
79
            created.setMetadataBlockRoot(true);
×
NEW
80
            created.setMetadataBlocks(metadataBlocks);
×
81
        }
82

83
        if (created.getCreateDate() == null) {
1✔
84
            created.setCreateDate(new Timestamp(new Date().getTime()));
1✔
85
        }
86

87
        if (created.getCreator() == null) {
1✔
88
            final User user = getRequest().getUser();
1✔
89
            if (user.isAuthenticated()) {
1✔
90
                created.setCreator((AuthenticatedUser) user);
1✔
91
            } else {
92
                throw new IllegalCommandException("Guest users cannot create a Dataverse.", this);
1✔
93
            }
94
        }
95

96
        if (created.getDataverseType() == null) {
1✔
97
            created.setDataverseType(Dataverse.DataverseType.UNCATEGORIZED);
1✔
98
        }
99

100
        if (created.getDefaultContributorRole() == null) {
1✔
101
            created.setDefaultContributorRole(ctxt.roles().findBuiltinRoleByAlias(DataverseRole.EDITOR));
1✔
102
        }
103

104
        // @todo for now we are saying all dataverses are permission root
105
        created.setPermissionRoot(true);
1✔
106

107
        if (ctxt.dataverses().findByAlias(created.getAlias()) != null) {
1✔
108
            throw new IllegalCommandException("A dataverse with alias " + created.getAlias() + " already exists", this);
×
109
        }
110

111
        if (created.getFilePIDsEnabled() != null && !ctxt.settings().isTrueForKey(SettingsServiceBean.Key.AllowEnablingFilePIDsPerCollection, false)) {
1✔
UNCOV
112
            throw new IllegalCommandException("File PIDs cannot be enabled per collection", this);
×
113
        }
114

115
        // Save the dataverse
116
        Dataverse managedDv = ctxt.dataverses().save(created);
1✔
117

118
        // Find the built in admin role (currently by alias)
119
        DataverseRole adminRole = ctxt.roles().findBuiltinRoleByAlias(DataverseRole.ADMIN);
1✔
120
        String privateUrlToken = null;
1✔
121

122
        ctxt.roles().save(new RoleAssignment(adminRole, getRequest().getUser(), managedDv, privateUrlToken), false);
1✔
123
        // Add additional role assignments if inheritance is set
124
        boolean inheritAllRoles = false;
1✔
125
        String rolesString = ctxt.settings().getValueForKey(SettingsServiceBean.Key.InheritParentRoleAssignments, "");
1✔
126
        ArrayList<String> rolesToInherit = new ArrayList<String>(Arrays.asList(rolesString.split("\\s*,\\s*")));
1✔
127
        if (rolesString.length() > 0) {
1✔
128
            if (!rolesToInherit.isEmpty()) {
×
129
                if (rolesToInherit.contains("*")) {
×
130
                    inheritAllRoles = true;
×
131
                }
132

133
                List<RoleAssignment> assignedRoles = ctxt.roles().directRoleAssignments(owner);
×
134
                for (RoleAssignment role : assignedRoles) {
×
135
                    //Only supporting built-in/non-dataverse-specific custom roles. Custom roles all have an owner.
136
                    if (role.getRole().getOwner() == null) {
×
137
                        // And... If all roles are to be inherited, or this role is in the list, and, in both
138
                        // cases, this is not an admin role for the current user which was just created
139
                        // above...
140
                        if ((inheritAllRoles || rolesToInherit.contains(role.getRole().getAlias()))
×
141
                                && !(role.getAssigneeIdentifier().equals(getRequest().getUser().getIdentifier())
×
NEW
142
                                && role.getRole().equals(adminRole))) {
×
143
                            String identifier = role.getAssigneeIdentifier();
×
144
                            if (identifier.startsWith(AuthenticatedUser.IDENTIFIER_PREFIX)) {
×
145
                                identifier = identifier.substring(AuthenticatedUser.IDENTIFIER_PREFIX.length());
×
146
                                ctxt.roles().save(new RoleAssignment(role.getRole(),
×
NEW
147
                                        ctxt.authentication().getAuthenticatedUser(identifier), managedDv, privateUrlToken), false);
×
148
                            } else if (identifier.startsWith(Group.IDENTIFIER_PREFIX)) {
×
149
                                identifier = identifier.substring(Group.IDENTIFIER_PREFIX.length());
×
150
                                Group roleGroup = ctxt.groups().getGroup(identifier);
×
151
                                if (roleGroup != null) {
×
152
                                    ctxt.roles().save(new RoleAssignment(role.getRole(),
×
153
                                            roleGroup, managedDv, privateUrlToken), false);
154
                                }
155
                            }
156
                        }
157
                    }
158
                }
×
159
            }
160
        }
161

162
        managedDv.setPermissionModificationTime(new Timestamp(new Date().getTime()));
1✔
163

164
        if (facetList != null) {
1✔
165
            ctxt.facets().deleteFacetsFor(managedDv);
1✔
166

167
            if (!facetList.isEmpty()) {
1✔
168
                managedDv.setFacetRoot(true);
1✔
169
            }
170

171
            int i = 0;
1✔
172
            for (DatasetFieldType df : facetList) {
1✔
173
                ctxt.facets().create(i++, df, managedDv);
1✔
174
            }
1✔
175
        }
176

177
        if (inputLevelList != null) {
1✔
178
            if (!inputLevelList.isEmpty()) {
1✔
179
                managedDv.addInputLevelsMetadataBlocksIfNotPresent(inputLevelList);
1✔
180
            }
181
            ctxt.fieldTypeInputLevels().deleteFacetsFor(managedDv);
1✔
182
            for (DataverseFieldTypeInputLevel inputLevel : inputLevelList) {
1✔
183
                inputLevel.setDataverse(managedDv);
1✔
184
                ctxt.fieldTypeInputLevels().create(inputLevel);
1✔
185
            }
1✔
186
        }
187

188
        // TODO: save is called here and above; we likely don't need both
189
        managedDv = ctxt.dataverses().save(managedDv);
1✔
190
        return managedDv;
1✔
191
    }
192

193
    @Override
194
    public boolean onSuccess(CommandContext ctxt, Object r) {
195
        return ctxt.dataverses().index((Dataverse) r);
1✔
196
    }
197

198
}
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