Package er.extensions.appserver

Source Code of er.extensions.appserver.ERXWOResponseCacheKeyPolicy

//
//  ERXWOResponseCachePolicy.java
//  ERExtensions
//
//  Created by Max Muller on Mon Dec 09 2002.
//
package er.extensions.appserver;

import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import com.webobjects.appserver.WORequest;
import com.webobjects.foundation.NSArray;

import er.extensions.foundation.ERXMultiKey;

public class ERXWOResponseCacheKeyPolicy implements ERXWOResponseCache.Policy {

    protected static ERXWOResponseCacheKeyPolicy sharedInstance;

    public static ERXWOResponseCacheKeyPolicy sharedInstance() {
        if (sharedInstance == null) {
            sharedInstance = new ERXWOResponseCacheKeyPolicy();
        }
        return sharedInstance;
    }

    public static class PolicyCacheEntry {

        public NSArray formKeys;
        public NSArray headerKeys;
        public NSArray cookieKeys;

        public int count;
       
        public PolicyCacheEntry(NSArray formKeys, NSArray headerKeys, NSArray cookieKeys) {
            this.formKeys = formKeys != null ? formKeys : NSArray.EmptyArray;
            this.headerKeys = headerKeys != null ? headerKeys : NSArray.EmptyArray;
            this.cookieKeys = cookieKeys != null ? cookieKeys : NSArray.EmptyArray;

            count = this.formKeys.count() + this.headerKeys.count() + this.cookieKeys.count();
        }
       
    }

    protected Map cacheKeyMap = new HashMap();
   
    public ERXWOResponseCacheKeyPolicy() {
    }
   
    public void createPolicyEntryForClass(Class actionClass,
                                          NSArray actionNames,
                                          NSArray formKeys,
                                          NSArray headerKeys,
                                          NSArray cookieKeys) {
        PolicyCacheEntry policyCacheEntry = new PolicyCacheEntry(formKeys, headerKeys, cookieKeys);
        if (actionNames.count() > 0) {
            for (Enumeration actionNameEnumerator = actionNames.objectEnumerator(); actionNameEnumerator.hasMoreElements();) {
                String actionName = (String)actionNameEnumerator.nextElement();
                cacheKeyMap.put(actionClass.getName() + "@" + actionName, policyCacheEntry);
            }
        } else {
            cacheKeyMap.put(actionClass.getName(), policyCacheEntry);
        }
    }

    public boolean actionNameIsCachableForClass(Class actionClass, String actionName) {
        return policyCacheEntryForClass(actionClass, actionName) != null;
    }

    public ERXMultiKey cacheKeyForRequest(Class actionClass, String actionName, WORequest request) {
        ERXMultiKey cacheKey = null;
        PolicyCacheEntry cacheEntry = policyCacheEntryForClass(actionClass, actionName);
        if (cacheEntry != null) {
            int count = 0;
            Object[] cache = new Object[cacheEntry.count + 2];
            cache[count++] = actionClass;
            cache[count++] = actionName;
            if (cacheEntry.formKeys.count() > 0) {
                for (Enumeration formKeyEnumerator = cacheEntry.formKeys.objectEnumerator();
                     formKeyEnumerator.hasMoreElements();) {
                    String formKey = (String)formKeyEnumerator.nextElement();
                    cache[count++] = request.formValueForKey(formKey);
                }
            }
            if (cacheEntry.headerKeys.count() > 0) {
                for (Enumeration headerKeyEnumerator = cacheEntry.headerKeys.objectEnumerator();
                     headerKeyEnumerator.hasMoreElements();) {
                    String headerKey = (String)headerKeyEnumerator.nextElement();
                    cache[count++] = request.headerForKey(headerKey);
                }               
            }
            if (cacheEntry.cookieKeys.count() > 0) {
                for (Enumeration cookieKeyEnumerator = cacheEntry.cookieKeys.objectEnumerator();
                     cookieKeyEnumerator.hasMoreElements();) {
                    String cookieKey = (String)cookieKeyEnumerator.nextElement();
                    cache[count++] = request.cookieValueForKey(cookieKey);
                }               
            }
            cacheKey = new ERXMultiKey(cache);
        }
        return cacheKey;
    }

    public PolicyCacheEntry policyCacheEntryForClass(Class actionClass, String actionName) {
        PolicyCacheEntry cacheEntry = (PolicyCacheEntry)cacheKeyMap.get(actionClass.getName() + "@" + actionName);
        return cacheEntry != null ? cacheEntry : (PolicyCacheEntry)cacheKeyMap.get(actionClass.getName());
    }
   
    /**
     * Can be overridden by subclasses to perform specific checks
     * to see if the cache should be reset.
     * @return if the cache should be reset.
     */
    public boolean shouldResetCache() {
        return false;
    }
}
TOP

Related Classes of er.extensions.appserver.ERXWOResponseCacheKeyPolicy

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.