Skip to content

Commit 1651f80

Browse files
committed
Added: metadata block selection and input level and facets setup fixed for addDaraverse API
1 parent 7840a02 commit 1651f80

File tree

4 files changed

+86
-44
lines changed

4 files changed

+86
-44
lines changed

src/main/java/edu/harvard/iq/dataverse/api/Dataverses.java

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -137,11 +137,19 @@ public Response addDataverse(@Context ContainerRequestContext crc, String body,
137137
}
138138

139139
try {
140-
JsonArray inputLevels = newDataverseJson.getJsonArray("inputLevels");
141-
List<DataverseFieldTypeInputLevel> newInputLevels = inputLevels != null ? parseInputLevels(inputLevels, newDataverse) : null;
140+
JsonObject metadataBlocksJson = newDataverseJson.getJsonObject("metadataBlocks");
141+
List<DataverseFieldTypeInputLevel> inputLevels = null;
142+
List<MetadataBlock> selectedMetadataBlocks = null;
143+
if (metadataBlocksJson != null) {
144+
JsonArray inputLevelsArray = metadataBlocksJson.getJsonArray("inputLevels");
145+
inputLevels = inputLevelsArray != null ? parseInputLevels(inputLevelsArray, newDataverse) : null;
146+
147+
JsonArray selectedMetadataBlocksArray = metadataBlocksJson.getJsonArray("metadataBlockNames");
148+
selectedMetadataBlocks = selectedMetadataBlocksArray != null ? parseNewDataverseMetadataBlocks(selectedMetadataBlocksArray) : null;
149+
}
142150

143-
JsonArray facetIds = newDataverseJson.getJsonArray("facetIds");
144-
List<DatasetFieldType> facetList = facetIds != null ? parseFacets(facetIds) : null;
151+
JsonArray facetIdsArray = newDataverseJson.getJsonArray("facetIds");
152+
List<DatasetFieldType> facetList = facetIdsArray != null ? parseFacets(facetIdsArray) : null;
145153

146154
if (!parentIdtf.isEmpty()) {
147155
Dataverse owner = findDataverseOrDie(parentIdtf);
@@ -154,7 +162,7 @@ public Response addDataverse(@Context ContainerRequestContext crc, String body,
154162
}
155163

156164
AuthenticatedUser u = getRequestAuthenticatedUserOrDie(crc);
157-
newDataverse = execCommand(new CreateDataverseCommand(newDataverse, createDataverseRequest(u), facetList, newInputLevels));
165+
newDataverse = execCommand(new CreateDataverseCommand(newDataverse, createDataverseRequest(u), facetList, inputLevels, selectedMetadataBlocks));
158166
return created("/dataverses/" + newDataverse.getAlias(), json(newDataverse));
159167
} catch (WrappedResponse ww) {
160168

@@ -183,7 +191,21 @@ public Response addDataverse(@Context ContainerRequestContext crc, String body,
183191

184192
}
185193
}
186-
194+
195+
private List<MetadataBlock> parseNewDataverseMetadataBlocks(JsonArray selectedMetadataBlocksArray) throws WrappedResponse {
196+
List<MetadataBlock> selectedMetadataBlocks = new ArrayList<>();
197+
for (JsonString metadataBlockName : selectedMetadataBlocksArray.getValuesAs(JsonString.class)) {
198+
MetadataBlock metadataBlock = metadataBlockSvc.findByName(metadataBlockName.getString());
199+
if (metadataBlock == null) {
200+
// TODO
201+
throw new WrappedResponse(badRequest("TODO"));
202+
}
203+
selectedMetadataBlocks.add(metadataBlock);
204+
}
205+
206+
return selectedMetadataBlocks;
207+
}
208+
187209
@POST
188210
@AuthRequired
189211
@Path("{identifier}/validateDatasetJson")

src/main/java/edu/harvard/iq/dataverse/engine/command/impl/CreateDataverseCommand.java

Lines changed: 39 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,24 @@
11
package edu.harvard.iq.dataverse.engine.command.impl;
22

3-
import edu.harvard.iq.dataverse.DatasetFieldType;
4-
import edu.harvard.iq.dataverse.Dataverse;
5-
import edu.harvard.iq.dataverse.DataverseFieldTypeInputLevel;
3+
import edu.harvard.iq.dataverse.*;
64
import edu.harvard.iq.dataverse.authorization.DataverseRole;
7-
import edu.harvard.iq.dataverse.RoleAssignment;
85
import edu.harvard.iq.dataverse.authorization.Permission;
96
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;
127
import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
138
import edu.harvard.iq.dataverse.authorization.users.User;
14-
import edu.harvard.iq.dataverse.batch.util.LoggingUtil;
159
import edu.harvard.iq.dataverse.engine.command.AbstractCommand;
1610
import edu.harvard.iq.dataverse.engine.command.CommandContext;
1711
import edu.harvard.iq.dataverse.engine.command.DataverseRequest;
1812
import edu.harvard.iq.dataverse.engine.command.RequiredPermissions;
1913
import edu.harvard.iq.dataverse.engine.command.exception.CommandException;
2014
import edu.harvard.iq.dataverse.engine.command.exception.IllegalCommandException;
2115
import edu.harvard.iq.dataverse.settings.SettingsServiceBean;
22-
import java.io.IOException;
2316

2417
import java.sql.Timestamp;
2518
import java.util.ArrayList;
2619
import java.util.Arrays;
2720
import java.util.Date;
2821
import java.util.List;
29-
import java.util.logging.Logger;
30-
import org.apache.solr.client.solrj.SolrServerException;
3122

3223
/**
3324
* TODO make override the date and user more active, so prevent code errors.
@@ -38,14 +29,23 @@
3829
@RequiredPermissions(Permission.AddDataverse)
3930
public class CreateDataverseCommand extends AbstractCommand<Dataverse> {
4031

41-
private static final Logger logger = Logger.getLogger(CreateDataverseCommand.class.getName());
42-
4332
private final Dataverse created;
4433
private final List<DataverseFieldTypeInputLevel> inputLevelList;
4534
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);
42+
}
4643

47-
public CreateDataverseCommand(Dataverse created, DataverseRequest aRequest, List<DatasetFieldType> facetList,
48-
List<DataverseFieldTypeInputLevel> inputLevelList) {
44+
public CreateDataverseCommand(Dataverse created,
45+
DataverseRequest aRequest,
46+
List<DatasetFieldType> facetList,
47+
List<DataverseFieldTypeInputLevel> inputLevelList,
48+
List<MetadataBlock> metadataBlocks) {
4949
super(aRequest, created.getOwner());
5050
this.created = created;
5151
if (facetList != null) {
@@ -58,6 +58,11 @@ public CreateDataverseCommand(Dataverse created, DataverseRequest aRequest, List
5858
} else {
5959
this.inputLevelList = null;
6060
}
61+
if (metadataBlocks != null) {
62+
this.metadataBlocks = new ArrayList<>(metadataBlocks);
63+
} else {
64+
this.metadataBlocks = null;
65+
}
6166
}
6267

6368
@Override
@@ -70,6 +75,11 @@ public Dataverse execute(CommandContext ctxt) throws CommandException {
7075
}
7176
}
7277

78+
if (metadataBlocks != null && !metadataBlocks.isEmpty()) {
79+
created.setMetadataBlockRoot(true);
80+
created.setMetadataBlocks(metadataBlocks);
81+
}
82+
7383
if (created.getCreateDate() == null) {
7484
created.setCreateDate(new Timestamp(new Date().getTime()));
7585
}
@@ -97,8 +107,8 @@ public Dataverse execute(CommandContext ctxt) throws CommandException {
97107
if (ctxt.dataverses().findByAlias(created.getAlias()) != null) {
98108
throw new IllegalCommandException("A dataverse with alias " + created.getAlias() + " already exists", this);
99109
}
100-
101-
if(created.getFilePIDsEnabled()!=null && !ctxt.settings().isTrueForKey(SettingsServiceBean.Key.AllowEnablingFilePIDsPerCollection, false)) {
110+
111+
if (created.getFilePIDsEnabled() != null && !ctxt.settings().isTrueForKey(SettingsServiceBean.Key.AllowEnablingFilePIDsPerCollection, false)) {
102112
throw new IllegalCommandException("File PIDs cannot be enabled per collection", this);
103113
}
104114

@@ -109,7 +119,7 @@ public Dataverse execute(CommandContext ctxt) throws CommandException {
109119
DataverseRole adminRole = ctxt.roles().findBuiltinRoleByAlias(DataverseRole.ADMIN);
110120
String privateUrlToken = null;
111121

112-
ctxt.roles().save(new RoleAssignment(adminRole, getRequest().getUser(), managedDv, privateUrlToken),false);
122+
ctxt.roles().save(new RoleAssignment(adminRole, getRequest().getUser(), managedDv, privateUrlToken), false);
113123
// Add additional role assignments if inheritance is set
114124
boolean inheritAllRoles = false;
115125
String rolesString = ctxt.settings().getValueForKey(SettingsServiceBean.Key.InheritParentRoleAssignments, "");
@@ -129,18 +139,18 @@ public Dataverse execute(CommandContext ctxt) throws CommandException {
129139
// above...
130140
if ((inheritAllRoles || rolesToInherit.contains(role.getRole().getAlias()))
131141
&& !(role.getAssigneeIdentifier().equals(getRequest().getUser().getIdentifier())
132-
&& role.getRole().equals(adminRole))) {
142+
&& role.getRole().equals(adminRole))) {
133143
String identifier = role.getAssigneeIdentifier();
134144
if (identifier.startsWith(AuthenticatedUser.IDENTIFIER_PREFIX)) {
135145
identifier = identifier.substring(AuthenticatedUser.IDENTIFIER_PREFIX.length());
136146
ctxt.roles().save(new RoleAssignment(role.getRole(),
137-
ctxt.authentication().getAuthenticatedUser(identifier), managedDv, privateUrlToken),false);
147+
ctxt.authentication().getAuthenticatedUser(identifier), managedDv, privateUrlToken), false);
138148
} else if (identifier.startsWith(Group.IDENTIFIER_PREFIX)) {
139149
identifier = identifier.substring(Group.IDENTIFIER_PREFIX.length());
140150
Group roleGroup = ctxt.groups().getGroup(identifier);
141151
if (roleGroup != null) {
142152
ctxt.roles().save(new RoleAssignment(role.getRole(),
143-
roleGroup, managedDv, privateUrlToken),false);
153+
roleGroup, managedDv, privateUrlToken), false);
144154
}
145155
}
146156
}
@@ -150,11 +160,9 @@ public Dataverse execute(CommandContext ctxt) throws CommandException {
150160
}
151161

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

156-
// ctxt.index().indexDataverse(managedDv);
157164
if (facetList != null) {
165+
managedDv.setFacetRoot(true);
158166
ctxt.facets().deleteFacetsFor(managedDv);
159167
int i = 0;
160168
for (DatasetFieldType df : facetList) {
@@ -164,16 +172,19 @@ public Dataverse execute(CommandContext ctxt) throws CommandException {
164172

165173
if (inputLevelList != null) {
166174
ctxt.fieldTypeInputLevels().deleteFacetsFor(managedDv);
167-
for (DataverseFieldTypeInputLevel obj : inputLevelList) {
168-
obj.setDataverse(managedDv);
169-
ctxt.fieldTypeInputLevels().create(obj);
175+
for (DataverseFieldTypeInputLevel inputLevel : inputLevelList) {
176+
inputLevel.setDataverse(managedDv);
177+
ctxt.fieldTypeInputLevels().create(inputLevel);
170178
}
171179
}
180+
181+
// TODO: save is called here and above; we likely don't need both
182+
managedDv = ctxt.dataverses().save(managedDv);
172183
return managedDv;
173184
}
174-
185+
175186
@Override
176-
public boolean onSuccess(CommandContext ctxt, Object r) {
187+
public boolean onSuccess(CommandContext ctxt, Object r) {
177188
return ctxt.dataverses().index((Dataverse) r);
178189
}
179190

src/test/java/edu/harvard/iq/dataverse/api/DataversesIT.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -933,16 +933,12 @@ public void testAddDataverse() {
933933
String apiToken = UtilIT.getApiTokenFromResponse(createUser);
934934
String testAliasSuffix = "-add-dataverse";
935935

936-
// Without optional input levels and facet ids
937-
String testDataverseAlias = UtilIT.getRandomDvAlias() + testAliasSuffix;
938-
Response createSubDataverseWithInputLevelsAndFacetIdsResponse = UtilIT.createSubDataverse(testDataverseAlias, null, apiToken, "root");
939-
createSubDataverseWithInputLevelsAndFacetIdsResponse.then().assertThat().statusCode(CREATED.getStatusCode());
940-
941936
// With optional input levels and facet ids
942937
String[] testInputLevelNames = {"geographicCoverage", "country"};
943938
String[] testFacetIds = {"authorName", "authorAffiliation"};
944-
testDataverseAlias = UtilIT.getRandomDvAlias() + testAliasSuffix;
945-
createSubDataverseWithInputLevelsAndFacetIdsResponse = UtilIT.createSubDataverse(testDataverseAlias, null, apiToken, "root", testInputLevelNames, testFacetIds);
939+
String[] testMetadataBlockNames = {"citation", "geospatial"};
940+
String testDataverseAlias = UtilIT.getRandomDvAlias() + testAliasSuffix;
941+
Response createSubDataverseWithInputLevelsAndFacetIdsResponse = UtilIT.createSubDataverse(testDataverseAlias, null, apiToken, "root", testInputLevelNames, testFacetIds, testMetadataBlockNames);
946942
createSubDataverseWithInputLevelsAndFacetIdsResponse.then().assertThat().statusCode(CREATED.getStatusCode());
947943

948944
// Assert facets are configured
@@ -956,6 +952,7 @@ public void testAddDataverse() {
956952

957953
// Assert input levels are configured
958954
Response listDataverseInputLevelsResponse = UtilIT.listDataverseInputLevels(testDataverseAlias, apiToken);
955+
listDataverseInputLevelsResponse.prettyPrint();
959956
String actualInputLevelName1 = listDataverseInputLevelsResponse.then().extract().path("data[0].datasetFieldTypeName");
960957
String actualInputLevelName2 = listDataverseInputLevelsResponse.then().extract().path("data[1].datasetFieldTypeName");
961958
assertNotEquals(actualFacetName1, actualFacetName2);

src/test/java/edu/harvard/iq/dataverse/api/UtilIT.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -360,10 +360,10 @@ static Response createDataverse(String alias, String category, String apiToken)
360360
}
361361

362362
static Response createSubDataverse(String alias, String category, String apiToken, String parentDV) {
363-
return createSubDataverse(alias, category, apiToken, parentDV, null, null);
363+
return createSubDataverse(alias, category, apiToken, parentDV, null, null, null);
364364
}
365365

366-
static Response createSubDataverse(String alias, String category, String apiToken, String parentDV, String[] inputLevelNames, String[] facetIds) {
366+
static Response createSubDataverse(String alias, String category, String apiToken, String parentDV, String[] inputLevelNames, String[] facetIds, String[] metadataBlockNames) {
367367
JsonArrayBuilder contactArrayBuilder = Json.createArrayBuilder();
368368
contactArrayBuilder.add(Json.createObjectBuilder().add("contactEmail", getEmailFromUserName(getRandomIdentifier())));
369369
JsonArrayBuilder subjectArrayBuilder = Json.createArrayBuilder();
@@ -376,6 +376,8 @@ static Response createSubDataverse(String alias, String category, String apiToke
376376
// don't send "dataverseType" if category is null, must be a better way
377377
.add(category != null ? "dataverseType" : "notTheKeyDataverseType", category != null ? category : "whatever");
378378

379+
JsonObjectBuilder metadataBlocksObjectBuilder = Json.createObjectBuilder();
380+
379381
if (inputLevelNames != null) {
380382
JsonArrayBuilder inputLevelsArrayBuilder = Json.createArrayBuilder();
381383
for(String inputLevelName : inputLevelNames) {
@@ -385,9 +387,19 @@ static Response createSubDataverse(String alias, String category, String apiToke
385387
.add("include", true)
386388
);
387389
}
388-
objectBuilder.add("inputLevels", inputLevelsArrayBuilder);
390+
metadataBlocksObjectBuilder.add("inputLevels", inputLevelsArrayBuilder);
389391
}
390392

393+
if (metadataBlockNames != null) {
394+
JsonArrayBuilder metadataBlockNamesArrayBuilder = Json.createArrayBuilder();
395+
for(String metadataBlockName : metadataBlockNames) {
396+
metadataBlockNamesArrayBuilder.add(metadataBlockName);
397+
}
398+
metadataBlocksObjectBuilder.add("metadataBlockNames", metadataBlockNamesArrayBuilder);
399+
}
400+
401+
objectBuilder.add("metadataBlocks", metadataBlocksObjectBuilder);
402+
391403
if (facetIds != null) {
392404
JsonArrayBuilder facetIdsArrayBuilder = Json.createArrayBuilder();
393405
for(String facetId : facetIds) {

0 commit comments

Comments
 (0)