Package org.wso2.caching.policy

Source Code of org.wso2.caching.policy.CachingPolicyProcessor

/*
* Copyright (c) 2006, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* Licensed 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 org.wso2.caching.policy;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.neethi.All;
import org.apache.neethi.ExactlyOne;
import org.apache.neethi.Policy;
import org.apache.neethi.PolicyEngine;
import org.apache.neethi.builders.xml.XmlPrimtiveAssertion;
import org.apache.axis2.description.PolicySubject;
import org.wso2.caching.CacheConfiguration;
import org.wso2.caching.CachingConstants;
import org.wso2.caching.CachingException;
import org.wso2.caching.digest.DigestGenerator;

import javax.xml.namespace.QName;
import java.util.Iterator;
import java.util.List;
import java.util.Collection;

public class CachingPolicyProcessor {

    /**
     * This will hold the log variable for the log4j appender
     */
    private static Log log = LogFactory.getLog(CachingPolicyProcessor.class);

    /**
     * This static method will be use to process the caching policy when the module is initialized
     * and get the CacheManager object initialized according to the policy
     *
     * @param policySubject- Policy object from the EffectivePolicy
     * @return CacheManager object initialized and returned
     * @throws org.wso2.caching.CachingException
     *          - If an error occured in processing the policy
     *          or if there is a problem in loading the DigestGenerator
     */
    public static CacheConfiguration processCachingPolicy(PolicySubject policySubject) throws CachingException {

        if (policySubject.getAttachedPolicyComponents().size() != 0) {
            CacheConfiguration cacheConfig = new CacheConfiguration();
            Collection topLevelAssertionList = policySubject.getAttachedPolicyComponents();
            handlePolicyComponents(cacheConfig, topLevelAssertionList);
            return cacheConfig;
        } else {
            return null;
        }
    }

    private static void handlePolicyComponents(CacheConfiguration cacheConfig,
                                               Collection topLevelAssertionList)
            throws CachingException {
        for (Iterator topLevelAssertionsIterator
                = topLevelAssertionList.iterator(); topLevelAssertionsIterator.hasNext();) {

            Object topLevelAssertionObject = topLevelAssertionsIterator.next();

            if (topLevelAssertionObject instanceof Policy) {
                Policy policy = (Policy) topLevelAssertionObject;
                Collection policyComponents = policy.getPolicyComponents();
                handlePolicyComponents(cacheConfig, policyComponents);
            } else if (topLevelAssertionObject instanceof ExactlyOne) {
                ExactlyOne eo = (ExactlyOne) topLevelAssertionObject;
                handlePolicyComponents(cacheConfig, eo.getPolicyComponents());
            } else if (topLevelAssertionObject instanceof All) {
                All all = (All) topLevelAssertionObject;
                handlePolicyComponents(cacheConfig, all.getPolicyComponents());
            } else if (topLevelAssertionObject instanceof XmlPrimtiveAssertion) {
                // Validating the policy

                XmlPrimtiveAssertion topLevelXmlPrimtiveAssertion
                        = (XmlPrimtiveAssertion) topLevelAssertionObject;
                QName qName = topLevelXmlPrimtiveAssertion.getName();
                // validating the Caching assertion
                if (qName.equals(CachingConstants.CACHING_ASSERTION_QNAME)) {

                    Policy cachingPolicyComponent
                            = PolicyEngine.getPolicy(topLevelXmlPrimtiveAssertion.getValue());
                    List assertionList = cachingPolicyComponent.getPolicyComponents();
                    for (Iterator configDataAssertionIterator = assertionList.iterator();
                         configDataAssertionIterator.hasNext();) {

                        Object aConfigDataAssertionObject = configDataAssertionIterator.next();
                        // Validating the caching policy
                        if (aConfigDataAssertionObject instanceof Policy) {

                            long expireTime;
                            DigestGenerator digestGenerator;
                            int maxMessageSize;
                            int maxCacheSize;

                            Policy cachingPolicy = (Policy) aConfigDataAssertionObject;
                            List childAssertionsList = cachingPolicy.getPolicyComponents();
                            for (Iterator childAssertionSIterator = childAssertionsList
                                    .iterator(); childAssertionSIterator.hasNext();) {

                                Object configData = childAssertionSIterator.next();
                                if (configData instanceof All) {

                                    All all = (All) configData;
                                    List configDataList = all.getPolicyComponents();
                                    for (Iterator configIterator = configDataList
                                            .iterator(); configIterator.hasNext();) {

                                        Object configDtaObject = configIterator.next();
                                        if (configDtaObject instanceof XmlPrimtiveAssertion) {

                                            XmlPrimtiveAssertion cachingPrimtiveAssertion
                                                    = (XmlPrimtiveAssertion) configDtaObject;
                                            //todo : break the processing
                                            // Is Identifier specified?
                                            if (cachingPrimtiveAssertion.getName().equals(
                                                    CachingConstants.CACHING_XML_IDENTIFIER_QNAME)) {

                                                String value
                                                        = cachingPrimtiveAssertion.getValue()
                                                        .getText();
                                                try {

                                                    // Loading the class using Reflection
                                                    digestGenerator = (DigestGenerator)
                                                            Class.forName(value).newInstance();
                                                    cacheConfig.setDigestGenerator(digestGenerator);

                                                } catch (ClassNotFoundException e) {

                                                    handleException("Unable to find the " +
                                                            "DigestGenerator implementation \"" +
                                                            value + "\"", e);

                                                } catch (IllegalAccessException e) {

                                                    handleException("Unable to load the " +
                                                            "DigestGenerator implementation \"" +
                                                            value + "\"", e);

                                                } catch (InstantiationException e) {

                                                    handleException("Unable to instantiate the " +
                                                            "DigestGenerator implementation \"" +
                                                            value + "\"", e);

                                                }
                                            }

                                            // Is expiration time specified?
                                            if (cachingPrimtiveAssertion.getName().equals(
                                                    CachingConstants.CACHE_EXPIRATION_TIME_QNAME) &&
                                                    cachingPrimtiveAssertion.getValue() != null) {

                                                expireTime = Long.parseLong(
                                                        cachingPrimtiveAssertion
                                                                .getValue().getText());
                                                cacheConfig.setTimeout(expireTime);
                                            }

                                            // Is max message size specified?
                                            if (cachingPrimtiveAssertion.getName().equals(
                                                    CachingConstants.MAX_MESSAGE_SIZE_QNAME) &&
                                                    cachingPrimtiveAssertion.getValue() != null) {

                                                maxMessageSize = Integer.parseInt(
                                                        cachingPrimtiveAssertion
                                                                .getValue().getText());
                                                cacheConfig.setMaxMessageSize(maxMessageSize);
                                            }

                                            // Is max cache size specified?
                                            if (cachingPrimtiveAssertion.getName().equals(
                                                    CachingConstants.MAX_CACHE_SIZE_QNAME) &&
                                                    cachingPrimtiveAssertion.getValue() != null) {

                                                maxCacheSize = Integer.parseInt(
                                                        cachingPrimtiveAssertion
                                                                .getValue().getText());
                                                cacheConfig.setMaxCacheSize(maxCacheSize);
                                            }

                                        } else {
                                            // invalid caching policy
                                            handleException("Unexpected caching policy " +
                                                    "assertion for the caching module");
                                        }
                                    }
                                } else {
                                    // caching policy All not found
                                    handleException("Unexpected caching " +
                                            "policy, \"wsp:All\" expected");
                                }
                            }
                        } else {
                            // handle policy
                        }
                    }
                }
            } else {
                // handle top level
            }
        }
    }

    /**
     * Private method to be used by the above static method for exception handling
     *
     * @param message - String message of the Exception
     * @param cause   - Throwable cause of the exception
     * @throws CachingException with the provided mesage and cause
     */
    private static void handleException(String message, Throwable cause) throws CachingException {

        if (log.isDebugEnabled()) {
            log.debug(message, cause);
        }
        throw new CachingException(message, cause);
    }

    /**
     * Private method to be used for the exception handling
     *
     * @param message - String message of the exception
     * @throws CachingException with the provided message
     */
    private static void handleException(String message) throws CachingException {

        if (log.isDebugEnabled()) {
            log.debug(message);
        }
        throw new CachingException(message);
    }
}
TOP

Related Classes of org.wso2.caching.policy.CachingPolicyProcessor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.