/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package Sirius.server.newuser.permission;
import Sirius.server.AbstractShutdownable;
import Sirius.server.ServerExitError;
import Sirius.server.Shutdown;
import Sirius.server.sql.DBConnection;
import Sirius.server.sql.DBConnectionPool;
import org.apache.log4j.Logger;
import java.io.Serializable;
import java.sql.ResultSet;
import java.util.HashMap;
import java.util.Map;
/**
* DOCUMENT ME!
*
* @author hell
* @version $Revision$, $Date$
*/
public class PolicyHolder extends Shutdown implements Serializable {
//~ Static fields/initializers ---------------------------------------------
private static final transient Logger LOG = Logger.getLogger(PolicyHolder.class);
//~ Instance fields --------------------------------------------------------
private Map<String, Map<Permission, Boolean>> policyHolder = new HashMap<String, Map<Permission, Boolean>>();
private Map<Integer, String> idMapper = new HashMap<Integer, String>();
private Map<String, Integer> idReverseMapper = new HashMap<String, Integer>();
//~ Constructors -----------------------------------------------------------
/**
* Creates a new PolicyHolder object.
*
* @param conPool DOCUMENT ME!
*
* @throws ServerExitError DOCUMENT ME!
*/
public PolicyHolder(final DBConnectionPool conPool) throws ServerExitError {
final DBConnection con = conPool.getDBConnection();
try {
final ResultSet serverPolicies = con.getConnection()
.createStatement()
.executeQuery(
"SELECT " // NOI18N
+ "cs_policy.id as policyid, " // NOI18N
+ "cs_policy.name," // NOI18N
+ "cs_permission.id as permissionid," // NOI18N
+ "cs_permission.key," // NOI18N
+ "default_value " // NOI18N
+ "FROM " // NOI18N
+ "cs_permission," // NOI18N
+ "cs_policy," // NOI18N
+ "cs_policy_rule " // NOI18N
+ "WHERE " // NOI18N
+ "cs_policy_rule.permission= cs_permission.id " // NOI18N
+ "and cs_policy_rule.policy= cs_policy.id "); // NOI18N
if (serverPolicies == null) {
LOG.error(
"<LS> ERROR :: Serverpolicies could not be loaded. Fatal Error. Program exits"); // NOI18N
throw new ServerExitError(
"Serverpolicies could not be loaded. Fatal Error. Program exits"); // NOI18N
}
while (serverPolicies.next()) {
final String policyName = serverPolicies.getString("name"); // NOI18N
final int policyId = serverPolicies.getInt("policyid"); // NOI18N
final int permId = serverPolicies.getInt("permissionid"); // NOI18N
final String permissionKey = serverPolicies.getString("key"); // NOI18N
final boolean defaultvalue = serverPolicies.getBoolean("default_value"); // NOI18N
final Permission p = new Permission(permId, permissionKey);
if (!policyHolder.containsKey(policyName)) {
final HashMap<Permission, Boolean> policyMap = new HashMap<Permission, Boolean>();
policyHolder.put(policyName, policyMap);
}
policyHolder.get(policyName).put(p, defaultvalue);
idMapper.put(policyId, policyName);
idReverseMapper.put(policyName, policyId);
}
LOG.info("Serverpolicies: " + policyHolder); // NOI18N
addShutdown(new AbstractShutdownable() {
@Override
protected void internalShutdown() throws ServerExitError {
if (LOG.isDebugEnabled()) {
LOG.debug("shutting down PolicyHolder"); // NOI18N
}
policyHolder.clear();
idMapper.clear();
idReverseMapper.clear();
}
});
} catch (Exception e) {
// Safetyfirst
LOG.error("Error while analysing server policies", e); // NOI18N
throw new ServerExitError("Error while analysing server policies", e); // NOI18N
}
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param policyId DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Policy getServerPolicy(final int policyId) {
if (idMapper.containsKey(policyId)) {
return getServerPolicy(idMapper.get(policyId), policyId);
} else {
return null;
}
}
/**
* DOCUMENT ME!
*
* @param policyName DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Policy getServerPolicy(final String policyName) {
return getServerPolicy(policyName, idReverseMapper.get(policyName));
}
/**
* DOCUMENT ME!
*
* @param policyName DOCUMENT ME!
* @param policyId DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
private Policy getServerPolicy(final String policyName, final int policyId) {
return new Policy(policyHolder.get(policyName), policyId, policyName);
}
}