Java tutorial
/** * UserRoles * Copyright 20.06.2016 by Robert Mader, @treba123 * * This library 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 2.1 of the License, or (at your option) any later version. * * This library 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 this program in the file lgpl21.txt * If not, see <http://www.gnu.org/licenses/>. */ package ai.susi.server; import org.eclipse.jetty.util.log.Log; import org.json.JSONObject; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; public class UserRoles { private JSONObject json; private HashMap<String, UserRole> defaultRoles; private HashMap<String, UserRole> roles; public UserRoles(JSONObject obj) throws Exception { if (obj != null) { json = obj; } else json = new JSONObject(); } /** * Create default user roles, use names of the BaseUserRoles */ public void loadDefaultUserRoles() { defaultRoles = new HashMap<>(); roles = new HashMap<>(); for (BaseUserRole bur : BaseUserRole.values()) { createDefaultUserRole(bur); } } private void createDefaultUserRole(BaseUserRole bur) { JSONObject obj = new JSONObject(); UserRole userRole = new UserRole(bur.name().toLowerCase(), bur, null, obj); setDefaultUserRole(bur, userRole); roles.put(userRole.getName(), userRole); /* this order of putting this at the end makes sure all content from the role gets written to the file. grrr */ json.put(userRole.getName(), obj); } public void loadUserRolesFromObject() throws IllegalArgumentException { defaultRoles = new HashMap<>(); roles = new HashMap<>(); try { ArrayList<String> queue = new ArrayList<>(); // get all user roles based on BaseUserRole. Add all other into a queue. for (String name : json.keySet()) { Log.getLog().debug("searching for key " + name); JSONObject obj = json.getJSONObject(name); if (hasMandatoryFields(obj)) { Log.getLog().debug(name + " has mandatory fields"); Log.getLog().debug("parent value is: " + obj.getString("parent")); BaseUserRole bur; try { bur = BaseUserRole.valueOf(obj.getString("parent")); } catch (IllegalArgumentException e) { queue.add(name); Log.getLog().debug("no bur, adding to queue"); continue; } Log.getLog().debug("successfully created bur from parent"); UserRole userRole = new UserRole(name, bur, null, obj); roles.put(name, userRole); } } // recursively add boolean changed = true; while (changed) { changed = false; for (String key : queue) { JSONObject obj = json.getJSONObject(key); if (roles.containsKey(obj.getString("parent"))) { UserRole parent = roles.get(obj.getString("parent")); UserRole userRole = new UserRole(key, parent.getBaseUserRole(), parent, obj); roles.put(key, userRole); queue.remove(key); changed = true; } } } Log.getLog().debug("available roles: " + roles.keySet().toString()); // get default roles JSONObject defaults = json.getJSONObject("defaults"); for (BaseUserRole bur : BaseUserRole.values()) { if (defaults.has(bur.name()) && roles.containsKey(defaults.getString(bur.name()))) { Log.getLog().debug("found default role for " + bur.name() + ": " + roles.get(defaults.getString(bur.name())).getDisplayName()); setDefaultUserRole(bur, roles.get(defaults.getString(bur.name()))); } else { Log.getLog().info("could not find default role for " + bur.name() + ", creating default role"); createDefaultUserRole(bur); } } } catch (Exception e) { defaultRoles = null; roles = null; throw new IllegalArgumentException("Could not load user roles from file: ", e); } } private boolean hasMandatoryFields(JSONObject object) { return object.has("parent") && object.has("display-name") && object.has("permissions"); } public UserRole getDefaultUserRole(BaseUserRole bur) { return defaultRoles.get(bur.name()); } public void setDefaultUserRole(BaseUserRole bur, UserRole ur) { if (!json.has("defaults")) json.put("defaults", new JSONObject()); defaultRoles.put(bur.name(), ur); json.getJSONObject("defaults").put(bur.name(), ur.getName()); } public boolean has(String ur) { return roles.containsKey(ur); } public UserRole getUserRoleFromString(String ur) { if (roles.containsKey(ur)) { return roles.get(ur); } return null; } public Map<String, UserRole> getUserRoles() { return roles; } }