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

IQSS / dataverse / #22002

01 Apr 2024 07:56PM CUT coverage: 20.716% (+0.5%) from 20.173%
#22002

push

github

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

Merge 6.2 into master

704 of 2679 new or added lines in 152 files covered. (26.28%)

81 existing lines in 49 files now uncovered.

17160 of 82836 relevant lines covered (20.72%)

0.21 hits per line

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

54.29
/src/main/java/edu/harvard/iq/dataverse/DvObjectContainer.java
1
package edu.harvard.iq.dataverse;
2

3
import edu.harvard.iq.dataverse.dataaccess.DataAccess;
4
import edu.harvard.iq.dataverse.pidproviders.PidProvider;
5
import edu.harvard.iq.dataverse.pidproviders.PidUtil;
6
import edu.harvard.iq.dataverse.settings.JvmSettings;
7
import edu.harvard.iq.dataverse.storageuse.StorageUse;
8
import edu.harvard.iq.dataverse.util.SystemConfig;
9
import edu.harvard.iq.dataverse.util.json.JsonUtil;
10
import jakarta.json.JsonObject;
11
import jakarta.json.JsonObjectBuilder;
12
import jakarta.persistence.CascadeType;
13
import java.util.Optional;
14
import jakarta.persistence.MappedSuperclass;
15
import jakarta.persistence.OneToOne;
16
import jakarta.persistence.Transient;
17

18
import org.apache.commons.lang3.StringUtils;
19

20
/**
21
 * A {@link DvObject} that can contain other {@link DvObject}s.
22
 * 
23
 * @author michael
24
 */
25
@MappedSuperclass
26
public abstract class DvObjectContainer extends DvObject {
1✔
27
    
28
    public static final String UNDEFINED_CODE = "undefined"; //Used in dataverse.xhtml as a non-null selection option value (indicating inheriting the default)
29
    
30
    public void setOwner(Dataverse owner) {
31
        super.setOwner(owner);
1✔
32
    }
1✔
33
        
34
        @Override
35
        public Dataverse getOwner() {
36
                return super.getOwner()!=null ? (Dataverse)super.getOwner() : null;
1✔
37
        }
38
    
39
    protected abstract boolean isPermissionRoot();
40
    
41
    @Override
42
    public boolean isEffectivelyPermissionRoot() {
43
        return isPermissionRoot() || (getOwner() == null);
×
44
    }
45

46
    private String storageDriver=null;
1✔
47
    
48
    private String metadataLanguage=null;
1✔
49
    
50
    private Boolean guestbookAtRequest = null;
1✔
51
    
52
    private String pidGeneratorSpecs = null;
1✔
53
    
54
    @Transient
1✔
55
    private PidProvider pidGenerator = null;
56
   
57
    @OneToOne(mappedBy = "dvObjectContainer",cascade={ CascadeType.REMOVE, CascadeType.PERSIST}, orphanRemoval=true)
58
    private StorageUse storageUse;
59
    
60
    public String getEffectiveStorageDriverId() {
61
        String id = storageDriver;
1✔
62
        if (StringUtils.isBlank(id)) {
1✔
63
            if (this.getOwner() != null) {
1✔
64
                id = this.getOwner().getEffectiveStorageDriverId();
1✔
65
            } else {
66
                id = DataAccess.DEFAULT_STORAGE_DRIVER_IDENTIFIER;
1✔
67
            }
68
        }
69
        return id;
1✔
70
    }
71
    
72
    public String getStorageDriverId() {
73
        if (storageDriver == null) {
1✔
74
            return DataAccess.UNDEFINED_STORAGE_DRIVER_IDENTIFIER;
1✔
75
        }
76
        return storageDriver;
×
77
    }
78

79
    public void setStorageDriverId(String storageDriver) {
80
        if (storageDriver != null && storageDriver.equals(DataAccess.UNDEFINED_STORAGE_DRIVER_IDENTIFIER)) {
×
81
            this.storageDriver = null;
×
82
        } else {
83
            this.storageDriver = storageDriver;
×
84
        }
85
    }
×
86
    
87
    public String getEffectiveMetadataLanguage() {
88
        String ml = metadataLanguage;
×
89
        if (StringUtils.isBlank(ml)) {
×
90
            if (this.getOwner() != null) {
×
91
                ml = this.getOwner().getEffectiveMetadataLanguage();
×
92
            } else {
93
                ml = UNDEFINED_CODE;
×
94
            }
95
        }
96
        return ml;
×
97
    }
98
    
99
    public String getMetadataLanguage() {
100
        if (metadataLanguage == null) {
1✔
101
            return UNDEFINED_CODE;
1✔
102
        }
103
        return metadataLanguage;
1✔
104
    }
105

106
    public void setMetadataLanguage(String ml) {
107
        if (ml != null && ml.equals(UNDEFINED_CODE)) {
1✔
108
            this.metadataLanguage = null;
1✔
109
        } else {
110
            this.metadataLanguage = ml;
1✔
111
        }
112
    }
1✔
113
    
114
    public static boolean isMetadataLanguageSet(String mdLang) {
115
        return mdLang!=null && !mdLang.equals(UNDEFINED_CODE);
1✔
116
    }
117
    
118
    public boolean getEffectiveGuestbookEntryAtRequest() {
119
        boolean gbAtRequest = false;
×
120
        if (guestbookAtRequest==null) {
×
121
            if (this.getOwner() != null) {
×
122
                gbAtRequest = this.getOwner().getEffectiveGuestbookEntryAtRequest();
×
123
            } else {
124
                Optional<Boolean> opt = JvmSettings.GUESTBOOK_AT_REQUEST.lookupOptional(Boolean.class);
×
125
                if (opt.isPresent()) {
×
126
                gbAtRequest = opt.get();
×
127
                }
128
            }
×
129
        } else {
130
            gbAtRequest = guestbookAtRequest;
×
131
        }
132
        return gbAtRequest;
×
133
    }
134
    
135
    public String getGuestbookEntryAtRequest() {
136
        if(guestbookAtRequest==null) {
×
137
            return UNDEFINED_CODE;
×
138
        }
139
        return Boolean.valueOf(guestbookAtRequest).toString();
×
140
    }
141

142
    public void setGuestbookEntryAtRequest(String gbAtRequest) {
143
        if (gbAtRequest == null || gbAtRequest.equals(UNDEFINED_CODE)) {
×
144
            this.guestbookAtRequest = null;
×
145
        } else {
146
            //Force to true or false
147
            this.guestbookAtRequest = Boolean.valueOf(Boolean.parseBoolean(gbAtRequest));
×
148
        }
149
    }
×
150
    
151

152
    /* Dataverse collections can be configured to allow use of Curation labels and have this inheritable value to decide which set of labels to use.
153
     * This mechanism is similar to that for the storageDriver except that there is an addition option to disable use of labels. 
154
     */
155
    private String externalLabelSetName = null;
1✔
156

157
    public String getEffectiveCurationLabelSetName() {
158
        String setName = externalLabelSetName;
×
159
        if (StringUtils.isBlank(setName) || setName.equals(SystemConfig.DEFAULTCURATIONLABELSET)) {
×
160
            if (this.getOwner() != null) {
×
161
                setName = this.getOwner().getEffectiveCurationLabelSetName();
×
162
            } else {
163
                setName = SystemConfig.CURATIONLABELSDISABLED;
×
164
            }
165
        }
166
        return setName;
×
167
    }
168

169
    public String getCurationLabelSetName() {
170
        if (externalLabelSetName == null) {
×
171
            return SystemConfig.DEFAULTCURATIONLABELSET;
×
172
        }
173
        return externalLabelSetName;
×
174
    }
175

176
    public void setCurationLabelSetName(String setName) {
177
        this.externalLabelSetName = setName;
×
178
    }
×
179
    
180
    /**
181
     * Should only be used in constructors for DvObjectContainers (Datasets and 
182
     * Collections), to make sure new entries are created and persisted in the 
183
     * database StorageUse table for every DvObject container we create.
184
     * @param storageUse 
185
     */
186
    public void setStorageUse(StorageUse storageUse) {
187
        this.storageUse = storageUse;
1✔
188
    }
1✔
189

190
    
191
    /* Dataverse collections and dataset can be configured to use different PidProviders as PID generators for contained objects (datasets or data files). 
192
     * This mechanism is similar to others except that the stored value is a JSON object defining the protocol, authority, shoulder, and, optionally, the separator for the PidProvider. 
193
     */
194
        
195
    public String getPidGeneratorSpecs() {
196
        return pidGeneratorSpecs;
1✔
197
    }
198

199
    public void setPidGeneratorSpecs(String pidGeneratorSpecs) {
200
        this.pidGeneratorSpecs = pidGeneratorSpecs;
1✔
201
    }
1✔
202

203
    // Used in JSF when selecting the PidGenerator
204
    // It only returns an id if this dvObjectContainer has PidGenerator specs set on it, otherwise it returns "default" 
205
    public String getPidGeneratorId() {
NEW
206
        if (StringUtils.isBlank(getPidGeneratorSpecs())) {
×
NEW
207
            return "default";
×
208
        } else {
NEW
209
            return getEffectivePidGenerator().getId();
×
210
        }
211
    }
212
   
213
    //Used in JSF when setting the PidGenerator
214
    public void setPidGeneratorId(String pidGeneratorId) {
215
        // Note that the "default" provider will not be found so will result in
216
        // setPidGenerator(null), which unsets the pidGenerator/Specs as desired
NEW
217
        setPidGenerator(PidUtil.getPidProvider(pidGeneratorId));
×
NEW
218
    }
×
219

220
    public void setPidGenerator(PidProvider pidGenerator) {
221
        this.pidGenerator = pidGenerator;
1✔
222
        if (pidGenerator != null) {
1✔
223
            JsonObjectBuilder job = jakarta.json.Json.createObjectBuilder();
1✔
224
            this.pidGeneratorSpecs = job.add("protocol", pidGenerator.getProtocol())
1✔
225
                    .add("authority", pidGenerator.getAuthority()).add("shoulder", pidGenerator.getShoulder())
1✔
226
                    .add("separator", pidGenerator.getSeparator()).build().toString();
1✔
227
        } else {
1✔
228
            this.pidGeneratorSpecs = null;
1✔
229
        }
230
    }
1✔
231

232
    public PidProvider getEffectivePidGenerator() {
233
        if (pidGenerator == null) {
1✔
234
            String specs = getPidGeneratorSpecs();
1✔
235
            if (StringUtils.isBlank(specs)) {
1✔
236
                GlobalId pid = getGlobalId();
1✔
237
                if ((pid != null) && PidUtil.getPidProvider(pid.getProviderId()).canCreatePidsLike(pid)) {
1✔
238
                    pidGenerator = PidUtil.getPidProvider(pid.getProviderId());
1✔
239
                } else {
240
                    if (getOwner() != null) {
1✔
241
                        pidGenerator = getOwner().getEffectivePidGenerator();
1✔
242
                    }
243
                }
244
            } else {
1✔
245
                JsonObject providerSpecs = JsonUtil.getJsonObject(specs);
1✔
246
                if (providerSpecs.containsKey("separator")) {
1✔
NEW
247
                    pidGenerator = PidUtil.getPidProvider(providerSpecs.getString("protocol"),
×
NEW
248
                            providerSpecs.getString("authority"), providerSpecs.getString("shoulder"),
×
NEW
249
                            providerSpecs.getString("separator"));
×
250
                } else {
251
                    pidGenerator = PidUtil.getPidProvider(providerSpecs.getString("protocol"),
1✔
252
                            providerSpecs.getString("authority"), providerSpecs.getString("shoulder"));
1✔
253
                }
254
            }
255
            if(pidGenerator!=null && pidGenerator.canManagePID()) {
1✔
256
                setPidGenerator(pidGenerator);
1✔
257
            } else {
258
                setPidGenerator(null);
1✔
259
            }
260
        }
261
        return pidGenerator;
1✔
262
    }
263

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