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

IQSS / dataverse / #22783

26 Jul 2024 02:59PM CUT coverage: 20.658% (-0.005%) from 20.663%
#22783

Pull #10729

github

sekmiller
#6575 format source
Pull Request #10729: 6575 move dataset workflow differences

3 of 3 new or added lines in 1 file covered. (100.0%)

461 existing lines in 6 files now uncovered.

17369 of 84077 relevant lines covered (20.66%)

0.21 hits per line

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

70.27
/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.DatasetFieldType;
4
import edu.harvard.iq.dataverse.Dataverse;
5
import edu.harvard.iq.dataverse.DataverseFieldTypeInputLevel;
6
import edu.harvard.iq.dataverse.authorization.DataverseRole;
7
import edu.harvard.iq.dataverse.RoleAssignment;
8
import edu.harvard.iq.dataverse.authorization.Permission;
9
import edu.harvard.iq.dataverse.authorization.groups.Group;
10
import edu.harvard.iq.dataverse.authorization.groups.GroupProvider;
11
import edu.harvard.iq.dataverse.authorization.groups.impl.explicit.ExplicitGroupProvider;
12
import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
13
import edu.harvard.iq.dataverse.authorization.users.User;
14
import edu.harvard.iq.dataverse.batch.util.LoggingUtil;
15
import edu.harvard.iq.dataverse.engine.command.AbstractCommand;
16
import edu.harvard.iq.dataverse.engine.command.CommandContext;
17
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
18
import edu.harvard.iq.dataverse.engine.command.RequiredPermissions;
19
import edu.harvard.iq.dataverse.engine.command.exception.CommandException;
20
import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException;
21
import edu.harvard.iq.dataverse.settings.SettingsServiceBean;
22
import java.io.IOException;
23

24
import java.sql.Timestamp;
25
import java.util.ArrayList;
26
import java.util.Arrays;
27
import java.util.Date;
28
import java.util.List;
29
import java.util.logging.Logger;
30
import org.apache.solr.client.solrj.SolrServerException;
31

32
/**
33
 * TODO make override the date and user more active, so prevent code errors.
34
 * e.g. another command, with explicit parameters.
35
 *
36
 * @author michael
37
 */
38
@RequiredPermissions(Permission.AddDataverse)
39
public class CreateDataverseCommand extends AbstractCommand<Dataverse> {
40

41
    private static final Logger logger = Logger.getLogger(CreateDataverseCommand.class.getName());
1✔
42

43
    private final Dataverse created;
44
    private final List<DataverseFieldTypeInputLevel> inputLevelList;
45
    private final List<DatasetFieldType> facetList;
46

47
    public CreateDataverseCommand(Dataverse created, DataverseRequest aRequest, List<DatasetFieldType> facetList,
48
            List<DataverseFieldTypeInputLevel> inputLevelList) {
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
    }
1✔
62

63
    @Override
64
    public Dataverse execute(CommandContext ctxt) throws CommandException {
65

66
        Dataverse owner = created.getOwner();
1✔
67
        if (owner == null) {
1✔
68
            if (ctxt.dataverses().isRootDataverseExists()) {
1✔
69
                throw new IllegalCommandException("Root Dataverse already exists. Cannot create another one", this);
1✔
70
            }
71
        }
72

73
        if (created.getCreateDate() == null) {
1✔
74
            created.setCreateDate(new Timestamp(new Date().getTime()));
1✔
75
        }
76

77
        if (created.getCreator() == null) {
1✔
78
            final User user = getRequest().getUser();
1✔
79
            if (user.isAuthenticated()) {
1✔
80
                created.setCreator((AuthenticatedUser) user);
1✔
81
            } else {
82
                throw new IllegalCommandException("Guest users cannot create a Dataverse.", this);
1✔
83
            }
84
        }
85

86
        if (created.getDataverseType() == null) {
1✔
87
            created.setDataverseType(Dataverse.DataverseType.UNCATEGORIZED);
1✔
88
        }
89

90
        if (created.getDefaultContributorRole() == null) {
1✔
91
            created.setDefaultContributorRole(ctxt.roles().findBuiltinRoleByAlias(DataverseRole.EDITOR));
1✔
92
        }
93

94
        // @todo for now we are saying all dataverses are permission root
95
        created.setPermissionRoot(true);
1✔
96

97
        if (ctxt.dataverses().findByAlias(created.getAlias()) != null) {
1✔
UNCOV
98
            throw new IllegalCommandException("A dataverse with alias " + created.getAlias() + " already exists", this);
×
99
        }
100
        
101
        if(created.getFilePIDsEnabled()!=null && !ctxt.settings().isTrueForKey(SettingsServiceBean.Key.AllowEnablingFilePIDsPerCollection, false)) {
1✔
UNCOV
102
            throw new IllegalCommandException("File PIDs cannot be enabled per collection", this);
×
103
        }
104

105
        // Save the dataverse
106
        Dataverse managedDv = ctxt.dataverses().save(created);
1✔
107

108
        // Find the built in admin role (currently by alias)
109
        DataverseRole adminRole = ctxt.roles().findBuiltinRoleByAlias(DataverseRole.ADMIN);
1✔
110
        String privateUrlToken = null;
1✔
111

112
        ctxt.roles().save(new RoleAssignment(adminRole, getRequest().getUser(), managedDv, privateUrlToken),false);
1✔
113
        // Add additional role assignments if inheritance is set
114
        boolean inheritAllRoles = false;
1✔
115
        String rolesString = ctxt.settings().getValueForKey(SettingsServiceBean.Key.InheritParentRoleAssignments, "");
1✔
116
        ArrayList<String> rolesToInherit = new ArrayList<String>(Arrays.asList(rolesString.split("\\s*,\\s*")));
1✔
117
        if (rolesString.length() > 0) {
1✔
UNCOV
118
            if (!rolesToInherit.isEmpty()) {
×
UNCOV
119
                if (rolesToInherit.contains("*")) {
×
UNCOV
120
                    inheritAllRoles = true;
×
121
                }
122

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

152
        managedDv.setPermissionModificationTime(new Timestamp(new Date().getTime()));
1✔
153
        // TODO: save is called here and above; we likely don't need both
154
        managedDv = ctxt.dataverses().save(managedDv);
1✔
155

156
  //      ctxt.index().indexDataverse(managedDv);
157
        if (facetList != null) {
1✔
158
            ctxt.facets().deleteFacetsFor(managedDv);
1✔
159
            int i = 0;
1✔
160
            for (DatasetFieldType df : facetList) {
1✔
161
                ctxt.facets().create(i++, df, managedDv);
1✔
162
            }
1✔
163
        }
164

165
        if (inputLevelList != null) {
1✔
166
            ctxt.fieldTypeInputLevels().deleteFacetsFor(managedDv);
1✔
167
            for (DataverseFieldTypeInputLevel obj : inputLevelList) {
1✔
168
                obj.setDataverse(managedDv);
1✔
169
                ctxt.fieldTypeInputLevels().create(obj);
1✔
170
            }
1✔
171
        }
172
        return managedDv;
1✔
173
    }
174
    
175
    @Override
176
    public boolean onSuccess(CommandContext ctxt, Object r) {  
177
        return ctxt.dataverses().index((Dataverse) r);
1✔
178
    }
179

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