/* * PermissionsEx - Permissions plugin for Bukkit * Copyright (C) 2011 t3hk0d3 http://www.tehkode.ru * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package pex.permissions; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.TimerTask; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; public abstract class PermissionEntity implements IPermissionEntity { protected PermissionManager manager; private String name; protected boolean virtual = true; protected Map<String, List<String>> timedPermissions = new ConcurrentHashMap<String, List<String>>(); protected Map<String, Long> timedPermissionsTime = new ConcurrentHashMap<String, Long>(); protected boolean debugMode = false; public PermissionEntity(String name, PermissionManager manager) { this.manager = manager; this.name = name; } /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#initialize() */ @Override public void initialize() { debugMode = getOptionBoolean("debug", null, debugMode); } /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#getName() */ @Override public String getName() { return name; } protected void setName(String name) { this.name = name; } /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#getPrefix(java.lang.String) */ @Override public abstract String getPrefix(String worldName); /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#getPrefix() */ @Override public String getPrefix() { return this.getPrefix(null); } /** * Returns entity prefix * */ /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#setPrefix(java.lang.String, * java.lang.String) */ @Override public abstract void setPrefix(String prefix, String worldName); /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#getSuffix(java.lang.String) */ @Override public abstract String getSuffix(String worldName); /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#getSuffix() */ @Override public String getSuffix() { return getSuffix(null); } /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#setSuffix(java.lang.String, * java.lang.String) */ @Override public abstract void setSuffix(String suffix, String worldName); /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#has(java.lang.String) */ @Override public boolean has(String permission) { return this.has(permission, "0"); } /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#has(java.lang.String, * java.lang.String) */ @Override public boolean has(String permission, String dimension) { if (permission != null && permission.isEmpty()) { // empty permission // for public access // :) return true; } String expression = getMatchingExpression(permission, dimension); if (isDebug()) { Logger.getLogger("Minecraft").info("User " + getName() + " checked for \"" + permission + "\", " + (expression == null ? "no permission found" : "\"" + expression + "\" found")); } return explainExpression(expression); } /* * (non-Javadoc) * * @see * ru.tehkode.permissions.IPermissionEntity#getPermissions(java.lang.String) */ @Override public abstract String[] getPermissions(String world); /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#getAllPermissions() */ @Override public abstract Map<String, String[]> getAllPermissions(); /* * (non-Javadoc) * * @see * ru.tehkode.permissions.IPermissionEntity#addPermission(java.lang.String, * java.lang.String) */ @Override public void addPermission(String permission, String world) { throw new UnsupportedOperationException("You shouldn't call this method"); } /* * (non-Javadoc) * * @see * ru.tehkode.permissions.IPermissionEntity#addPermission(java.lang.String) */ @Override public void addPermission(String permission) { this.addPermission(permission, ""); } /* * (non-Javadoc) * * @see * ru.tehkode.permissions.IPermissionEntity#removePermission(java.lang.String * , java.lang.String) */ @Override public void removePermission(String permission, String worldName) { throw new UnsupportedOperationException("You shouldn't call this method"); } /* * (non-Javadoc) * * @see * ru.tehkode.permissions.IPermissionEntity#removePermission(java.lang.String * ) */ @Override public void removePermission(String permission) { for (String world : getAllPermissions().keySet()) { this.removePermission(permission, world); } } /* * (non-Javadoc) * * @see * ru.tehkode.permissions.IPermissionEntity#setPermissions(java.lang.String * [], java.lang.String) */ @Override public abstract void setPermissions(String[] permissions, String world); /* * (non-Javadoc) * * @see * ru.tehkode.permissions.IPermissionEntity#setPermissions(java.lang.String * []) */ @Override public void setPermissions(String[] permission) { this.setPermissions(permission, ""); } /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#getOption(java.lang.String, * java.lang.String, java.lang.String) */ @Override public abstract String getOption(String option, String world, String defaultValue); /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#getOption(java.lang.String) */ @Override public String getOption(String option) { // @todo Replace empty string with null return this.getOption(option, "", ""); } /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#getOption(java.lang.String, * java.lang.String) */ @Override public String getOption(String option, String world) { // @todo Replace empty string with null return this.getOption(option, world, ""); } /* * (non-Javadoc) * * @see * ru.tehkode.permissions.IPermissionEntity#getOptionInteger(java.lang.String * , java.lang.String, int) */ @Override public int getOptionInteger(String optionName, String world, int defaultValue) { try { return Integer.parseInt(this.getOption(optionName, world, Integer.toString(defaultValue))); } catch (NumberFormatException e) { } return defaultValue; } /* * (non-Javadoc) * * @see * ru.tehkode.permissions.IPermissionEntity#getOptionDouble(java.lang.String * , java.lang.String, double) */ @Override public double getOptionDouble(String optionName, String world, double defaultValue) { String option = this.getOption(optionName, world, Double.toString(defaultValue)); try { return Double.parseDouble(option); } catch (NumberFormatException e) { } return defaultValue; } /* * (non-Javadoc) * * @see * ru.tehkode.permissions.IPermissionEntity#getOptionBoolean(java.lang.String * , java.lang.String, boolean) */ @Override public boolean getOptionBoolean(String optionName, String world, boolean defaultValue) { String option = this.getOption(optionName, world, Boolean.toString(defaultValue)); if ("false".equalsIgnoreCase(option)) { return false; } else if ("true".equalsIgnoreCase(option)) { return true; } return defaultValue; } /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#setOption(java.lang.String, * java.lang.String, java.lang.String) */ @Override public abstract void setOption(String option, String value, String world); /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#setOption(java.lang.String, * java.lang.String) */ @Override public void setOption(String permission, String value) { this.setOption(permission, value, ""); } /* * (non-Javadoc) * * @see * ru.tehkode.permissions.IPermissionEntity#getOptions(java.lang.String) */ @Override public abstract Map<String, String> getOptions(String world); /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#getAllOptions() */ @Override public abstract Map<String, Map<String, String>> getAllOptions(); /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#save() */ @Override public abstract void save(); /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#remove() */ @Override public abstract void remove(); /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#isVirtual() */ @Override public boolean isVirtual() { return virtual; } /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#getWorlds() */ @Override public abstract String[] getWorlds(); /* * (non-Javadoc) * * @see * ru.tehkode.permissions.IPermissionEntity#getTimedPermissions(java.lang * .String) */ @Override public String[] getTimedPermissions(String world) { if (world == null) { world = ""; } if (!timedPermissions.containsKey(world)) { return new String[0]; } return timedPermissions.get(world).toArray(new String[0]); } /* * (non-Javadoc) * * @see * ru.tehkode.permissions.IPermissionEntity#getTimedPermissionLifetime(java * .lang.String, java.lang.String) */ @Override public int getTimedPermissionLifetime(String permission, String world) { if (world == null) { world = ""; } if (!timedPermissionsTime.containsKey(world + ":" + permission)) { return 0; } return (int) (timedPermissionsTime.get(world + ":" + permission).longValue() - System.currentTimeMillis() / 1000L); } /* * (non-Javadoc) * * @see * ru.tehkode.permissions.IPermissionEntity#addTimedPermission(java.lang * .String, java.lang.String, int) */ @Override public void addTimedPermission(final String permission, String world, int lifeTime) { if (world == null) { world = ""; } if (!timedPermissions.containsKey(world)) { timedPermissions.put(world, new LinkedList<String>()); } timedPermissions.get(world).add(permission); final String finalWorld = world; if (lifeTime > 0) { TimerTask task = new TimerTask() { @Override public void run() { removeTimedPermission(permission, finalWorld); } }; manager.registerTask(task, lifeTime); timedPermissionsTime.put(world + ":" + permission, System.currentTimeMillis() / 1000L + lifeTime); } } /* * (non-Javadoc) * * @see * ru.tehkode.permissions.IPermissionEntity#removeTimedPermission(java.lang * .String, java.lang.String) */ @Override public void removeTimedPermission(String permission, String world) { if (world == null) { world = ""; } if (!timedPermissions.containsKey(world)) { return; } timedPermissions.get(world).remove(permission); timedPermissions.remove(world + ":" + permission); } /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (!getClass().equals(obj.getClass())) { return false; } if (this == obj) { return true; } final PermissionEntity other = (PermissionEntity) obj; return name.equals(other.name); } /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#hashCode() */ @Override public int hashCode() { int hash = 7; hash = 89 * hash + (name != null ? name.hashCode() : 0); return hash; } /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#toString() */ @Override public String toString() { return this.getClass().getSimpleName() + "(" + getName() + ")"; } /* * (non-Javadoc) * * @see * ru.tehkode.permissions.IPermissionEntity#getMatchingExpression(java.lang * .String, java.lang.String) */ @Override public String getMatchingExpression(String permission, String world) { return this.getMatchingExpression(getPermissions(world), permission); } /* * (non-Javadoc) * * @see * ru.tehkode.permissions.IPermissionEntity#getMatchingExpression(java.lang * .String[], java.lang.String) */ @Override public String getMatchingExpression(String[] permissions, String permission) { for (String expression : permissions) { if (isMatches(expression, permission, true)) { return expression; } } return null; } /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#isMatches(java.lang.String, * java.lang.String, boolean) */ @Override public boolean isMatches(String expression, String permission, boolean additionalChecks) { return manager.getPermissionMatcher().isMatches(expression, permission); } /* * (non-Javadoc) * * @see * ru.tehkode.permissions.IPermissionEntity#explainExpression(java.lang. * String) */ @Override public boolean explainExpression(String expression) { if (expression == null || expression.isEmpty()) { return false; } return !expression.startsWith("-"); // If expression have - (minus) // before then that mean expression // are negative } /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#isDebug() */ @Override public boolean isDebug() { return debugMode || manager.isDebug(); } /* * (non-Javadoc) * * @see ru.tehkode.permissions.IPermissionEntity#setDebug(boolean) */ @Override public void setDebug(boolean debug) { debugMode = debug; } }