/**
 *
 * Copyright (c) 2014, the Railo Company Ltd. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either 
 * version 2.1 of the License, or (at your option) any later version.
 * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public 
 * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
 * 
 **/
package lucee.runtime.cache.tag.request;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import lucee.runtime.PageContext;
import lucee.runtime.cache.tag.CacheHandler;
import lucee.runtime.cache.tag.CacheHandlerFilter;
import lucee.runtime.cache.tag.CacheItem;
import lucee.runtime.config.ConfigWeb;
import lucee.runtime.op.Caster;
import lucee.runtime.op.Duplicator;

public class RequestCacheHandler implements CacheHandler {
	
	private static ThreadLocal<Map<String,CacheItem>> data=new ThreadLocal<Map<String,CacheItem>>() {
		@Override 
		protected Map<String,CacheItem> initialValue() {
			return new HashMap<String, CacheItem>();
		}
	};
	private int cacheType;
	private String id;

	public RequestCacheHandler() {}
	
	@Override
	public void init(ConfigWeb cw,String id,int cacheType){
		this.id=id; 
		this.cacheType=cacheType; 
	}

	@Override
	public CacheItem get(PageContext pc, String id) {
		return duplicate(data.get().get(id));
	}

	@Override
	public boolean remove(PageContext pc, String id) {
		return data.get().remove(id)!=null;
	}

	@Override
	public void set(PageContext pc, String id,Object cachedwithin, CacheItem value) {
		// cachedwithin is ignored in this cache, it should be "request"
		data.get().put(id,duplicate(value));
	}

	private CacheItem duplicate(CacheItem value) {
		if(value==null) return null;
		return (CacheItem) Duplicator.duplicate(value, true);
	}

	@Override
	public void clear(PageContext pc) {
		data.get().clear();
	}

	@Override
	public void clear(PageContext pc, CacheHandlerFilter filter) {
		Iterator<Entry<String, CacheItem>> it = data.get().entrySet().iterator();
		Entry<String, CacheItem> e;
		while(it.hasNext()){
			e = it.next();
			if(filter==null || filter.accept(e.getValue()))
				it.remove();
		}
	}

	@Override
	public int size(PageContext pc) {
		return data.get().size();
	}

	@Override
	public void clean(PageContext pc) {
		// not necessary
	}

	@Override
	public String id() {
		return id;
	}

	@Override
	public void release(PageContext pc) {
		clear(pc);
	}
	
	@Override
	public boolean acceptCachedWithin(Object cachedWithin) {
		String str=Caster.toString(cachedWithin,"").trim();
		return str.equalsIgnoreCase("request");
	}

	@Override
	public String pattern() {
		return "request";
	}
}
@@ -1615,17 +1615,16 @@
 s.id=id;
- 
 %0A%09%09this.

clean up