com.connexta.arbitro.utils.PolicyUtils.java Source code

Java tutorial

Introduction

Here is the source code for com.connexta.arbitro.utils.PolicyUtils.java

Source

/*
*  Copyright (c)  WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
*  WSO2 Inc. licenses this file to you under the Apache License,
*  Version 2.0 (the "License"); you may not use this file except
*  in compliance with the License.
*  You may obtain a copy of the License at
*
*    http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied.  See the License for the
* specific language governing permissions and limitations
* under the License.
*/

package com.connexta.arbitro.utils;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.connexta.arbitro.utils.Constants.PolicyConstants;
import com.connexta.arbitro.utils.exception.PolicyBuilderException;
import com.connexta.arbitro.utils.policy.dto.AllOfElementDTO;
import com.connexta.arbitro.utils.policy.dto.AnyOfElementDTO;
import com.connexta.arbitro.utils.policy.dto.ApplyElementDTO;
import com.connexta.arbitro.utils.policy.dto.AttributeAssignmentElementDTO;
import com.connexta.arbitro.utils.policy.dto.AttributeDesignatorDTO;
import com.connexta.arbitro.utils.policy.dto.AttributeElementDTO;
import com.connexta.arbitro.utils.policy.dto.AttributeSelectorDTO;
import com.connexta.arbitro.utils.policy.dto.AttributeValueElementDTO;
import com.connexta.arbitro.utils.policy.dto.AttributesElementDTO;
import com.connexta.arbitro.utils.policy.dto.ConditionElementDT0;
import com.connexta.arbitro.utils.policy.dto.FunctionElementDTO;
import com.connexta.arbitro.utils.policy.dto.MatchElementDTO;
import com.connexta.arbitro.utils.policy.dto.ObligationElementDTO;
import com.connexta.arbitro.utils.policy.dto.PolicyElementDTO;
import com.connexta.arbitro.utils.policy.dto.PolicySetElementDTO;
import com.connexta.arbitro.utils.policy.dto.RequestElementDTO;
import com.connexta.arbitro.utils.policy.dto.RuleElementDTO;
import com.connexta.arbitro.utils.policy.dto.TargetElementDTO;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 */
public class PolicyUtils {

    private static Log log = LogFactory.getLog(PolicyUtils.class);

    /**
     * This method creates a policy element of the XACML policy
     * @param policyElementDTO  policy element data object
     * @param doc XML document
     * @return policyElement
     * @throws PolicyBuilderException if
     */

    public static Element createPolicyElement(PolicyElementDTO policyElementDTO, Document doc)
            throws PolicyBuilderException {

        Element policyElement = doc.createElement(PolicyConstants.POLICY_ELEMENT);

        policyElement.setAttribute("xmlns", PolicyConstants.XACMLData.XACML3_POLICY_NAMESPACE);

        if (policyElementDTO.getPolicyName() != null && policyElementDTO.getPolicyName().trim().length() > 0) {
            policyElement.setAttribute(PolicyConstants.POLICY_ID, policyElementDTO.getPolicyName());
        } else {
            throw new PolicyBuilderException("Policy name can not be null");
        }

        if (policyElementDTO.getRuleCombiningAlgorithms() != null
                && policyElementDTO.getRuleCombiningAlgorithms().trim().length() > 0) {
            policyElement.setAttribute(PolicyConstants.RULE_ALGORITHM,
                    policyElementDTO.getRuleCombiningAlgorithms());
        } else {
            policyElement.setAttribute(PolicyConstants.RULE_ALGORITHM,
                    PolicyConstants.RuleCombiningAlog.DENY_OVERRIDE_ID); // TODO
            log.warn("Rule combining algorithm is not defined. Use default algorithm; Deny Override");
        }

        if (policyElementDTO.getVersion() != null && policyElementDTO.getVersion().trim().length() > 0) {
            policyElement.setAttribute(PolicyConstants.POLICY_VERSION, policyElementDTO.getVersion());
        } else {
            // policy version is can be handled by policy registry.  therefore we can ignore it, although it
            // is a required attribute
            policyElement.setAttribute(PolicyConstants.POLICY_VERSION, "1.0");
        }

        if (policyElementDTO.getPolicyDescription() != null
                && policyElementDTO.getPolicyDescription().trim().length() > 0) {

            Element descriptionElement = doc.createElement(PolicyConstants.DESCRIPTION_ELEMENT);
            descriptionElement.setTextContent(policyElementDTO.getPolicyDescription());
            policyElement.appendChild(descriptionElement);
        }

        TargetElementDTO targetElementDTO = policyElementDTO.getTargetElementDTO();
        List<RuleElementDTO> ruleElementDTOs = policyElementDTO.getRuleElementDTOs();
        List<ObligationElementDTO> obligationElementDTOs = policyElementDTO.getObligationElementDTOs();

        if (targetElementDTO != null) {
            policyElement.appendChild(createTargetElement(targetElementDTO, doc));
        } else {
            policyElement.appendChild(doc.createElement(PolicyConstants.TARGET_ELEMENT));
        }

        if (ruleElementDTOs != null && ruleElementDTOs.size() > 0) {
            for (RuleElementDTO ruleElementDTO : ruleElementDTOs) {
                policyElement.appendChild(createRuleElement(ruleElementDTO, doc));
            }
        } else {
            RuleElementDTO ruleElementDTO = new RuleElementDTO();
            ruleElementDTO.setRuleId(UUID.randomUUID().toString());
            ruleElementDTO.setRuleEffect(PolicyConstants.RuleEffect.DENY);
            policyElement.appendChild(createRuleElement(ruleElementDTO, doc));
        }

        if (obligationElementDTOs != null && obligationElementDTOs.size() > 0) {
            List<ObligationElementDTO> obligations = new ArrayList<ObligationElementDTO>();
            List<ObligationElementDTO> advices = new ArrayList<ObligationElementDTO>();
            for (ObligationElementDTO obligationElementDTO : obligationElementDTOs) {
                if (obligationElementDTO.getType() == ObligationElementDTO.ADVICE) {
                    advices.add(obligationElementDTO);
                } else {
                    obligations.add(obligationElementDTO);
                }
            }
            Element obligation = createObligationsElement(obligations, doc);
            Element advice = createAdvicesElement(advices, doc);
            if (obligation != null) {
                policyElement.appendChild(obligation);
            }
            if (advice != null) {
                policyElement.appendChild(advice);
            }
        }

        return policyElement;
    }

    /**
     * This method creates a policy set element of the XACML policy
     * @param policyElementDTO  policy element data object
     * @param doc XML document
     * @return policyElement
     * @throws PolicyBuilderException if
     */

    public static Element createPolicySetElement(PolicySetElementDTO policyElementDTO, Document doc)
            throws PolicyBuilderException {

        Element policyElement = doc.createElement(PolicyConstants.POLICY_SET_ELEMENT);

        policyElement.setAttribute("xmlns", PolicyConstants.XACMLData.XACML3_POLICY_NAMESPACE);

        if (policyElementDTO.getPolicySetId() != null && policyElementDTO.getPolicySetId().trim().length() > 0) {
            policyElement.setAttribute(PolicyConstants.POLICY_SET_ID, policyElementDTO.getPolicySetId());
        } else {
            throw new PolicyBuilderException("Policy name can not be null");
        }

        if (policyElementDTO.getPolicyCombiningAlgId() != null
                && policyElementDTO.getPolicyCombiningAlgId().trim().length() > 0) {
            policyElement.setAttribute(PolicyConstants.POLICY_ALGORITHM,
                    policyElementDTO.getPolicyCombiningAlgId());
        } else {
            policyElement.setAttribute(PolicyConstants.POLICY_ALGORITHM,
                    PolicyConstants.PolicyCombiningAlog.DENY_OVERRIDE_ID); // TODO
            log.warn("Rule combining algorithm is not defined. Use default algorithm; Deny Override");
        }

        if (policyElementDTO.getVersion() != null && policyElementDTO.getVersion().trim().length() > 0) {
            policyElement.setAttribute(PolicyConstants.POLICY_VERSION, policyElementDTO.getVersion());
        } else {
            // policy version is can be handled by policy registry.  therefore we can ignore it, although it
            // is a required attribute
            policyElement.setAttribute(PolicyConstants.POLICY_VERSION, "1.0");
        }

        if (policyElementDTO.getDescription() != null && policyElementDTO.getDescription().trim().length() > 0) {

            Element descriptionElement = doc.createElement(PolicyConstants.DESCRIPTION_ELEMENT);
            descriptionElement.setTextContent(policyElementDTO.getDescription());
            policyElement.appendChild(descriptionElement);
        }

        TargetElementDTO targetElementDTO = policyElementDTO.getTargetElementDTO();
        List<ObligationElementDTO> obligationElementDTOs = policyElementDTO.getObligationElementDTOs();

        if (targetElementDTO != null) {
            policyElement.appendChild(createTargetElement(targetElementDTO, doc));
        } else {
            policyElement.appendChild(doc.createElement(PolicyConstants.TARGET_ELEMENT));
        }

        List<String> policySets = policyElementDTO.getPolicySets();
        if (policySets != null && policySets.size() > 0) {
            // TODO 
        }

        List<String> policies = policyElementDTO.getPolicies();
        if (policies != null && policies.size() > 0) {
            // TODO    
        }

        List<String> policySetIds = policyElementDTO.getPolicySetIdReferences();
        if (policySetIds != null && policySetIds.size() > 0) {
            for (String policySetId : policySetIds) {
                Element element = doc.createElement(PolicyConstants.POLICY_SET_ID_REFERENCE_ELEMENT);
                element.setTextContent(policySetId);
                policyElement.appendChild(element);
            }
        }

        List<String> policyIds = policyElementDTO.getPolicyIdReferences();
        if (policyIds != null && policyIds.size() > 0) {
            for (String policyId : policyIds) {
                Element element = doc.createElement(PolicyConstants.POLICY_ID_REFERENCE_ELEMENT);
                element.setTextContent(policyId);
                policyElement.appendChild(element);
            }
        }

        if (obligationElementDTOs != null && obligationElementDTOs.size() > 0) {
            List<ObligationElementDTO> obligations = new ArrayList<ObligationElementDTO>();
            List<ObligationElementDTO> advices = new ArrayList<ObligationElementDTO>();
            for (ObligationElementDTO obligationElementDTO : obligationElementDTOs) {
                if (obligationElementDTO.getType() == ObligationElementDTO.ADVICE) {
                    advices.add(obligationElementDTO);
                } else {
                    obligations.add(obligationElementDTO);
                }
            }
            Element obligation = createObligationsElement(obligations, doc);
            Element advice = createAdvicesElement(advices, doc);
            if (obligation != null) {
                policyElement.appendChild(obligation);
            }
            if (advice != null) {
                policyElement.appendChild(advice);
            }
        }

        return policyElement;
    }

    public static Element createRequestElement(RequestElementDTO requestElementDTO, Document doc)
            throws PolicyBuilderException {

        Element requestElement = doc.createElement(PolicyConstants.Request.REQUEST_ELEMENT);
        requestElement.setAttribute("xmlns", PolicyConstants.Request.REQ_RES_CONTEXT_XACML3);
        requestElement.setAttribute(PolicyConstants.Request.RETURN_POLICY_LIST,
                Boolean.toString(requestElementDTO.isReturnPolicyIdList()));
        requestElement.setAttribute(PolicyConstants.Request.COMBINED_DECISION,
                Boolean.toString(requestElementDTO.isCombinedDecision()));

        List<AttributesElementDTO> attributesElementDTOs = requestElementDTO.getAttributesElementDTOs();
        if (attributesElementDTOs != null && attributesElementDTOs.size() > 0) {
            for (AttributesElementDTO dto : attributesElementDTOs) {
                requestElement.appendChild(createAttributesElement(dto, doc));
            }
        }
        return requestElement;
    }

    /**
     * This method creates a match elementof the XACML policy
     * @param matchElementDTO match element data object
     * @param doc XML document
     * @return match Element
     * @throws PolicyBuilderException throws
     */
    public static Element createMatchElement(MatchElementDTO matchElementDTO, Document doc)
            throws PolicyBuilderException {

        Element matchElement = null;
        if (matchElementDTO.getMatchId() != null && matchElementDTO.getMatchId().trim().length() > 0) {

            matchElement = doc.createElement(PolicyConstants.MATCH_ELEMENT);

            matchElement.setAttribute(PolicyConstants.MATCH_ID, matchElementDTO.getMatchId());

            if (matchElementDTO.getAttributeValueElementDTO() != null) {
                Element attributeValueElement = createAttributeValueElement(
                        matchElementDTO.getAttributeValueElementDTO(), doc);
                matchElement.appendChild(attributeValueElement);
            }

            if (matchElementDTO.getAttributeDesignatorDTO() != null) {
                Element attributeDesignatorElement = createAttributeDesignatorElement(
                        matchElementDTO.getAttributeDesignatorDTO(), doc);
                matchElement.appendChild(attributeDesignatorElement);
            }

            if (matchElementDTO.getAttributeSelectorDTO() != null) {
                Element attributeSelectorElement = createAttributeSelectorElement(
                        matchElementDTO.getAttributeSelectorDTO(), doc);
                matchElement.appendChild(attributeSelectorElement);
            }
        }
        return matchElement;
    }

    /**
     * This method creates the attribute value element
     * @param attributeValueElementDTO attribute value element data object
     * @param doc XML document
     * @return attribute value element
     */
    public static Element createAttributeValueElement(AttributeValueElementDTO attributeValueElementDTO,
            Document doc) {

        Element attributeValueElement = doc.createElement(PolicyConstants.ATTRIBUTE_VALUE);

        if (attributeValueElementDTO.getAttributeValue() != null
                && attributeValueElementDTO.getAttributeValue().trim().length() > 0) {

            attributeValueElement.setTextContent(attributeValueElementDTO.getAttributeValue().trim());

            if (attributeValueElementDTO.getAttributeDataType() != null
                    && attributeValueElementDTO.getAttributeDataType().trim().length() > 0) {
                attributeValueElement.setAttribute(PolicyConstants.DATA_TYPE,
                        attributeValueElementDTO.getAttributeDataType());
            } else {
                attributeValueElement.setAttribute(PolicyConstants.DATA_TYPE, PolicyConstants.STRING_DATA_TYPE);
            }

        }

        return attributeValueElement;

    }

    /**
     * This creates XML representation of Attributes Element using AttributesElementDTO object
     *
     * @param elementDTO  AttributesElementDTO
     * @param doc Document
     * @return DOM element
     */
    public static Element createAttributesElement(AttributesElementDTO elementDTO, Document doc) {

        Element attributesElement = doc.createElement(PolicyConstants.ATTRIBUTES);

        attributesElement.setAttribute(PolicyConstants.CATEGORY, elementDTO.getCategory());

        List<AttributeElementDTO> attributeElementDTOs = elementDTO.getAttributeElementDTOs();
        if (attributeElementDTOs != null && attributeElementDTOs.size() > 0) {
            for (AttributeElementDTO attributeElementDTO : attributeElementDTOs) {
                Element attributeElement = doc.createElement(PolicyConstants.ATTRIBUTE);
                attributeElement.setAttribute(PolicyConstants.ATTRIBUTE_ID, attributeElementDTO.getAttributeId());
                attributeElement.setAttribute(PolicyConstants.INCLUDE_RESULT,
                        Boolean.toString(attributeElementDTO.isIncludeInResult()));

                if (attributeElementDTO.getIssuer() != null
                        && attributeElementDTO.getIssuer().trim().length() > 0) {
                    attributeElement.setAttribute(PolicyConstants.ISSUER, attributeElementDTO.getIssuer());
                }

                List<String> values = attributeElementDTO.getAttributeValues();
                for (String value : values) {
                    Element attributeValueElement = doc.createElement(PolicyConstants.ATTRIBUTE_VALUE);
                    attributeValueElement.setAttribute(PolicyConstants.DATA_TYPE,
                            attributeElementDTO.getDataType());
                    attributeValueElement.setTextContent(value.trim());
                    attributeElement.appendChild(attributeValueElement);
                }
                attributesElement.appendChild(attributeElement);
            }
        }
        return attributesElement;
    }

    /**
     * This creates XML representation of function Element using FunctionElementDTO object
     *
     * @param functionElementDTO  FunctionElementDTO
     * @param doc Document
     * @return DOM element
     */
    public static Element createFunctionElement(FunctionElementDTO functionElementDTO, Document doc) {

        Element functionElement = doc.createElement(PolicyConstants.FUNCTION);

        if (functionElementDTO.getFunctionId() != null && functionElementDTO.getFunctionId().trim().length() > 0) {
            functionElement.setAttribute(PolicyConstants.FUNCTION_ID, functionElementDTO.getFunctionId());
        }

        return functionElement;
    }

    /**
     * This creates XML representation of attribute designator Element using AttributeDesignatorDTO object
     *
     * @param attributeDesignatorDTO  AttributeDesignatorDTO
     * @param doc Document
     * @return DOM element
     * @throws PolicyBuilderException throws
     */
    public static Element createAttributeDesignatorElement(AttributeDesignatorDTO attributeDesignatorDTO,
            Document doc) throws PolicyBuilderException {

        String attributeDesignatorElementName = PolicyConstants.ATTRIBUTE_DESIGNATOR;

        Element attributeDesignatorElement = doc.createElement(attributeDesignatorElementName);

        String attributeId = attributeDesignatorDTO.getAttributeId();
        String category = attributeDesignatorDTO.getCategory();

        if (attributeId != null && attributeId.trim().length() > 0 && category != null
                && category.trim().length() > 0) {

            attributeDesignatorElement.setAttribute(PolicyConstants.ATTRIBUTE_ID,
                    attributeDesignatorDTO.getAttributeId());

            attributeDesignatorElement.setAttribute(PolicyConstants.CATEGORY, attributeDesignatorDTO.getCategory());

            if (attributeDesignatorDTO.getDataType() != null
                    && attributeDesignatorDTO.getDataType().trim().length() > 0) {
                attributeDesignatorElement.setAttribute(PolicyConstants.DATA_TYPE,
                        attributeDesignatorDTO.getDataType());
            } else {
                attributeDesignatorElement.setAttribute(PolicyConstants.DATA_TYPE,
                        PolicyConstants.STRING_DATA_TYPE);
            }

            if (attributeDesignatorDTO.getIssuer() != null
                    && attributeDesignatorDTO.getIssuer().trim().length() > 0) {
                attributeDesignatorElement.setAttribute(PolicyConstants.ISSUER, attributeDesignatorDTO.getIssuer());
            }

            if (attributeDesignatorDTO.getMustBePresent() != null
                    && attributeDesignatorDTO.getMustBePresent().trim().length() > 0) {
                attributeDesignatorElement.setAttribute(PolicyConstants.MUST_BE_PRESENT,
                        attributeDesignatorDTO.getMustBePresent());
            } else {
                attributeDesignatorElement.setAttribute(PolicyConstants.MUST_BE_PRESENT, "true");
            }
        } else {
            throw new PolicyBuilderException("Category  name can not be null"); // TODO
        }

        return attributeDesignatorElement;
    }

    /**
     * This creates XML representation of attribute selector Element using AttributeSelectorDTO object
     *
     * @param attributeSelectorDTO  AttributeSelectorDTO
     * @param doc Document
     * @return DOM element
     */
    public static Element createAttributeSelectorElement(AttributeSelectorDTO attributeSelectorDTO, Document doc) {

        Element attributeSelectorElement = doc.createElement(PolicyConstants.ATTRIBUTE_SELECTOR);

        if (attributeSelectorDTO.getAttributeSelectorRequestContextPath() != null
                && attributeSelectorDTO.getAttributeSelectorRequestContextPath().trim().length() > 0) {

            attributeSelectorElement.setAttribute(PolicyConstants.REQUEST_CONTEXT_PATH,
                    PolicyConstants.ATTRIBUTE_NAMESPACE
                            + attributeSelectorDTO.getAttributeSelectorRequestContextPath());

            if (attributeSelectorDTO.getAttributeSelectorDataType() != null
                    && attributeSelectorDTO.getAttributeSelectorDataType().trim().length() > 0) {
                attributeSelectorElement.setAttribute(PolicyConstants.DATA_TYPE,
                        attributeSelectorDTO.getAttributeSelectorDataType());
            } else {
                attributeSelectorElement.setAttribute(PolicyConstants.DATA_TYPE, PolicyConstants.STRING_DATA_TYPE);
            }

            if (attributeSelectorDTO.getAttributeSelectorMustBePresent() != null
                    && attributeSelectorDTO.getAttributeSelectorMustBePresent().trim().length() > 0) {
                attributeSelectorElement.setAttribute(PolicyConstants.MUST_BE_PRESENT,
                        attributeSelectorDTO.getAttributeSelectorMustBePresent());
            }

        }

        return attributeSelectorElement;
    }

    /**
     * This creates XML representation of obligation Element  using List of ObligationElementDTO object
     *
     * @param obligationElementDTOs List of ObligationElementDTO
     * @param doc Document
     * @return DOM element
     * @throws PolicyBuilderException throws
     */
    public static Element createObligationsElement(List<ObligationElementDTO> obligationElementDTOs, Document doc)
            throws PolicyBuilderException {

        Element obligationExpressions = null;

        if (obligationElementDTOs != null && obligationElementDTOs.size() > 0) {

            for (ObligationElementDTO dto : obligationElementDTOs) {
                String id = dto.getId();
                String effect = dto.getEffect();

                if (id != null && id.trim().length() > 0 && effect != null) {
                    if (obligationExpressions == null) {
                        obligationExpressions = doc.createElement(PolicyConstants.OBLIGATION_EXPRESSIONS);
                    }
                    Element obligationExpression = doc.createElement(PolicyConstants.OBLIGATION_EXPRESSION);
                    obligationExpression.setAttribute(PolicyConstants.OBLIGATION_ID, id);
                    obligationExpression.setAttribute(PolicyConstants.OBLIGATION_EFFECT, effect);
                    List<AttributeAssignmentElementDTO> elementDTOs = dto.getAssignmentElementDTOs();
                    if (elementDTOs != null) {
                        for (AttributeAssignmentElementDTO elementDTO : elementDTOs) {
                            Element element = createAttributeAssignmentElement(elementDTO, doc);
                            if (element != null) {
                                obligationExpression.appendChild(element);
                            }
                        }
                    }
                    obligationExpressions.appendChild(obligationExpression);
                }
            }
        }

        return obligationExpressions;
    }

    /**
     * This creates XML representation of advice element using List of ObligationElementDTO object
     *
     * @param obligationElementDTOs List of ObligationElementDTO
     * @param doc Document
     * @return DOM element
     * @throws PolicyBuilderException throws
     */
    public static Element createAdvicesElement(List<ObligationElementDTO> obligationElementDTOs, Document doc)
            throws PolicyBuilderException {

        Element adviceExpressions = null;

        if (obligationElementDTOs != null && obligationElementDTOs.size() > 0) {

            for (ObligationElementDTO dto : obligationElementDTOs) {
                String id = dto.getId();
                String effect = dto.getEffect();

                if (id != null && id.trim().length() > 0 && effect != null) {
                    if (adviceExpressions == null) {
                        adviceExpressions = doc.createElement(PolicyConstants.ADVICE_EXPRESSIONS);
                    }

                    Element adviceExpression = doc.createElement(PolicyConstants.ADVICE_EXPRESSION);
                    adviceExpression.setAttribute(PolicyConstants.ADVICE_ID, id);
                    adviceExpression.setAttribute(PolicyConstants.ADVICE_EFFECT, effect);
                    List<AttributeAssignmentElementDTO> elementDTOs = dto.getAssignmentElementDTOs();
                    if (elementDTOs != null) {
                        for (AttributeAssignmentElementDTO elementDTO : elementDTOs) {
                            Element element = createAttributeAssignmentElement(elementDTO, doc);
                            if (element != null) {
                                adviceExpression.appendChild(element);
                            }
                        }
                    }
                    adviceExpressions.appendChild(adviceExpression);
                }
            }
        }

        return adviceExpressions;
    }

    /**
     * This creates XML representation of assignment element using AttributeAssignmentElementDTO object
     *
     * @param assignmentElementDTO AttributeAssignmentElementDTO
     * @param doc Document
     * @return DOM element
     * @throws PolicyBuilderException throws
     */
    public static Element createAttributeAssignmentElement(AttributeAssignmentElementDTO assignmentElementDTO,
            Document doc) throws PolicyBuilderException {

        String attributeId = assignmentElementDTO.getAttributeId();

        if (attributeId != null && attributeId.trim().length() > 0) {

            String category = assignmentElementDTO.getCategory();
            String issuer = assignmentElementDTO.getIssuer();
            ApplyElementDTO applyElementDTO = assignmentElementDTO.getApplyElementDTO();
            AttributeDesignatorDTO designatorDTO = assignmentElementDTO.getDesignatorDTO();
            AttributeValueElementDTO valueElementDTO = assignmentElementDTO.getValueElementDTO();

            Element attributeAssignment = doc.createElement(PolicyConstants.ATTRIBUTE_ASSIGNMENT);
            attributeAssignment.setAttribute(PolicyConstants.ATTRIBUTE_ID, attributeId);
            if (category != null && category.trim().length() > 0) {
                attributeAssignment.setAttribute(PolicyConstants.CATEGORY, category);
            }

            if (issuer != null && issuer.trim().length() > 0) {
                attributeAssignment.setAttribute(PolicyConstants.ISSUER, issuer);
            }

            if (applyElementDTO != null) {
                attributeAssignment.appendChild(createApplyElement(applyElementDTO, doc));
            }

            if (designatorDTO != null) {
                attributeAssignment.appendChild(createAttributeDesignatorElement(designatorDTO, doc));
            }

            if (valueElementDTO != null) {
                attributeAssignment.appendChild(createAttributeValueElement(valueElementDTO, doc));
            }

            return attributeAssignment;
        }

        return null;
    }

    /**
     * This creates XML representation of target element using TargetElementDTO object
     *
     * @param targetElementDTO TargetElementDTO
     * @param doc Document
     * @return DOM element
     * @throws PolicyBuilderException throws
     */
    public static Element createTargetElement(TargetElementDTO targetElementDTO, Document doc)
            throws PolicyBuilderException {

        Element targetElement = doc.createElement(PolicyConstants.TARGET_ELEMENT);
        List<AnyOfElementDTO> anyOfElementDTOs = targetElementDTO.getAnyOfElementDTOs();

        for (AnyOfElementDTO anyOfElementDTO : anyOfElementDTOs) {
            Element anyOfElement = doc.createElement(PolicyConstants.ANY_OF_ELEMENT);
            List<AllOfElementDTO> allOfElementDTOs = anyOfElementDTO.getAllOfElementDTOs();

            for (AllOfElementDTO allOfElementDTO : allOfElementDTOs) {
                Element allOfElement = doc.createElement(PolicyConstants.ALL_OF_ELEMENT);
                List<MatchElementDTO> matchElementDTOs = allOfElementDTO.getMatchElementDTOs();

                for (MatchElementDTO matchElementDTO : matchElementDTOs) {
                    Element matchElement = createMatchElement(matchElementDTO, doc);

                    allOfElement.appendChild(matchElement);
                }

                anyOfElement.appendChild(allOfElement);
            }

            targetElement.appendChild(anyOfElement);
        }

        return targetElement;

    }

    /**
     * This creates XML representation of rule element using RuleElementDTO object
     *
     * @param ruleElementDTO RuleElementDTO
     * @param doc Document
     * @return DOM element
     * @throws PolicyBuilderException throws
     */
    public static Element createRuleElement(RuleElementDTO ruleElementDTO, Document doc)
            throws PolicyBuilderException {

        TargetElementDTO targetElementDTO = ruleElementDTO.getTargetElementDTO();
        ConditionElementDT0 conditionElementDT0 = ruleElementDTO.getConditionElementDT0();
        List<ObligationElementDTO> obligationElementDTOs = ruleElementDTO.getObligationElementDTOs();

        Element ruleElement = doc.createElement(PolicyConstants.RULE_ELEMENT);

        if (ruleElementDTO.getRuleId() != null && ruleElementDTO.getRuleId().trim().length() > 0) {
            ruleElement.setAttribute(PolicyConstants.RULE_ID, ruleElementDTO.getRuleId());
        }

        if (ruleElementDTO.getRuleEffect() != null && ruleElementDTO.getRuleEffect().trim().length() > 0) {
            ruleElement.setAttribute(PolicyConstants.RULE_EFFECT, ruleElementDTO.getRuleEffect());
        }

        if (ruleElementDTO.getRuleDescription() != null
                && ruleElementDTO.getRuleDescription().trim().length() > 0) {
            Element descriptionElement = doc.createElement(PolicyConstants.DESCRIPTION_ELEMENT);
            descriptionElement.setTextContent(ruleElementDTO.getRuleDescription());
            ruleElement.appendChild(descriptionElement);
        }

        if (targetElementDTO != null) {
            Element targetElement = createTargetElement(targetElementDTO, doc);
            ruleElement.appendChild(targetElement);
        }

        if (conditionElementDT0 != null) {
            ruleElement.appendChild(createConditionElement(conditionElementDT0, doc));
        }

        if (obligationElementDTOs != null && obligationElementDTOs.size() > 0) {
            List<ObligationElementDTO> obligations = new ArrayList<ObligationElementDTO>();
            List<ObligationElementDTO> advices = new ArrayList<ObligationElementDTO>();
            for (ObligationElementDTO obligationElementDTO : obligationElementDTOs) {
                if (obligationElementDTO.getType() == ObligationElementDTO.ADVICE) {
                    advices.add(obligationElementDTO);
                } else {
                    obligations.add(obligationElementDTO);
                }
            }
            Element obligation = createObligationsElement(obligations, doc);
            Element advice = createAdvicesElement(advices, doc);
            if (obligation != null) {
                ruleElement.appendChild(obligation);
            }
            if (advice != null) {
                ruleElement.appendChild(advice);
            }
        }

        return ruleElement;
    }

    /**
     * This creates XML representation of condition element using ConditionElementDT0 object
     *
     * @param conditionElementDT0 ConditionElementDT0
     * @param doc Document
     * @return DOM element
     * @throws PolicyBuilderException throws
     */
    public static Element createConditionElement(ConditionElementDT0 conditionElementDT0, Document doc)
            throws PolicyBuilderException {

        Element conditionElement = doc.createElement(PolicyConstants.CONDITION_ELEMENT);

        if (conditionElementDT0.getApplyElement() != null) {
            conditionElement.appendChild(createApplyElement(conditionElementDT0.getApplyElement(), doc));

        } else if (conditionElementDT0.getAttributeValueElementDTO() != null) {
            Element attributeValueElement = createAttributeValueElement(
                    conditionElementDT0.getAttributeValueElementDTO(), doc);
            conditionElement.appendChild(attributeValueElement);

        } else if (conditionElementDT0.getAttributeDesignator() != null) {
            AttributeDesignatorDTO attributeDesignatorDTO = conditionElementDT0.getAttributeDesignator();
            conditionElement.appendChild(createAttributeDesignatorElement(attributeDesignatorDTO, doc));

        } else if (conditionElementDT0.getFunctionFunctionId() != null) {
            Element functionElement = doc.createElement(PolicyConstants.FUNCTION_ELEMENT);
            functionElement.setAttribute(PolicyConstants.FUNCTION_ID, conditionElementDT0.getFunctionFunctionId());
            conditionElement.appendChild(functionElement);
        } else if (conditionElementDT0.getVariableId() != null) {
            Element variableReferenceElement = doc.createElement(PolicyConstants.VARIABLE_REFERENCE);
            variableReferenceElement.setAttribute(PolicyConstants.VARIABLE_ID, conditionElementDT0.getVariableId());
            conditionElement.appendChild(variableReferenceElement);
        }

        return conditionElement;

    }

    /**
     * This creates XML representation of apply element using ApplyElementDTO object
     *
     * @param applyElementDTO ApplyElementDTO
     * @param doc Document
     * @return DOM element
     * @throws PolicyBuilderException throws
     */
    public static Element createApplyElement(ApplyElementDTO applyElementDTO, Document doc)
            throws PolicyBuilderException {

        Element applyElement = doc.createElement(PolicyConstants.APPLY_ELEMENT);

        if (applyElementDTO.getFunctionId() != null && applyElementDTO.getFunctionId().trim().length() > 0) {
            applyElement.setAttribute(PolicyConstants.FUNCTION_ID, applyElementDTO.getFunctionId());
        }

        if (applyElementDTO.getFunctionFunctionId() != null
                && applyElementDTO.getFunctionFunctionId().trim().length() > 0) {
            FunctionElementDTO functionElementDTO = new FunctionElementDTO();
            functionElementDTO.setFunctionId(applyElementDTO.getFunctionFunctionId());
            Element functionElement = createFunctionElement(functionElementDTO, doc);
            applyElement.appendChild(functionElement);
        }

        List<ApplyElementDTO> applyElementDTOs = applyElementDTO.getApplyElements();

        if (applyElementDTOs != null && applyElementDTOs.size() > 0) {

            for (ApplyElementDTO elementDTO : applyElementDTOs) {
                Element subApplyElement = createApplyElement(elementDTO, doc);
                applyElement.appendChild(subApplyElement);
            }
        }

        List<AttributeValueElementDTO> attributeValueElementDTOs = applyElementDTO.getAttributeValueElementDTOs();
        if (attributeValueElementDTOs != null && attributeValueElementDTOs.size() > 0) {

            for (AttributeValueElementDTO attributeValueElementDTO : attributeValueElementDTOs) {
                Element attributeValueElement = createAttributeValueElement(attributeValueElementDTO, doc);

                applyElement.appendChild(attributeValueElement);
            }
        }

        List<AttributeDesignatorDTO> attributeDesignatorDTOs = applyElementDTO.getAttributeDesignators();
        if (attributeDesignatorDTOs != null && attributeDesignatorDTOs.size() > 0) {

            for (AttributeDesignatorDTO attributeDesignatorDTO : attributeDesignatorDTOs) {
                Element attributeDesignatorElement = createAttributeDesignatorElement(attributeDesignatorDTO, doc);
                applyElement.appendChild(attributeDesignatorElement);
            }
        }

        List<AttributeSelectorDTO> attributeSelectorDTOs = applyElementDTO.getAttributeSelectors();
        if (attributeSelectorDTOs != null && attributeSelectorDTOs.size() > 0) {

            for (AttributeSelectorDTO attributeSelectorDTO : attributeSelectorDTOs) {
                Element attributeSelectorElement = createAttributeSelectorElement(attributeSelectorDTO, doc);
                applyElement.appendChild(attributeSelectorElement);
            }
        }
        return applyElement;
    }
}