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 INPUT_FORM_STEP_NAME = "submission-form";
public static final String UPLOAD_STEP_NAME = "upload"; public static final String UPLOAD_STEP_NAME = "upload";
public static final String ACCESS_CONDITION_STEP_NAME = "accessCondition";
/* /*
* The identifier for the Select Collection step * The identifier for the Select Collection step

View File

@@ -6,9 +6,15 @@
* http://www.dspace.org/license/ * http://www.dspace.org/license/
*/ */
package org.dspace.app.rest.converter; 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.model.SubmissionAccessOptionRest;
import org.dspace.app.rest.projection.Projection; import org.dspace.app.rest.projection.Projection;
import org.dspace.submit.model.AccessConditionConfiguration; import org.dspace.submit.model.AccessConditionConfiguration;
import org.dspace.submit.model.AccessConditionOption;
import org.dspace.util.DateMathParser;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
/** /**
@@ -21,12 +27,37 @@ import org.springframework.stereotype.Component;
public class SubmissionAccessOptionConverter public class SubmissionAccessOptionConverter
implements DSpaceConverter<AccessConditionConfiguration, SubmissionAccessOptionRest> { implements DSpaceConverter<AccessConditionConfiguration, SubmissionAccessOptionRest> {
DateMathParser dateMathParser = new DateMathParser();
@Override @Override
public SubmissionAccessOptionRest convert(AccessConditionConfiguration obj, Projection projection) { public SubmissionAccessOptionRest convert(AccessConditionConfiguration config, Projection projection) {
SubmissionAccessOptionRest model = new SubmissionAccessOptionRest(); SubmissionAccessOptionRest model = new SubmissionAccessOptionRest();
model.setId(obj.getName()); model.setId(config.getName());
model.setDiscoverable(obj.getDiscoverable()); model.setDiscoverable(config.getDiscoverable());
model.setAccessConditionOptions(obj.getOptions()); 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; return model;
} }

View File

@@ -6,13 +6,14 @@
* http://www.dspace.org/license/ * http://www.dspace.org/license/
*/ */
package org.dspace.app.rest.link; 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 static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;
import java.util.LinkedList; import java.util.LinkedList;
import org.atteo.evo.inflector.English; import org.atteo.evo.inflector.English;
import org.dspace.app.rest.RestResourceController; 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.SubmissionFormRest;
import org.dspace.app.rest.model.SubmissionSectionRest; import org.dspace.app.rest.model.SubmissionSectionRest;
import org.dspace.app.rest.model.SubmissionUploadRest; import org.dspace.app.rest.model.SubmissionUploadRest;
@@ -36,26 +37,22 @@ public class SubmissionSectionHalLinkFactory extends HalLinkFactory<SubmissionSe
SubmissionSectionRest sd = halResource.getContent(); SubmissionSectionRest sd = halResource.getContent();
if (SubmissionStepConfig.INPUT_FORM_STEP_NAME.equals(sd.getSectionType())) { if (SubmissionStepConfig.INPUT_FORM_STEP_NAME.equals(sd.getSectionType())) {
UriComponentsBuilder uriComponentsBuilder = linkTo( buildLink(list, sd, SubmissionFormRest.CATEGORY, SubmissionFormRest.NAME);
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("/"))));
} }
if (SubmissionStepConfig.UPLOAD_STEP_NAME.equals(sd.getSectionType())) { if (SubmissionStepConfig.UPLOAD_STEP_NAME.equals(sd.getSectionType())) {
UriComponentsBuilder uriComponentsBuilder = linkTo( buildLink(list, sd, SubmissionUploadRest.CATEGORY, SubmissionUploadRest.NAME);
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("/"))));
} }
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() { protected Class<RestResourceController> getControllerClass() {

View File

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

View File

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

View File

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