diff --git a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-webscript-context.xml b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-webscript-context.xml
index b4ec9ac3da..47eeba5a0a 100644
--- a/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-webscript-context.xml
+++ b/rm-server/config/alfresco/module/org_alfresco_module_rm/rm-webscript-context.xml
@@ -660,7 +660,14 @@
-
+
+
+
+
+
+
diff --git a/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/classification/clearancelevels.get.desc.xml b/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/classification/clearancelevels.get.desc.xml
new file mode 100644
index 0000000000..cb5eff3dbb
--- /dev/null
+++ b/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/classification/clearancelevels.get.desc.xml
@@ -0,0 +1,8 @@
+
+ Records Management Clearance Levels
+ Gets the list of clearance levels.
+ /api/clearance/levels
+
+ user
+ required
+
\ No newline at end of file
diff --git a/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/classification/clearancelevels.get.json.ftl b/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/classification/clearancelevels.get.json.ftl
new file mode 100644
index 0000000000..5a66d44be9
--- /dev/null
+++ b/rm-server/config/alfresco/templates/webscripts/org/alfresco/rma/classification/clearancelevels.get.json.ftl
@@ -0,0 +1,14 @@
+{
+ "data":
+ {
+ "items":
+ [
+ <#list levels as level>
+ {
+ "id": "${level.highestClassificationLevel.id?json_string}",
+ "displayLabel": "${level.displayLabel?json_string}"
+ }<#if level_has_next>,#if>
+ #list>
+ ]
+ }
+}
diff --git a/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/classification/ClearanceLevelsGet.java b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/classification/ClearanceLevelsGet.java
new file mode 100644
index 0000000000..a95b38ad82
--- /dev/null
+++ b/rm-server/source/java/org/alfresco/module/org_alfresco_module_rm/script/classification/ClearanceLevelsGet.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2005-2014 Alfresco Software Limited.
+ *
+ * This file is part of Alfresco
+ *
+ * Alfresco is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Alfresco is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Alfresco. If not, see .
+ */
+package org.alfresco.module.org_alfresco_module_rm.script.classification;
+
+import org.alfresco.module.org_alfresco_module_rm.classification.SecurityClearanceService;
+import org.alfresco.module.org_alfresco_module_rm.script.AbstractRmWebScript;
+import org.springframework.extensions.webscripts.Cache;
+import org.springframework.extensions.webscripts.Status;
+import org.springframework.extensions.webscripts.WebScriptRequest;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Implementation for Java backed webscript to get the clearance levels.
+ *
+ * @author David Webster
+ * @since 3.0
+ */
+public class ClearanceLevelsGet extends AbstractRmWebScript
+{
+ /** Constants */
+ private static final String LEVELS = "levels";
+
+ /** Classification service */
+ private SecurityClearanceService securityClearanceService;
+
+ /**
+ * Sets the classification service
+ *
+ * @param securityClearanceService The classification service
+ */
+ public void setSecurityClearanceService(SecurityClearanceService securityClearanceService)
+ {
+ this.securityClearanceService = securityClearanceService;
+ }
+
+ /**
+ * @see org.springframework.extensions.webscripts.DeclarativeWebScript#executeImpl(org.springframework.extensions.webscripts.WebScriptRequest,
+ * org.springframework.extensions.webscripts.Status,
+ * org.springframework.extensions.webscripts.Cache)
+ */
+ @Override
+ protected Map executeImpl(WebScriptRequest req, Status status, Cache cache)
+ {
+ Map result = new HashMap();
+ result.put(LEVELS, securityClearanceService.getClearanceLevels());
+ return result;
+ }
+}
diff --git a/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/script/classification/ClearanceLevelsGetUnitTest.java b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/script/classification/ClearanceLevelsGetUnitTest.java
new file mode 100644
index 0000000000..af0df8c29b
--- /dev/null
+++ b/rm-server/unit-test/java/org/alfresco/module/org_alfresco_module_rm/script/classification/ClearanceLevelsGetUnitTest.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2005-2015 Alfresco Software Limited.
+ *
+ * This file is part of Alfresco
+ *
+ * Alfresco is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Alfresco is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Alfresco. If not, see .
+ */
+
+package org.alfresco.module.org_alfresco_module_rm.script.classification;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.alfresco.module.org_alfresco_module_rm.classification.ClassificationLevel;
+import org.alfresco.module.org_alfresco_module_rm.classification.ClearanceLevel;
+import org.alfresco.module.org_alfresco_module_rm.classification.SecurityClearanceService;
+import org.alfresco.module.org_alfresco_module_rm.test.util.BaseWebScriptUnitTest;
+import org.json.JSONObject;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.springframework.extensions.webscripts.DeclarativeWebScript;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Mockito.doReturn;
+
+/**
+ * Tests for the get clearance levels API.
+ *
+ * @author David Webster
+ * @since 3.0
+ */
+public class ClearanceLevelsGetUnitTest extends BaseWebScriptUnitTest
+{
+ /** Classpath location of ftl template for web script */
+ private static final String WEBSCRIPT_TEMPLATE = WEBSCRIPT_ROOT_RM + "classification/clearancelevels.get.json.ftl";
+
+ /** ClearanceLevelsGet webscript instance */
+ private @Spy @InjectMocks ClearanceLevelsGet webScript;
+ private @Mock SecurityClearanceService mockSecurityClearanceService;
+
+ private List clearanceLevels;
+
+ /** {@inheritDoc} */
+ @Override
+ protected DeclarativeWebScript getWebScript()
+ {
+ return webScript;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ protected String getWebScriptTemplate()
+ {
+ return WEBSCRIPT_TEMPLATE;
+ }
+
+ /**
+ * Test the successful retrieval of two clearance levels.
+ */
+ @Test
+ public void getClearanceLevels() throws Exception
+ {
+ // Create test data.
+ ClassificationLevel classificationLevelOne = new ClassificationLevel("id1", "classificationLabelKey1");
+ ClassificationLevel classificationLevelTwo = new ClassificationLevel("id2", "classificationLabelKey2");
+ clearanceLevels = Arrays.asList(
+ new ClearanceLevel(classificationLevelOne, "labelKey1"),
+ new ClearanceLevel(classificationLevelTwo, "labelKey2"));
+
+ // setup interactions
+ doReturn(clearanceLevels).when(mockSecurityClearanceService).getClearanceLevels();
+
+ // execute web script
+ JSONObject json = executeJSONWebScript(new HashMap());
+ assertNotNull(json);
+ String actualJSONString = json.toString();
+
+ // check the JSON result using Jackson to allow easy equality testing.
+ ObjectMapper mapper = new ObjectMapper();
+ String expectedJSONString = "{\"data\":{\"items\":[{\"displayLabel\":\"labelKey1\",\"id\":\"id1\"},{\"displayLabel\":\"labelKey2\",\"id\":\"id2\"}]}}";
+ JsonNode expected = mapper.readTree(expectedJSONString);
+ assertEquals(expected, mapper.readTree(actualJSONString));
+ }
+}