/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE and NOTICE files at the root of the source * tree and available online at * * http://www.dspace.org/license/ */ package org.dspace.builder; import java.sql.SQLException; import java.time.Instant; import jakarta.validation.constraints.NotNull; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.dspace.app.requestitem.RequestItem; import org.dspace.app.requestitem.service.RequestItemService; import org.dspace.content.Bitstream; import org.dspace.content.Item; import org.dspace.core.Context; /** * Manage the creation and cleanup of {@link RequestItem}s for testing. * * @author Mark H. Wood */ public class RequestItemBuilder extends AbstractBuilder { private static final Logger LOG = LogManager.getLogger(); public static final String REQ_EMAIL = "jsmith@example.com"; public static final String REQ_NAME = "John Smith"; public static final String REQ_MESSAGE = "Please send me a copy of this."; public static final String REQ_PATH = "test/file"; private RequestItem requestItem; private Item item; private Bitstream bitstream; private Instant decisionDate; private boolean accepted; private String accessToken = null; private Instant accessExpiry = null; private boolean allFiles; protected RequestItemBuilder(Context context) { super(context); } /** * Initialize a RequestItem. * * @param ctx current DSpace session. * @param item the requested Item. * @param bitstream the single requested Bitstream, or null for "all files". * @return a builder initialized for this request. */ public static RequestItemBuilder createRequestItem(Context ctx, @NotNull Item item, Bitstream bitstream) { RequestItemBuilder builder = new RequestItemBuilder(ctx); return builder.create(item, bitstream); } private RequestItemBuilder create(Item item, Bitstream bitstream) { this.item = item; this.bitstream = bitstream; return this; } /** * Set the date on which a decision was made concerning this request. * * @param date the date of the decision. * @return this builder. */ public RequestItemBuilder withDecisionDate(Instant date) { this.decisionDate = date; return this; } /** * Set whether request has been accepted. Does not set the decision * date. * * @param accepted true if request is accepted. * @return this builder. */ public RequestItemBuilder withAcceptRequest(boolean accepted) { this.accepted = accepted; return this; } public RequestItemBuilder withAccessToken(String accessToken) { this.accessToken = accessToken; return this; } public RequestItemBuilder withAccessExpiry(Instant accessExpiry) { this.accessExpiry = accessExpiry; return this; } public RequestItemBuilder withAllFiles(boolean allFiles) { this.allFiles = allFiles; return this; } @Override public RequestItem build() { LOG.atDebug() .withLocation() .log("Building request with item ID {} and bitstream ID {} and allfiles {}", () -> item.getID().toString(), () -> (bitstream == null ? "" : bitstream.getID().toString()), () -> Boolean.toString(allFiles)); String token; try { token = requestItemService.createRequest(context, bitstream, item, (null == bitstream), REQ_EMAIL, REQ_NAME, REQ_MESSAGE); } catch (SQLException ex) { return handleException(ex); } requestItem = requestItemService.findByToken(context, token); requestItem.setAccept_request(accepted); requestItem.setDecision_date(decisionDate); if (accessToken != null) { requestItem.setAccess_token(accessToken); } requestItem.setAccess_expiry(accessExpiry); requestItem.setAllfiles(allFiles); requestItemService.update(context, requestItem); return requestItem; } @Override public void cleanup() throws Exception { LOG.debug("cleanup()"); try ( Context ctx = new Context(); ) { ctx.setDispatcher("noindex"); ctx.turnOffAuthorisationSystem(); requestItem = ctx.reloadEntity(requestItem); if (null != requestItem) { delete(ctx, requestItem); ctx.complete(); requestItem = null; } else { LOG.debug("nothing to clean up."); } } } @Override public void delete(Context context, RequestItem request) throws Exception { requestItemService.delete(context, request); } /** * Delete a request identified by its token. If no such token is known, * simply return. * * @param token the token identifying the request. * @throws java.sql.SQLException passed through */ static public void deleteRequestItem(String token) throws SQLException { LOG.atDebug() .withLocation() .log("Delete RequestItem with token {}", token); try (Context context = new Context()) { RequestItem request = requestItemService.findByToken(context, token); if (null == request) { return; } requestItemService.delete(context, request); context.complete(); } } @Override protected RequestItemService getService() { return requestItemService; } }