Added delete key in setting controllers

Change-Id: I82484d0a94d74cf42a68647310e37611e15a62b6
diff --git a/core/src/main/java/de/ids_mannheim/korap/constant/OAuth2Scope.java b/core/src/main/java/de/ids_mannheim/korap/constant/OAuth2Scope.java
index 0d1b280..ffcf431 100644
--- a/core/src/main/java/de/ids_mannheim/korap/constant/OAuth2Scope.java
+++ b/core/src/main/java/de/ids_mannheim/korap/constant/OAuth2Scope.java
@@ -45,7 +45,8 @@
     VC_ACCESS_INFO, 
     
     CREATE_DEFAULT_SETTING, 
-    SETTING_INFO;
+    READ_DEFAULT_SETTING, 
+    DELETE_DEFAULT_SETTING;
 
     @Override
     public String toString () {
diff --git a/core/src/main/java/de/ids_mannheim/korap/user/DataFactory.java b/core/src/main/java/de/ids_mannheim/korap/user/DataFactory.java
index 5ddf187..888ebb6 100644
--- a/core/src/main/java/de/ids_mannheim/korap/user/DataFactory.java
+++ b/core/src/main/java/de/ids_mannheim/korap/user/DataFactory.java
@@ -17,6 +17,8 @@
 import de.ids_mannheim.korap.utils.JsonUtils;
 
 /**
+ * EM: util class
+ * 
  * @author hanl, margaretha
  * @date 27/01/2016
  */
diff --git a/core/src/main/java/de/ids_mannheim/korap/user/User.java b/core/src/main/java/de/ids_mannheim/korap/user/User.java
index 5decd6a..7aa4f57 100644
--- a/core/src/main/java/de/ids_mannheim/korap/user/User.java
+++ b/core/src/main/java/de/ids_mannheim/korap/user/User.java
@@ -37,7 +37,7 @@
     private ParamFields fields;
     @Getter(AccessLevel.PRIVATE)
     @Setter(AccessLevel.PRIVATE)
-    private UserSettings settings;
+    private UserSettingProcessor settings;
     //todo: remove!
     @Getter(AccessLevel.PRIVATE)
     @Setter(AccessLevel.PRIVATE)
diff --git a/core/src/main/java/de/ids_mannheim/korap/user/UserSettings.java b/core/src/main/java/de/ids_mannheim/korap/user/UserSettingProcessor.java
similarity index 75%
rename from core/src/main/java/de/ids_mannheim/korap/user/UserSettings.java
rename to core/src/main/java/de/ids_mannheim/korap/user/UserSettingProcessor.java
index 9bc145d..df11e40 100644
--- a/core/src/main/java/de/ids_mannheim/korap/user/UserSettings.java
+++ b/core/src/main/java/de/ids_mannheim/korap/user/UserSettingProcessor.java
@@ -6,20 +6,20 @@
  * @author hanl, margaretha
  * @date 28/01/2016
  */
-public class UserSettings extends Userdata {
+public class UserSettingProcessor extends Userdata {
 
-    public UserSettings() {
+    public UserSettingProcessor() {
 
     }
 
     @Deprecated
-    public UserSettings(Integer userid) {
+    public UserSettingProcessor(Integer userid) {
         super(userid);
     }
 
     // EM: added
-    public UserSettings(String username) {
-        super(username);
+    public UserSettingProcessor(String data) {
+        super(data);
     }
 
     @Override
diff --git a/core/src/main/java/de/ids_mannheim/korap/user/Userdata.java b/core/src/main/java/de/ids_mannheim/korap/user/Userdata.java
index d0135c8..2d1693e 100644
--- a/core/src/main/java/de/ids_mannheim/korap/user/Userdata.java
+++ b/core/src/main/java/de/ids_mannheim/korap/user/Userdata.java
@@ -16,22 +16,19 @@
  */
 public abstract class Userdata {
 
-    public static DataFactory dataFactory = DataFactory.getFactory();
+    public DataFactory dataFactory = DataFactory.getFactory();
     
+    @Deprecated
     @Getter
     @Setter
     private Integer id;
     @Getter(AccessLevel.PRIVATE)
     private Object data;
+    @Deprecated
     @Getter
     @Setter
     private Integer userId;
     
-    // EM: new
-    @Getter
-    @Setter
-    private String username;
-    
     public Userdata () {
         this(-1);
     }
@@ -44,11 +41,8 @@
         this.data = dataFactory.convertData(null);
     }
 
-    // EM: new
-    public Userdata (String username) {
-        this.username = username;
-        this.id = -1;
-        this.data = dataFactory.convertData(null);
+    public Userdata (String data) {
+        this.data = dataFactory.convertData(data);
     }
 
     public int size () {
@@ -159,7 +153,11 @@
         }
     }
 
-
+    // EM: added
+    public boolean removeField (String field) {
+        return dataFactory.removeValue(this.data, field);
+    }
+    
     public abstract String[] requiredFields ();
 
 
diff --git a/core/src/main/java/de/ids_mannheim/korap/web/filter/PiwikFilter.java b/core/src/main/java/de/ids_mannheim/korap/web/filter/PiwikFilter.java
index 122f717..88fde0d 100644
--- a/core/src/main/java/de/ids_mannheim/korap/web/filter/PiwikFilter.java
+++ b/core/src/main/java/de/ids_mannheim/korap/web/filter/PiwikFilter.java
@@ -33,7 +33,7 @@
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.security.context.TokenContext;
 import de.ids_mannheim.korap.user.User;
-import de.ids_mannheim.korap.user.UserSettings;
+import de.ids_mannheim.korap.user.UserSettingProcessor;
 import de.ids_mannheim.korap.user.Userdata;
 import net.minidev.json.JSONArray;
 
@@ -137,7 +137,7 @@
                     // since this is cached, not very expensive!
                     User user = authenticationManager.getUser(context.getUsername());
                     Userdata data = authenticationManager
-                            .getUserData(user, UserSettings.class);
+                            .getUserData(user, UserSettingProcessor.class);
                     if ((Boolean) data.get(Attributes.COLLECT_AUDITING_DATA))
                         customVars.put("username", context.getUsername());
                 }
diff --git a/full/Changes b/full/Changes
index 8fd48a9..0c554ae 100644
--- a/full/Changes
+++ b/full/Changes
@@ -23,6 +23,7 @@
    - Added create, edit, retrieve user default setting controllers (margaretha)
 22/01/2019
    - Updated default setting controllers & added tests (margaretha)
+   - Added delete key in setting controllers (margaretha)
 
 # version 0.61.4
 14/11/2018
diff --git a/full/src/main/java/de/ids_mannheim/korap/authentication/KustvaktAuthenticationManager.java b/full/src/main/java/de/ids_mannheim/korap/authentication/KustvaktAuthenticationManager.java
index 99e707d..99b6b52 100644
--- a/full/src/main/java/de/ids_mannheim/korap/authentication/KustvaktAuthenticationManager.java
+++ b/full/src/main/java/de/ids_mannheim/korap/authentication/KustvaktAuthenticationManager.java
@@ -47,7 +47,7 @@
 import de.ids_mannheim.korap.user.User.CorpusAccess;
 import de.ids_mannheim.korap.user.User.Location;
 import de.ids_mannheim.korap.user.UserDetails;
-import de.ids_mannheim.korap.user.UserSettings;
+import de.ids_mannheim.korap.user.UserSettingProcessor;
 import de.ids_mannheim.korap.user.Userdata;
 import de.ids_mannheim.korap.utils.TimeUtils;
 
@@ -642,7 +642,7 @@
 		UserDetails d = new UserDetails();
 		d.read(attributes, true);
 
-		UserSettings s = new UserSettings();
+		UserSettingProcessor s = new UserSettingProcessor();
 		s.read(attributes, true);
 
 		entHandler.createAccount(user);
@@ -654,7 +654,7 @@
 		assert dao != null;
 		dao.store(d);
 
-		dao = BeansFactory.getTypeFactory().getTypeInterfaceBean(userdatadaos, UserSettings.class);
+		dao = BeansFactory.getTypeFactory().getTypeInterfaceBean(userdatadaos, UserSettingProcessor.class);
 		assert dao != null;
 		dao.store(d);
 
diff --git a/full/src/main/java/de/ids_mannheim/korap/handlers/UserSettingsDao.java b/full/src/main/java/de/ids_mannheim/korap/handlers/UserSettingsDao.java
index 55d19d9..326ddb3 100644
--- a/full/src/main/java/de/ids_mannheim/korap/handlers/UserSettingsDao.java
+++ b/full/src/main/java/de/ids_mannheim/korap/handlers/UserSettingsDao.java
@@ -6,7 +6,7 @@
 import de.ids_mannheim.korap.interfaces.db.PersistenceClient;
 import de.ids_mannheim.korap.interfaces.db.UserDataDbIface;
 import de.ids_mannheim.korap.user.User;
-import de.ids_mannheim.korap.user.UserSettings;
+import de.ids_mannheim.korap.user.UserSettingProcessor;
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -26,7 +26,7 @@
  * @date 28/01/2016
  */
 @Deprecated
-public class UserSettingsDao implements UserDataDbIface<UserSettings> {
+public class UserSettingsDao implements UserDataDbIface<UserSettingProcessor> {
 
     private static final Logger jlog = LogManager
             .getLogger(UserSettingsDao.class);
@@ -40,7 +40,7 @@
 
 
     @Override
-    public int store (UserSettings data) throws KustvaktException {
+    public int store (UserSettingProcessor data) throws KustvaktException {
         String sql = "INSERT INTO user_settings (user_id, data) VALUES (:userid, :data);";
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("userid", data.getUserId());
@@ -62,7 +62,7 @@
 
 
     @Override
-    public int update (UserSettings data) throws KustvaktException {
+    public int update (UserSettingProcessor data) throws KustvaktException {
         String sql = "UPDATE user_settings SET data = :data WHERE user_id=:userid;";
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("userid", data.getUserId());
@@ -78,19 +78,19 @@
 
 
     @Override
-    public UserSettings get (Integer id) throws DatabaseException {
+    public UserSettingProcessor get (Integer id) throws DatabaseException {
         String sql = "SELECT * FROM user_settings WHERE id=:id;";
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("id", id);
 
         try {
             return this.jdbcTemplate.queryForObject(sql, source,
-                    new RowMapper<UserSettings>() {
+                    new RowMapper<UserSettingProcessor>() {
 
                         @Override
-                        public UserSettings mapRow (ResultSet rs, int rowNum)
+                        public UserSettingProcessor mapRow (ResultSet rs, int rowNum)
                                 throws SQLException {
-                            UserSettings details = new UserSettings(
+                            UserSettingProcessor details = new UserSettingProcessor(
                                     rs.getInt("user_id"));
                             details.setId(rs.getInt("id"));
                             details.setData(rs.getString("data"));
@@ -111,19 +111,19 @@
 
 
     @Override
-    public UserSettings get (User user) throws DatabaseException {
+    public UserSettingProcessor get (User user) throws DatabaseException {
         String sql = "SELECT * FROM user_settings WHERE user_id=:userid;";
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("userid", user.getId());
 
         try {
             return this.jdbcTemplate.queryForObject(sql, source,
-                    new RowMapper<UserSettings>() {
+                    new RowMapper<UserSettingProcessor>() {
 
                         @Override
-                        public UserSettings mapRow (ResultSet rs, int rowNum)
+                        public UserSettingProcessor mapRow (ResultSet rs, int rowNum)
                                 throws SQLException {
-                            UserSettings details = new UserSettings(
+                            UserSettingProcessor details = new UserSettingProcessor(
                                     rs.getInt("user_id"));
                             details.setId(rs.getInt("id"));
                             details.setData(rs.getString("data"));
@@ -143,7 +143,7 @@
 
 
     @Override
-    public int delete (UserSettings data) {
+    public int delete (UserSettingProcessor data) {
         String sql = "DELETE FROM user_settings WHERE id=:id";
         MapSqlParameterSource source = new MapSqlParameterSource();
         source.addValue("id", data.getId());
@@ -170,7 +170,7 @@
 
 
     @Override
-    public Class<UserSettings> type () {
-        return UserSettings.class;
+    public Class<UserSettingProcessor> type () {
+        return UserSettingProcessor.class;
     }
 }
diff --git a/full/src/main/java/de/ids_mannheim/korap/service/DefaultSettingService.java b/full/src/main/java/de/ids_mannheim/korap/service/DefaultSettingService.java
index 181d934..1aabb9b 100644
--- a/full/src/main/java/de/ids_mannheim/korap/service/DefaultSettingService.java
+++ b/full/src/main/java/de/ids_mannheim/korap/service/DefaultSettingService.java
@@ -10,8 +10,8 @@
 import de.ids_mannheim.korap.entity.DefaultSetting;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
 import de.ids_mannheim.korap.exceptions.StatusCodes;
-import de.ids_mannheim.korap.user.UserSettings;
-import de.ids_mannheim.korap.user.Userdata;
+import de.ids_mannheim.korap.user.DataFactory;
+import de.ids_mannheim.korap.user.UserSettingProcessor;
 
 @Service
 public class DefaultSettingService {
@@ -19,65 +19,84 @@
     @Autowired
     private DefaultSettingDao settingDao;
 
-    private void verifiyUsername (String username, String authenticatedUser)
+    public DataFactory dataFactory = DataFactory.getFactory();
+
+    private String verifiyUsername (String username, String contextUsername)
             throws KustvaktException {
-        if (!username.equals(authenticatedUser)) {
+        username = username.substring(0);
+        if (!username.equals(contextUsername)) {
             throw new KustvaktException(StatusCodes.INVALID_ARGUMENT,
                     "Username verification failed. Path parameter username "
-                            + "must be the same as the authenticated username.",
+                            + "without prefix must be the same as the "
+                            + "authenticated username.",
                     username);
         }
+        return username;
     }
 
     public int handlePutRequest (String username, Map<String, Object> map,
-            String authenticatedUser) throws KustvaktException {
-        verifiyUsername(username, authenticatedUser);
+            String contextUsername) throws KustvaktException {
+        username = verifiyUsername(username, contextUsername);
 
         if (map == null || map.isEmpty()) {
             throw new KustvaktException(StatusCodes.INVALID_ARGUMENT,
                     "Entity body is empty. No settings are given.");
         }
 
-        Userdata userdata = new UserSettings(username);
-        userdata.readQuietly(map, false);
+        UserSettingProcessor processor = new UserSettingProcessor();
+        processor.readQuietly(map, false);
 
         DefaultSetting defaultSetting =
                 settingDao.retrieveDefautlSetting(username);
         if (defaultSetting == null) {
-            createDefaultSetting(username, userdata);
+            createDefaultSetting(username, processor);
             return HttpStatus.SC_CREATED;
         }
         else {
-            updateDefaultSetting(defaultSetting, userdata);
+            updateDefaultSetting(defaultSetting, processor);
             return HttpStatus.SC_OK;
         }
     }
 
-    public void createDefaultSetting (String username, Userdata userdata)
-            throws KustvaktException {
-        String jsonSettings = userdata.serialize();
+    public void createDefaultSetting (String username,
+            UserSettingProcessor processor) throws KustvaktException {
+        String jsonSettings = processor.serialize();
         settingDao.createDefaultSetting(username, jsonSettings);
     }
 
-    public void updateDefaultSetting (DefaultSetting setting, Userdata newData)
-            throws KustvaktException {
-        Userdata existingData = new UserSettings(setting.getUsername());
-        existingData.setData(setting.getSettings());
-        existingData.update(newData);
+    public void updateDefaultSetting (DefaultSetting setting,
+            UserSettingProcessor newProcessor) throws KustvaktException {
+        UserSettingProcessor processor =
+                new UserSettingProcessor(setting.getSettings());
+        processor.update(newProcessor);
 
-        String newSettings = existingData.serialize();
-        setting.setSettings(newSettings);
+        String jsonSettings = processor.serialize();
+        setting.setSettings(jsonSettings);
         settingDao.updateDefaultSetting(setting);
     }
 
     public String retrieveDefaultSettings (String username,
-            String authenticatedUser) throws KustvaktException {
+            String contextUsername) throws KustvaktException {
 
-        verifiyUsername(username, authenticatedUser);
-
+        username = verifiyUsername(username, contextUsername);
         DefaultSetting defaultSetting =
                 settingDao.retrieveDefautlSetting(username);
         return defaultSetting.getSettings();
     }
 
+    public void deleteKey (String username, String contextUsername, String key)
+            throws KustvaktException {
+        username = verifiyUsername(username, contextUsername);
+        DefaultSetting defaultSetting =
+                settingDao.retrieveDefautlSetting(username);
+
+        String jsonSettings = defaultSetting.getSettings();
+        UserSettingProcessor processor = new UserSettingProcessor(jsonSettings);
+        processor.removeField(key);
+        String json = processor.serialize();
+
+        defaultSetting.setSettings(json);
+        settingDao.updateDefaultSetting(defaultSetting);
+    }
+
 }
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/controller/ShibbolethUserController.java b/full/src/main/java/de/ids_mannheim/korap/web/controller/ShibbolethUserController.java
index bd95f13..79ba584 100644
--- a/full/src/main/java/de/ids_mannheim/korap/web/controller/ShibbolethUserController.java
+++ b/full/src/main/java/de/ids_mannheim/korap/web/controller/ShibbolethUserController.java
@@ -39,7 +39,7 @@
 import de.ids_mannheim.korap.user.User;
 import de.ids_mannheim.korap.user.UserDetails;
 import de.ids_mannheim.korap.user.UserQuery;
-import de.ids_mannheim.korap.user.UserSettings;
+import de.ids_mannheim.korap.user.UserSettingProcessor;
 import de.ids_mannheim.korap.user.Userdata;
 import de.ids_mannheim.korap.utils.JsonUtils;
 import de.ids_mannheim.korap.utils.StringUtils;
@@ -130,7 +130,7 @@
         String result;
         try {
             User user = controller.getUser(ctx.getUsername());
-            Userdata data = controller.getUserData(user, UserSettings.class);
+            Userdata data = controller.getUserData(user, UserSettingProcessor.class);
             data.setField(Attributes.USERNAME, ctx.getUsername());
             result = data.serialize();
         }
@@ -159,14 +159,14 @@
             if (User.UserFactory.isDemo(ctx.getUsername()))
                 return Response.notModified().build();
 
-            Userdata data = controller.getUserData(user, UserSettings.class);
+            Userdata data = controller.getUserData(user, UserSettingProcessor.class);
             // todo: check setting only within the scope of user settings permissions; not foundry range. Latter is part of
             // frontend which only displays available foundries and
             //            SecurityManager.findbyId(us.getDefaultConstfoundry(), user, Foundry.class);
             //            SecurityManager.findbyId(us.getDefaultLemmafoundry(), user, Foundry.class);
             //            SecurityManager.findbyId(us.getDefaultPOSfoundry(), user, Foundry.class);
             //            SecurityManager.findbyId(us.getDefaultRelfoundry(), user, Foundry.class);
-            Userdata new_data = new UserSettings(user.getId());
+            Userdata new_data = new UserSettingProcessor(user.getId());
             new_data.readQuietly((Map<String, Object>) settings, false);
             data.update(new_data);
             controller.updateUserData(data);
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/controller/UserController.java b/full/src/main/java/de/ids_mannheim/korap/web/controller/UserController.java
index 638cd8a..0fba5b7 100644
--- a/full/src/main/java/de/ids_mannheim/korap/web/controller/UserController.java
+++ b/full/src/main/java/de/ids_mannheim/korap/web/controller/UserController.java
@@ -3,6 +3,7 @@
 import java.util.Map;
 
 import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
 import javax.ws.rs.GET;
 import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
@@ -79,7 +80,7 @@
 
         try {
             scopeService.verifyScope(tokenContext,
-                    OAuth2Scope.CREATE_DEFAULT_SETTING);
+                    OAuth2Scope.READ_DEFAULT_SETTING);
             String settings = settingService.retrieveDefaultSettings(username,
                     tokenContext.getUsername());
             return Response.ok(settings).build();
@@ -89,4 +90,24 @@
         }
     }
 
+    @DELETE
+    @Path("setting/{key}")
+    @Consumes(MediaType.APPLICATION_JSON)
+    @ResourceFilters({ AuthenticationFilter.class, PiwikFilter.class,
+            BlockingFilter.class })
+    public Response createDefaultSetting (@Context SecurityContext context,
+            @PathParam("username") String username,
+            @PathParam("key") String key) {
+
+        TokenContext tokenContext = (TokenContext) context.getUserPrincipal();
+        try {
+            scopeService.verifyScope(tokenContext,
+                    OAuth2Scope.DELETE_DEFAULT_SETTING);
+            settingService.deleteKey(username, tokenContext.getUsername(), key);
+            return Response.ok().build();
+        }
+        catch (KustvaktException e) {
+            throw kustvaktResponseHandler.throwit(e);
+        }
+    }
 }
diff --git a/full/src/test/java/de/ids_mannheim/korap/authentication/KustvaktAuthenticationManagerTest.java b/full/src/test/java/de/ids_mannheim/korap/authentication/KustvaktAuthenticationManagerTest.java
index 7c27553..e06d9f7 100644
--- a/full/src/test/java/de/ids_mannheim/korap/authentication/KustvaktAuthenticationManagerTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/authentication/KustvaktAuthenticationManagerTest.java
@@ -14,7 +14,7 @@
 import de.ids_mannheim.korap.user.KorAPUser;
 import de.ids_mannheim.korap.user.User;
 import de.ids_mannheim.korap.user.UserDetails;
-import de.ids_mannheim.korap.user.UserSettings;
+import de.ids_mannheim.korap.user.UserSettingProcessor;
 import de.ids_mannheim.korap.user.Userdata;
 
 /**
@@ -71,7 +71,7 @@
                 .getUser((String) KustvaktConfiguration.KUSTVAKT_USER
                         .get(Attributes.USERNAME));
 
-        Userdata data = authenticationManager.getUserData(user, UserSettings.class);
+        Userdata data = authenticationManager.getUserData(user, UserSettingProcessor.class);
         assertNotNull(data);
     }
 
@@ -86,7 +86,7 @@
     @Test(expected = KustvaktException.class)
     public void testUserSettingsGetNonExistent () throws KustvaktException {
         User user = new KorAPUser(10, "random");
-        authenticationManager.getUserData(user, UserSettings.class);
+        authenticationManager.getUserData(user, UserSettingProcessor.class);
     }
 
 
diff --git a/full/src/test/java/de/ids_mannheim/korap/misc/BeanInjectTest.java b/full/src/test/java/de/ids_mannheim/korap/misc/BeanInjectTest.java
index c5814e4..4de83e0 100644
--- a/full/src/test/java/de/ids_mannheim/korap/misc/BeanInjectTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/misc/BeanInjectTest.java
@@ -12,7 +12,7 @@
 import de.ids_mannheim.korap.handlers.UserDetailsDao;
 import de.ids_mannheim.korap.handlers.UserSettingsDao;
 import de.ids_mannheim.korap.user.UserDetails;
-import de.ids_mannheim.korap.user.UserSettings;
+import de.ids_mannheim.korap.user.UserSettingProcessor;
 
 /**
  * Created by hanl on 03.06.16.
@@ -26,7 +26,7 @@
                 .getUserDataProviders();
         assertFalse(coll.isEmpty());
         Object o = BeansFactory.getTypeFactory().getTypeInterfaceBean(coll,
-                UserSettings.class);
+                UserSettingProcessor.class);
         assertEquals(UserSettingsDao.class, AopUtils.getTargetClass(o));
 
         o = BeansFactory.getTypeFactory().getTypeInterfaceBean(coll,
diff --git a/full/src/test/java/de/ids_mannheim/korap/user/UserdataTest.java b/full/src/test/java/de/ids_mannheim/korap/user/UserdataTest.java
index 04f8359..c97d0a5 100644
--- a/full/src/test/java/de/ids_mannheim/korap/user/UserdataTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/user/UserdataTest.java
@@ -96,7 +96,7 @@
 
     @Test
     public void testSettingsValidation () {
-        Userdata data = new UserSettings(1);
+        Userdata data = new UserSettingProcessor(1);
         data.setField(Attributes.FILE_FORMAT_FOR_EXPORT, "export");
 
         String[] req = data.requiredFields();
@@ -118,7 +118,7 @@
 
         dao = BeansFactory.getTypeFactory().getTypeInterfaceBean(
                 helper().getContext().getUserDataProviders(),
-                UserSettings.class);
+                UserSettingProcessor.class);
         assertNotNull(dao);
         assertTrue(dao instanceof UserSettingsDao);
     }
diff --git a/full/src/test/java/de/ids_mannheim/korap/user/UserdataTest2.java b/full/src/test/java/de/ids_mannheim/korap/user/UserdataTest2.java
index acdd062..8364fb9 100644
--- a/full/src/test/java/de/ids_mannheim/korap/user/UserdataTest2.java
+++ b/full/src/test/java/de/ids_mannheim/korap/user/UserdataTest2.java
@@ -25,7 +25,7 @@
 
     @Test
     public void testReadEmptyMap () throws KustvaktException {
-        Userdata userData = new UserSettings();
+        Userdata userData = new UserSettingProcessor();
         userData.read(new HashMap<>(), false);
         String jsonSettings = userData.serialize();
         assertEquals("{}", jsonSettings);
@@ -33,7 +33,7 @@
 
     @Test
     public void testReadNullMap () throws KustvaktException {
-        Userdata userData = new UserSettings();
+        Userdata userData = new UserSettingProcessor();
         userData.read(null, false);
         String jsonSettings = userData.serialize();
         assertEquals("{}", jsonSettings);
@@ -56,7 +56,7 @@
         map.put("k1", Arrays.asList(new String[] { "a", "b", "c" }));
         map.put("k2", Arrays.asList(new Integer[] { 1, 2, 3 }));
 
-        Userdata data = new UserSettings();
+        Userdata data = new UserSettingProcessor();
         data.read(map, false);
         data.validate(new ApacheValidator());
     }
@@ -80,7 +80,7 @@
 
     @Test
     public void testUserdataDefaultFields () throws KustvaktException {
-        UserSettings settings = new UserSettings(-1);
+        UserSettingProcessor settings = new UserSettingProcessor(-1);
         Map<String, Object> m = new HashMap<>();
         m.put(Attributes.DEFAULT_REL_FOUNDRY, "rel_1");
         m.put(Attributes.DEFAULT_CONST_FOUNDRY, "const_1");
diff --git a/full/src/test/java/de/ids_mannheim/korap/web/controller/UserControllerTest.java b/full/src/test/java/de/ids_mannheim/korap/web/controller/UserControllerTest.java
index d074d02..69f47df 100644
--- a/full/src/test/java/de/ids_mannheim/korap/web/controller/UserControllerTest.java
+++ b/full/src/test/java/de/ids_mannheim/korap/web/controller/UserControllerTest.java
@@ -1,6 +1,7 @@
 package de.ids_mannheim.korap.web.controller;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -32,8 +33,8 @@
 
     private ClientResponse sendPutRequest (String username,
             Map<String, Object> map) throws KustvaktException {
-        ClientResponse response = resource().path(API_VERSION)
-                .path(username).path("setting")
+        ClientResponse response = resource().path(API_VERSION).path(username)
+                .path("setting")
                 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
                         .createBasicAuthorizationHeaderValue(username, "pass"))
                 .type(MediaType.APPLICATION_JSON).entity(map)
@@ -47,8 +48,8 @@
         String json = "{\"foundry\":\"opennlp\",\"metadata\":\"author title "
                 + "textSigle availability\",\"resultPerPage\":25}";
 
-        ClientResponse response = resource().path(API_VERSION)
-                .path(username).path("setting")
+        ClientResponse response = resource().path(API_VERSION).path(username)
+                .path("setting")
                 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
                         .createBasicAuthorizationHeaderValue(username, "pass"))
                 .type(MediaType.APPLICATION_JSON).entity(json)
@@ -56,12 +57,17 @@
 
         assertEquals(Status.CREATED.getStatusCode(), response.getStatus());
 
-        testRetrieveSettings(username, "opennlp", 25,
-                "author title textSigle availability");
+        int numOfResult = 25;
+        String metadata = "author title textSigle availability";
+
+        testRetrieveSettings(username, "opennlp", numOfResult, metadata);
+
+        testDeleteKey(username, numOfResult, metadata);
     }
 
     @Test
     public void testCreateSettingWithMap () throws KustvaktException {
+
         Map<String, Object> map = new HashMap<>();
         map.put("foundry", "opennlp");
         map.put("resultPerPage", 25);
@@ -81,8 +87,8 @@
         String json = "{\"foundry\":\"opennlp\",\"metadata\":\"author title "
                 + "textSigle availability\",\"resultPerPage\":25}";
 
-        ClientResponse response = resource().path(API_VERSION)
-                .path(username).path("setting")
+        ClientResponse response = resource().path(API_VERSION).path(username)
+                .path("setting")
                 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
                         .createBasicAuthorizationHeaderValue(username2, "pass"))
                 .type(MediaType.APPLICATION_JSON).entity(json)
@@ -97,8 +103,8 @@
 
     @Test
     public void testGetDifferentUsername () throws KustvaktException {
-        ClientResponse response = resource().path(API_VERSION)
-                .path(username).path("setting")
+        ClientResponse response = resource().path(API_VERSION).path(username)
+                .path("setting")
                 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
                         .createBasicAuthorizationHeaderValue(username2, "pass"))
                 .get(ClientResponse.class);
@@ -110,6 +116,34 @@
                 node.at("/errors/0/0").asInt());
     }
 
+    @Test
+    public void testDeleteKeyDifferentUsername () throws KustvaktException {
+        ClientResponse response = resource().path(API_VERSION).path(username)
+                .path("setting").path("foundry")
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue(username2, "pass"))
+                .delete(ClientResponse.class);
+
+        assertEquals(Status.BAD_REQUEST.getStatusCode(), response.getStatus());
+        String entity = response.getEntity(String.class);
+        JsonNode node = JsonUtils.readTree(entity);
+        assertEquals(StatusCodes.INVALID_ARGUMENT,
+                node.at("/errors/0/0").asInt());
+    }
+
+    private void testDeleteKey (String username, int numOfResult,
+            String metadata) throws KustvaktException {
+
+        ClientResponse response = resource().path(API_VERSION).path(username)
+                .path("setting").path("foundry")
+                .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
+                        .createBasicAuthorizationHeaderValue(username, "pass"))
+                .delete(ClientResponse.class);
+
+        assertEquals(Status.OK.getStatusCode(), response.getStatus());
+        testRetrieveSettings(username, null, numOfResult, metadata);
+    }
+
     private void testUpdateSetting (String username) throws KustvaktException {
         Map<String, Object> map = new HashMap<>();
         map.put("foundry", "malt");
@@ -122,10 +156,10 @@
         testRetrieveSettings(username, "malt", 15, "author title");
     }
 
-    private void testRetrieveSettings (String username, String foundry, int numOfResult,
-            String metadata) throws KustvaktException {
-        ClientResponse response = resource().path(API_VERSION)
-                .path(username).path("setting")
+    private void testRetrieveSettings (String username, String foundry,
+            int numOfResult, String metadata) throws KustvaktException {
+        ClientResponse response = resource().path(API_VERSION).path(username)
+                .path("setting")
                 .header(Attributes.AUTHORIZATION, HttpAuthorizationHandler
                         .createBasicAuthorizationHeaderValue(username, "pass"))
                 .header(HttpHeaders.X_FORWARDED_FOR, "149.27.0.32")
@@ -133,7 +167,12 @@
 
         String entity = response.getEntity(String.class);
         JsonNode node = JsonUtils.readTree(entity);
-        assertEquals(foundry, node.at("/foundry").asText());
+        if (foundry == null) {
+            assertTrue(node.at("/foundry").isMissingNode());
+        }
+        else {
+            assertEquals(foundry, node.at("/foundry").asText());
+        }
         assertEquals(numOfResult, node.at("/resultPerPage").asInt());
         assertEquals(metadata, node.at("/metadata").asText());
     }