diff --git a/dspace-server-webapp/src/main/java/org/dspace/app/rest/submit/factory/impl/CCLicenseRemovePatchOperation.java b/dspace-server-webapp/src/main/java/org/dspace/app/rest/submit/factory/impl/CCLicenseRemovePatchOperation.java
new file mode 100644
index 0000000000..19229a4f72
--- /dev/null
+++ b/dspace-server-webapp/src/main/java/org/dspace/app/rest/submit/factory/impl/CCLicenseRemovePatchOperation.java
@@ -0,0 +1,50 @@
+/**
+ * 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.app.rest.submit.factory.impl;
+
+import org.dspace.content.InProgressSubmission;
+import org.dspace.content.Item;
+import org.dspace.core.Context;
+import org.dspace.license.service.CreativeCommonsService;
+import org.dspace.services.model.Request;
+import org.springframework.beans.factory.annotation.Autowired;
+
+
+/**
+ * Submission "remove" PATCH operation
+ *
+ * To remove the Creative Commons License of a workspace item.
+ *
+ * Example:
+ * curl -X PATCH http://${dspace.server.url}/api/submission/workspaceitems/31599 -H "Content-Type:
+ * application/json" -d '[{ "op": "remove", "path": "/sections/cclicense/uri"}]'
+ *
+ */
+public class CCLicenseRemovePatchOperation extends RemovePatchOperation {
+
+ @Autowired
+ CreativeCommonsService creativeCommonsService;
+
+ @Override
+ protected Class getArrayClassForEvaluation() {
+ return String[].class;
+ }
+
+ @Override
+ protected Class getClassForEvaluation() {
+ return String.class;
+ }
+
+ @Override
+ void remove(Context context, Request currentRequest, InProgressSubmission source, String path, Object value)
+ throws Exception {
+ Item item = source.getItem();
+ creativeCommonsService.removeLicense(context, item);
+ }
+
+}
diff --git a/dspace-server-webapp/src/main/resources/spring/spring-dspace-core-services.xml b/dspace-server-webapp/src/main/resources/spring/spring-dspace-core-services.xml
index 2b37ea5bdd..9faad91985 100644
--- a/dspace-server-webapp/src/main/resources/spring/spring-dspace-core-services.xml
+++ b/dspace-server-webapp/src/main/resources/spring/spring-dspace-core-services.xml
@@ -81,6 +81,10 @@
+
+
+
diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/CCLicenseAddPatchOperationIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/CCLicenseAddPatchOperationIT.java
index ba58e5f489..76b260f194 100644
--- a/dspace-server-webapp/src/test/java/org/dspace/app/rest/CCLicenseAddPatchOperationIT.java
+++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/CCLicenseAddPatchOperationIT.java
@@ -7,7 +7,11 @@
*/
package org.dspace.app.rest;
+import static com.jayway.jsonpath.matchers.JsonPathMatchers.hasJsonPath;
+import static org.hamcrest.Matchers.allOf;
+import static org.hamcrest.Matchers.is;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import java.util.ArrayList;
@@ -26,7 +30,7 @@ import org.dspace.content.WorkspaceItem;
import org.junit.Test;
/**
- * Class to the methods from the CCLicenseAddPatchOperation
+ * Class to test the methods from the CCLicenseAddPatchOperation
* Since the CC Licenses are obtained from the CC License API, a mock service has been implemented
* This mock service will return a fixed set of CC Licenses using a similar structure to the ones obtained from the
* CC License API.
@@ -54,7 +58,8 @@ public class CCLicenseAddPatchOperationIT extends AbstractControllerIntegrationT
String adminToken = getAuthToken(admin.getEmail(), password);
List ops = new ArrayList();
- AddOperation addOperation = new AddOperation("/sections/cclicense/uri", "license-uri");
+ AddOperation addOperation = new AddOperation("/sections/cclicense/uri",
+ "http://creativecommons.org/licenses/by-nc-sa/4.0/");
ops.add(addOperation);
String patchBody = getPatchContent(ops);
@@ -63,7 +68,13 @@ public class CCLicenseAddPatchOperationIT extends AbstractControllerIntegrationT
getClient(adminToken).perform(patch("/api/submission/workspaceitems/" + workspaceItem.getID())
.content(patchBody)
.contentType(MediaType.APPLICATION_JSON_PATCH_JSON))
- .andExpect(status().isOk());
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.sections.cclicense", allOf(
+ hasJsonPath("$.uri", is("http://creativecommons.org/licenses/by-nc-sa/4.0/")),
+ hasJsonPath("$.rights",
+ is("Attribution-NonCommercial-ShareAlike 4.0 International")),
+ hasJsonPath("$.file.name", is("license_rdf"))
+ )));
}
@Test
diff --git a/dspace-server-webapp/src/test/java/org/dspace/app/rest/CCLicenseRemovePatchOperationIT.java b/dspace-server-webapp/src/test/java/org/dspace/app/rest/CCLicenseRemovePatchOperationIT.java
new file mode 100644
index 0000000000..b908b7acd7
--- /dev/null
+++ b/dspace-server-webapp/src/test/java/org/dspace/app/rest/CCLicenseRemovePatchOperationIT.java
@@ -0,0 +1,99 @@
+/**
+ * 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.app.rest;
+
+import static com.jayway.jsonpath.matchers.JsonPathMatchers.hasJsonPath;
+import static org.hamcrest.Matchers.allOf;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.ws.rs.core.MediaType;
+
+import org.dspace.app.rest.builder.CollectionBuilder;
+import org.dspace.app.rest.builder.CommunityBuilder;
+import org.dspace.app.rest.builder.WorkspaceItemBuilder;
+import org.dspace.app.rest.model.patch.AddOperation;
+import org.dspace.app.rest.model.patch.Operation;
+import org.dspace.app.rest.model.patch.RemoveOperation;
+import org.dspace.app.rest.test.AbstractControllerIntegrationTest;
+import org.dspace.content.Collection;
+import org.dspace.content.Community;
+import org.dspace.content.WorkspaceItem;
+import org.junit.Test;
+
+/**
+ * Class to test the methods from the CCLicenseRemovePatchOperation
+ * Since the CC Licenses are obtained from the CC License API, a mock service has been implemented
+ * This mock service will return a fixed set of CC Licenses using a similar structure to the ones obtained from the
+ * CC License API.
+ * Refer to {@link org.dspace.license.MockCCLicenseConnectorServiceImpl} for more information
+ */
+public class CCLicenseRemovePatchOperationIT extends AbstractControllerIntegrationTest {
+
+
+ @Test
+ public void patchRemoveSubmissionCCLicense() throws Exception {
+ context.turnOffAuthorisationSystem();
+
+ Community community = CommunityBuilder.createCommunity(context)
+ .withName("Community")
+ .build();
+
+ Collection collection = CollectionBuilder.createCollection(context, community)
+ .withName("Collection")
+ .build();
+
+ WorkspaceItem workspaceItem = WorkspaceItemBuilder.createWorkspaceItem(context, collection)
+ .withTitle("Workspace Item")
+ .build();
+
+ String adminToken = getAuthToken(admin.getEmail(), password);
+
+ // First add a license and verify it is added
+ List ops = new ArrayList();
+ AddOperation addOperation = new AddOperation("/sections/cclicense/uri",
+ "http://creativecommons.org/licenses/by-nc-sa/4.0/");
+
+ ops.add(addOperation);
+ String patchBody = getPatchContent(ops);
+
+
+ getClient(adminToken).perform(patch("/api/submission/workspaceitems/" + workspaceItem.getID())
+ .content(patchBody)
+ .contentType(MediaType.APPLICATION_JSON_PATCH_JSON))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.sections.cclicense", allOf(
+ hasJsonPath("$.uri", is("http://creativecommons.org/licenses/by-nc-sa/4.0/")),
+ hasJsonPath("$.rights",
+ is("Attribution-NonCommercial-ShareAlike 4.0 International")),
+ hasJsonPath("$.file.name", is("license_rdf"))
+ )));
+
+
+
+ // Remove the license again and verify it is removed
+
+ List removeOps = new ArrayList();
+ RemoveOperation removeOperation = new RemoveOperation("/sections/cclicense/uri");
+
+ removeOps.add(removeOperation);
+ String removePatch = getPatchContent(removeOps);
+
+
+ getClient(adminToken).perform(patch("/api/submission/workspaceitems/" + workspaceItem.getID())
+ .content(removePatch)
+ .contentType(MediaType.APPLICATION_JSON_PATCH_JSON))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.sections", not(hasJsonPath("cclicense"))));
+ }
+}