added config hal link to SubmissionAccessOption rest object and refactored converter

This commit is contained in:
Mykhaylo
2021-12-16 13:28:10 +01:00
parent a617ef8bc0
commit 7f42095f19
6 changed files with 86 additions and 50 deletions

View File

@@ -30,6 +30,7 @@ public class SubmissionStepConfig implements Serializable {
public static final String INPUT_FORM_STEP_NAME = "submission-form";
public static final String UPLOAD_STEP_NAME = "upload";
public static final String ACCESS_CONDITION_STEP_NAME = "accessCondition";
/*
* The identifier for the Select Collection step

View File

@@ -6,9 +6,15 @@
* http://www.dspace.org/license/
*/
package org.dspace.app.rest.converter;
import java.text.ParseException;
import org.apache.commons.lang3.StringUtils;
import org.dspace.app.rest.model.AccessConditionOptionRest;
import org.dspace.app.rest.model.SubmissionAccessOptionRest;
import org.dspace.app.rest.projection.Projection;
import org.dspace.submit.model.AccessConditionConfiguration;
import org.dspace.submit.model.AccessConditionOption;
import org.dspace.util.DateMathParser;
import org.springframework.stereotype.Component;
/**
@@ -21,12 +27,37 @@ import org.springframework.stereotype.Component;
public class SubmissionAccessOptionConverter
implements DSpaceConverter<AccessConditionConfiguration, SubmissionAccessOptionRest> {
DateMathParser dateMathParser = new DateMathParser();
@Override
public SubmissionAccessOptionRest convert(AccessConditionConfiguration obj, Projection projection) {
public SubmissionAccessOptionRest convert(AccessConditionConfiguration config, Projection projection) {
SubmissionAccessOptionRest model = new SubmissionAccessOptionRest();
model.setId(obj.getName());
model.setDiscoverable(obj.getDiscoverable());
model.setAccessConditionOptions(obj.getOptions());
model.setId(config.getName());
model.setDiscoverable(config.getDiscoverable());
model.setProjection(projection);
for (AccessConditionOption option : config.getOptions()) {
AccessConditionOptionRest optionRest = new AccessConditionOptionRest();
optionRest.setHasStartDate(option.getHasStartDate());
optionRest.setHasEndDate(option.getHasEndDate());
if (StringUtils.isNotBlank(option.getStartDateLimit())) {
try {
optionRest.setMaxStartDate(dateMathParser.parseMath(option.getStartDateLimit()));
} catch (ParseException e) {
throw new IllegalStateException("Wrong start date limit configuration for the access condition "
+ "option named " + option.getName());
}
}
if (StringUtils.isNotBlank(option.getEndDateLimit())) {
try {
optionRest.setMaxEndDate(dateMathParser.parseMath(option.getEndDateLimit()));
} catch (ParseException e) {
throw new IllegalStateException("Wrong end date limit configuration for the access condition "
+ "option named " + option.getName());
}
}
optionRest.setName(option.getName());
model.getAccessConditionOptions().add(optionRest);
}
return model;
}

View File

@@ -6,13 +6,14 @@
* http://www.dspace.org/license/
*/
package org.dspace.app.rest.link;
import static org.dspace.app.rest.model.SubmissionFormRest.NAME_LINK_ON_PANEL;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
import java.util.LinkedList;
import org.atteo.evo.inflector.English;
import org.dspace.app.rest.RestResourceController;
import org.dspace.app.rest.model.SubmissionAccessOptionRest;
import org.dspace.app.rest.model.SubmissionFormRest;
import org.dspace.app.rest.model.SubmissionSectionRest;
import org.dspace.app.rest.model.SubmissionUploadRest;
@@ -36,26 +37,22 @@ public class SubmissionSectionHalLinkFactory extends HalLinkFactory<SubmissionSe
SubmissionSectionRest sd = halResource.getContent();
if (SubmissionStepConfig.INPUT_FORM_STEP_NAME.equals(sd.getSectionType())) {
UriComponentsBuilder uriComponentsBuilder = linkTo(
getMethodOn(SubmissionFormRest.CATEGORY, SubmissionFormRest.NAME)
.findRel(null, null, SubmissionFormRest.CATEGORY, English.plural(SubmissionFormRest.NAME),
sd.getId(), "", null, null))
.toUriComponentsBuilder();
String uribuilder = uriComponentsBuilder.build().toString();
list.add(
buildLink(SubmissionFormRest.NAME_LINK_ON_PANEL, uribuilder.substring(0, uribuilder.lastIndexOf("/"))));
buildLink(list, sd, SubmissionFormRest.CATEGORY, SubmissionFormRest.NAME);
}
if (SubmissionStepConfig.UPLOAD_STEP_NAME.equals(sd.getSectionType())) {
UriComponentsBuilder uriComponentsBuilder = linkTo(
getMethodOn(RestResourceController.class, SubmissionUploadRest.CATEGORY, SubmissionUploadRest.NAME)
.findRel(null, null, SubmissionUploadRest.CATEGORY, English.plural(SubmissionUploadRest.NAME),
sd.getId(), "", null, null))
.toUriComponentsBuilder();
String uribuilder = uriComponentsBuilder.build().toString();
list.add(
buildLink(SubmissionFormRest.NAME_LINK_ON_PANEL, uribuilder.substring(0, uribuilder.lastIndexOf("/"))));
buildLink(list, sd, SubmissionUploadRest.CATEGORY, SubmissionUploadRest.NAME);
}
if (SubmissionStepConfig.ACCESS_CONDITION_STEP_NAME.equals(sd.getSectionType())) {
buildLink(list, sd, SubmissionAccessOptionRest.CATEGORY, SubmissionAccessOptionRest.NAME);
}
}
private void buildLink(final LinkedList<Link> list, SubmissionSectionRest sd, String category, String name) {
UriComponentsBuilder uriComponentsBuilder = linkTo(getMethodOn(category, name)
.findRel(null, null, category, English.plural(name), sd.getId(), "", null, null))
.toUriComponentsBuilder();
String uribuilder = uriComponentsBuilder.build().toString();
list.add(buildLink(NAME_LINK_ON_PANEL, uribuilder.substring(0, uribuilder.lastIndexOf("/"))));
}
protected Class<RestResourceController> getControllerClass() {

View File

@@ -12,7 +12,6 @@ import java.util.Objects;
import com.fasterxml.jackson.annotation.JsonIgnore;
import org.dspace.app.rest.RestResourceController;
import org.dspace.submit.model.AccessConditionOption;
/**
* The Access Condition Section Configuration REST Resource
@@ -31,7 +30,7 @@ public class SubmissionAccessOptionRest extends BaseObjectRest<String> {
private Boolean discoverable;
private List<AccessConditionOption> accessConditionOptions;
private List<AccessConditionOptionRest> accessConditionOptions;
public String getId() {
return id;
@@ -49,14 +48,14 @@ public class SubmissionAccessOptionRest extends BaseObjectRest<String> {
this.discoverable = discoverable;
}
public List<AccessConditionOption> getAccessConditionOptions() {
public List<AccessConditionOptionRest> getAccessConditionOptions() {
if (Objects.isNull(accessConditionOptions)) {
accessConditionOptions = new ArrayList<>();
}
return accessConditionOptions;
}
public void setAccessConditionOptions(List<AccessConditionOption> accessConditionOptions) {
public void setAccessConditionOptions(List<AccessConditionOptionRest> accessConditionOptions) {
this.accessConditionOptions = accessConditionOptions;
}

View File

@@ -41,11 +41,11 @@ public class SubmissionAccessOptionRestRepositoryIT extends AbstractControllerIn
.andExpect(jsonPath("$.discoverable", is(true)))
.andExpect(jsonPath("$.accessConditionOptions", Matchers.containsInAnyOrder(
AccessConditionOptionMatcher.matchAccessConditionOption(
"openaccess","Anonymous", false , false, null, null),
"openaccess", false , false, null, null),
AccessConditionOptionMatcher.matchAccessConditionOption(
"embargo","Anonymous", true , false, "+36MONTHS", null),
"embargo", true , false, "+36MONTHS", null),
AccessConditionOptionMatcher.matchAccessConditionOption(
"administrator","Administrator", false , false, null, null))
"administrator", false , false, null, null))
))
.andExpect(jsonPath("$.type", is("submissionaccessoption")));
@@ -56,13 +56,13 @@ public class SubmissionAccessOptionRestRepositoryIT extends AbstractControllerIn
.andExpect(jsonPath("$.id", is("defaultAC")))
.andExpect(jsonPath("$.discoverable", is(true)))
.andExpect(jsonPath("$.accessConditionOptions", Matchers.containsInAnyOrder(
AccessConditionOptionMatcher.matchAccessConditionOption(
"openaccess","Anonymous", false , false, null, null),
AccessConditionOptionMatcher.matchAccessConditionOption(
"embargo","Anonymous", true , false, "+36MONTHS", null),
AccessConditionOptionMatcher.matchAccessConditionOption(
"administrator","Administrator", false , false, null, null))
))
AccessConditionOptionMatcher.matchAccessConditionOption(
"openaccess", false , false, null, null),
AccessConditionOptionMatcher.matchAccessConditionOption(
"embargo", true , false, "+36MONTHS", null),
AccessConditionOptionMatcher.matchAccessConditionOption(
"administrator", false , false, null, null))
))
.andExpect(jsonPath("$.type", is("submissionaccessoption")));
getClient().perform(get("/api/config/submissionaccessoptions/defaultAC"))
@@ -70,13 +70,13 @@ public class SubmissionAccessOptionRestRepositoryIT extends AbstractControllerIn
.andExpect(jsonPath("$.id", is("defaultAC")))
.andExpect(jsonPath("$.discoverable", is(true)))
.andExpect(jsonPath("$.accessConditionOptions", Matchers.containsInAnyOrder(
AccessConditionOptionMatcher.matchAccessConditionOption(
"openaccess","Anonymous", false , false, null, null),
AccessConditionOptionMatcher.matchAccessConditionOption(
"embargo","Anonymous", true , false, "+36MONTHS", null),
AccessConditionOptionMatcher.matchAccessConditionOption(
"administrator","Administrator", false , false, null, null))
))
AccessConditionOptionMatcher.matchAccessConditionOption(
"openaccess", false , false, null, null),
AccessConditionOptionMatcher.matchAccessConditionOption(
"embargo", true , false, "+36MONTHS", null),
AccessConditionOptionMatcher.matchAccessConditionOption(
"administrator", false , false, null, null))
))
.andExpect(jsonPath("$.type", is("submissionaccessoption")));
}

View File

@@ -6,11 +6,15 @@
* http://www.dspace.org/license/
*/
package org.dspace.app.rest.matcher;
import static com.jayway.jsonpath.matchers.JsonPathMatchers.hasJsonPath;
import static com.jayway.jsonpath.matchers.JsonPathMatchers.hasNoJsonPath;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import java.util.Objects;
import org.apache.commons.lang.StringUtils;
import org.hamcrest.Matcher;
/**
@@ -23,15 +27,19 @@ public class AccessConditionOptionMatcher {
private AccessConditionOptionMatcher() {}
public static Matcher<? super Object> matchAccessConditionOption(String name, String groupName,
boolean hasStartDate, boolean hasEndDate, String startDateLimit, String endDateLimit) {
public static Matcher<? super Object> matchAccessConditionOption(String name,
Boolean hasStartDate, Boolean hasEndDate, String maxStartDate, String maxEndDate) {
return allOf(
hasJsonPath("$.name", is(name)),
hasJsonPath("$.groupName", is(groupName)),
hasJsonPath("$.hasStartDate", is(hasStartDate)),
hasJsonPath("$.hasEndDate", is(hasEndDate)),
hasJsonPath("$.startDateLimit", is(startDateLimit)),
hasJsonPath("$.endDateLimit", is(endDateLimit))
Objects.nonNull(hasStartDate) ? hasJsonPath("$.hasStartDate", is(hasStartDate))
: hasNoJsonPath("$.hasStartDate"),
Objects.nonNull(hasEndDate) ? hasJsonPath("$.hasEndDate", is(hasEndDate))
: hasNoJsonPath("$.hasEndDate"),
StringUtils.isNotBlank(maxStartDate) ? hasJsonPath("$.maxStartDate", notNullValue())
: hasNoJsonPath("$.maxStartDate"),
StringUtils.isNotBlank(maxEndDate) ? hasJsonPath("$.maxEndDate", notNullValue())
: hasNoJsonPath("$.maxEndDate")
);
}
}