/**
* ESUP-Portail Helpdesk - Copyright (c) 2004-2009 ESUP-Portail consortium.
*/
package org.esupportail.helpdesk.domain.departmentSelection;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import org.apache.commons.digester.Digester;
import org.esupportail.helpdesk.domain.departmentSelection.actions.AddAllAction;
import org.esupportail.helpdesk.domain.departmentSelection.actions.AddByFilterAction;
import org.esupportail.helpdesk.domain.departmentSelection.actions.AddByLabelAction;
import org.esupportail.helpdesk.domain.departmentSelection.actions.DoNothingAction;
import org.esupportail.helpdesk.domain.departmentSelection.actions.StopAction;
import org.esupportail.helpdesk.domain.departmentSelection.conditions.AdministratorCondition;
import org.esupportail.helpdesk.domain.departmentSelection.conditions.AndCondition;
import org.esupportail.helpdesk.domain.departmentSelection.conditions.ApplicationUserCondition;
import org.esupportail.helpdesk.domain.departmentSelection.conditions.CasUserCondition;
import org.esupportail.helpdesk.domain.departmentSelection.conditions.ClientIpCondition;
import org.esupportail.helpdesk.domain.departmentSelection.conditions.DepartmentManagerCondition;
import org.esupportail.helpdesk.domain.departmentSelection.conditions.ExternalDbCondition;
import org.esupportail.helpdesk.domain.departmentSelection.conditions.FalseCondition;
import org.esupportail.helpdesk.domain.departmentSelection.conditions.FqdnEndsWithCondition;
import org.esupportail.helpdesk.domain.departmentSelection.conditions.FqdnEqCondition;
import org.esupportail.helpdesk.domain.departmentSelection.conditions.FqdnStartsWithCondition;
import org.esupportail.helpdesk.domain.departmentSelection.conditions.LdapAttributeEqCondition;
import org.esupportail.helpdesk.domain.departmentSelection.conditions.LdapAttributeLikeCondition;
import org.esupportail.helpdesk.domain.departmentSelection.conditions.NamedCondition;
import org.esupportail.helpdesk.domain.departmentSelection.conditions.NotCondition;
import org.esupportail.helpdesk.domain.departmentSelection.conditions.OrCondition;
import org.esupportail.helpdesk.domain.departmentSelection.conditions.PortalAttributeEqCondition;
import org.esupportail.helpdesk.domain.departmentSelection.conditions.PortalAttributeLikeCondition;
import org.esupportail.helpdesk.domain.departmentSelection.conditions.PortalGroupMemberCondition;
import org.esupportail.helpdesk.domain.departmentSelection.conditions.ShibbolethUserCondition;
import org.esupportail.helpdesk.domain.departmentSelection.conditions.SpecificUserCondition;
import org.esupportail.helpdesk.domain.departmentSelection.conditions.TrueCondition;
import org.esupportail.helpdesk.domain.departmentSelection.conditions.UidLikeCondition;
import org.springframework.util.StringUtils;
import org.xml.sax.SAXException;
/**
* A utility class for Digester.
*/
public class DigesterUtils {
/**
* The addCondition method name.
*/
private static final String ADD_CONDITION_METHOD = "addCondition";
/**
* The addAction method name.
*/
private static final String ADD_ACTION_METHOD = "addAction";
/**
* Private constructor.
*/
private DigesterUtils() {
throw new UnsupportedOperationException();
}
/**
* Parse a complete configuration.
* @param config
* @param configReader
* @throws DepartmentSelectionCompileError
*/
public static void parseConfigReader(
final String config,
final DepartmentSelectionConfigReader configReader)
throws DepartmentSelectionCompileError {
parse(config, configReader, true, true, true);
}
/**
* Parse a user-defined condition.
* @param config
* @param userDefinedCondition
* @throws DepartmentSelectionCompileError
*/
public static void parseUserDefinedCondition(
final String config,
final UserDefinedCondition userDefinedCondition)
throws DepartmentSelectionCompileError {
parse(config, userDefinedCondition, false, false, false);
}
/**
* Parse a rule.
* @param config
* @param rule
* @throws DepartmentSelectionCompileError
*/
public static void parseRule(
final String config,
final Rule rule)
throws DepartmentSelectionCompileError {
parse(config, rule, false, false, true);
}
/**
* Parse a complete configuration.
* @param config
* @param object
* @param addUserDefinedConditions
* @param addRules
* @param addActions
* @throws DepartmentSelectionCompileError
*/
protected static void parse(
final String config,
final Object object,
final boolean addUserDefinedConditions,
final boolean addRules,
final boolean addActions)
throws DepartmentSelectionCompileError {
if (!StringUtils.hasText(config)) {
throw new DepartmentSelectionCompileError("null config");
}
try {
Digester dig = new Digester();
dig.setValidating(false);
dig.push(object);
if (addUserDefinedConditions) {
dig.addObjectCreate("*/define-condition", UserDefinedCondition.class);
dig.addSetProperties("*/define-condition");
dig.addSetNext("*/define-condition", "addUserDefinedCondition");
}
if (addRules) {
dig.addObjectCreate("*/rule", Rule.class);
dig.addSetNext("*/rule", "addRule");
dig.addSetProperties("*/rule");
}
if (addActions) {
dig.addObjectCreate("*/add-by-label", AddByLabelAction.class);
dig.addSetProperties("*/add-by-label");
dig.addSetNext("*/add-by-label", ADD_ACTION_METHOD);
dig.addObjectCreate("*/add-by-filter", AddByFilterAction.class);
dig.addSetProperties("*/add-by-filter");
dig.addSetNext("*/add-by-filter", ADD_ACTION_METHOD);
dig.addObjectCreate("*/add-all", AddAllAction.class);
dig.addSetNext("*/add-all", ADD_ACTION_METHOD);
dig.addObjectCreate("*/stop", StopAction.class);
dig.addSetNext("*/stop", ADD_ACTION_METHOD);
dig.addObjectCreate("*/do-nothing", DoNothingAction.class);
dig.addSetNext("*/do-nothing", ADD_ACTION_METHOD);
}
// object descriptions
dig.addBeanPropertySetter("*/description", "description");
// conditions
dig.addObjectCreate("*/true", TrueCondition.class);
dig.addSetNext("*/true", ADD_CONDITION_METHOD);
dig.addObjectCreate("*/false", FalseCondition.class);
dig.addSetNext("*/false", ADD_CONDITION_METHOD);
dig.addObjectCreate("*/uid-like", UidLikeCondition.class);
dig.addSetProperties("*/uid-like");
dig.addSetNext("*/uid-like", ADD_CONDITION_METHOD);
dig.addObjectCreate("*/portal-attribute-eq", PortalAttributeEqCondition.class);
dig.addSetProperties("*/portal-attribute-eq");
dig.addSetNext("*/portal-attribute-eq", ADD_CONDITION_METHOD);
dig.addObjectCreate("*/portal-attribute-like", PortalAttributeLikeCondition.class);
dig.addSetProperties("*/portal-attribute-like");
dig.addSetNext("*/portal-attribute-like", ADD_CONDITION_METHOD);
dig.addObjectCreate("*/ldap-attribute-eq", LdapAttributeEqCondition.class);
dig.addSetProperties("*/ldap-attribute-eq");
dig.addSetNext("*/ldap-attribute-eq", ADD_CONDITION_METHOD);
dig.addObjectCreate("*/attribute-eq", LdapAttributeEqCondition.class);
dig.addSetProperties("*/attribute-eq");
dig.addSetNext("*/attribute-eq", ADD_CONDITION_METHOD);
dig.addObjectCreate("*/ldap-attribute-like", LdapAttributeLikeCondition.class);
dig.addSetProperties("*/ldap-attribute-like");
dig.addSetNext("*/ldap-attribute-like", ADD_CONDITION_METHOD);
dig.addObjectCreate("*/attribute-like", LdapAttributeLikeCondition.class);
dig.addSetProperties("*/attribute-like");
dig.addSetNext("*/attribute-like", ADD_CONDITION_METHOD);
dig.addObjectCreate("*/administrator", AdministratorCondition.class);
dig.addSetNext("*/administrator", ADD_CONDITION_METHOD);
dig.addObjectCreate("*/application-user", ApplicationUserCondition.class);
dig.addSetNext("*/application-user", ADD_CONDITION_METHOD);
dig.addObjectCreate("*/external-user", ApplicationUserCondition.class);
dig.addSetNext("*/external-user", ADD_CONDITION_METHOD);
dig.addObjectCreate("*/cas-user", CasUserCondition.class);
dig.addSetNext("*/cas-user", ADD_CONDITION_METHOD);
dig.addObjectCreate("*/local-user", CasUserCondition.class);
dig.addSetNext("*/local-user", ADD_CONDITION_METHOD);
dig.addObjectCreate("*/shibboleth-user", ShibbolethUserCondition.class);
dig.addSetNext("*/shibboleth-user", ADD_CONDITION_METHOD);
dig.addObjectCreate("*/specific-user", SpecificUserCondition.class);
dig.addSetNext("*/specific-user", ADD_CONDITION_METHOD);
dig.addObjectCreate(
"*/department-manager", DepartmentManagerCondition.class);
dig.addSetProperties("*/department-manager");
dig.addSetNext("*/department-manager", ADD_CONDITION_METHOD);
dig.addObjectCreate("*/or", OrCondition.class);
dig.addSetNext("*/or", ADD_CONDITION_METHOD);
dig.addObjectCreate("*/and", AndCondition.class);
dig.addSetNext("*/and", ADD_CONDITION_METHOD);
dig.addObjectCreate("*/not", NotCondition.class);
dig.addSetNext("*/not", ADD_CONDITION_METHOD);
dig.addObjectCreate("*/named-condition", NamedCondition.class);
dig.addSetProperties("*/named-condition");
dig.addSetNext("*/named-condition", ADD_CONDITION_METHOD);
dig.addObjectCreate("*/fqdn-eq", FqdnEqCondition.class);
dig.addSetProperties("*/fqdn-eq");
dig.addSetNext("*/fqdn-eq", ADD_CONDITION_METHOD);
dig.addObjectCreate("*/fqdn-starts-with", FqdnStartsWithCondition.class);
dig.addSetProperties("*/fqdn-starts-with");
dig.addSetNext("*/fqdn-starts-with", ADD_CONDITION_METHOD);
dig.addObjectCreate("*/fqdn-ends-with", FqdnEndsWithCondition.class);
dig.addSetProperties("*/fqdn-ends-with");
dig.addSetNext("*/fqdn-ends-with", ADD_CONDITION_METHOD);
dig.addObjectCreate("*/ip", ClientIpCondition.class);
dig.addSetProperties("*/ip");
dig.addSetNext("*/ip", ADD_CONDITION_METHOD);
dig.addObjectCreate(
"*/portal-group-member",
PortalGroupMemberCondition.class);
dig.addSetProperties("*/portal-group-member");
dig.addSetNext("*/portal-group-member", ADD_CONDITION_METHOD);
dig.addObjectCreate("*/external-db", ExternalDbCondition.class);
dig.addSetProperties("*/external-db");
dig.addSetNext("*/external-db", ADD_CONDITION_METHOD);
dig.parse(new ByteArrayInputStream(config.getBytes()));
} catch (IOException e) {
throw new DepartmentSelectionCompileError(
"exception while reading configuration: " + e.getMessage(), e);
} catch (SAXException e) {
throw new DepartmentSelectionCompileError(
"exception while reading configuration: " + e.getMessage(), e);
}
}
}