Java tutorial
/* * 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); } }