package railo.runtime.type.scope;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import railo.runtime.PageContext;
import railo.runtime.config.NullSupportHelper;
import railo.runtime.dump.DumpData;
import railo.runtime.dump.DumpProperties;
import railo.runtime.exp.ExpressionException;
import railo.runtime.exp.PageException;
import railo.runtime.type.Collection;
import railo.runtime.type.KeyImpl;
import railo.runtime.type.Struct;
import railo.runtime.type.StructImpl;
import railo.runtime.type.it.EntryIterator;
import railo.runtime.type.util.StructSupport;
public final class RequestImpl extends StructSupport implements Request {
private HttpServletRequest _req;
private boolean init;
private static int _id=0;
private int id=0;
public RequestImpl() {
id=++_id;
//super("request",SCOPE_REQUEST,Struct.TYPE_REGULAR);
}
/**
* @return Returns the id.
*/
public int _getId() {
return id;
}
public void initialize(PageContext pc) {
_req = pc.getHttpServletRequest();//HTTPServletRequestWrap.pure(pc.getHttpServletRequest());
init=true;
}
@Override
public boolean isInitalized() {
return init;
}
@Override
public void release() {
init = false;
}
@Override
public void release(PageContext pc) {
init = false;
}
@Override
public int getType() {
return SCOPE_REQUEST;
}
@Override
public String getTypeAsString() {
return "request";
}
@Override
public int size() {
int size=0;
synchronized (_req) {
Enumeration<String> names = _req.getAttributeNames();
while(names.hasMoreElements()){
names.nextElement();
size++;
}
}
return size;
}
@Override
public Iterator<Collection.Key> keyIterator() {
return keyList().iterator();
}
private List<Key> keyList() {
synchronized (_req) {
Enumeration<String> names = _req.getAttributeNames();
List<Key> list=new ArrayList<Key>();
while(names.hasMoreElements()){
list.add(KeyImpl.getInstance(names.nextElement()));
}
return list;
}
}
@Override
public Iterator<Entry<Key, Object>> entryIterator() {
return new EntryIterator(this,keys());
}
@Override
public Iterator<Object> valueIterator() {
synchronized (_req) {
Enumeration<String> names = _req.getAttributeNames();
List<Object> list=new ArrayList<Object>();
while(names.hasMoreElements()){
list.add(_req.getAttribute(names.nextElement()));
}
return list.iterator();
}
}
@Override
public Key[] keys() {
List<Key> list = keyList();
return list.toArray(new Key[list.size()]);
}
@Override
public Object remove(Key key) throws PageException {
Object value = remove(key,NullSupportHelper.NULL());
if(value!=NullSupportHelper.NULL())return value;
throw new ExpressionException("can't remove key ["+key+"] from struct, key doesn't exist");
}
@Override
public void clear() {
synchronized (_req) {
Enumeration<String> names = _req.getAttributeNames();
while(names.hasMoreElements()){
_req.removeAttribute(names.nextElement());
}
}
}
public Object get(Key key) throws PageException {
Object value = get(key,NullSupportHelper.NULL());
if(value==NullSupportHelper.NULL()) throw invalidKey(null,this,key);
return value;
}
public Object removeEL(Key key) {
return remove(key,null);
}
private Object remove(Key key, Object defaultValue) {
synchronized (_req) {
Object value = _req.getAttribute(key.getLowerString());
if(value!=null) {
_req.removeAttribute(key.getLowerString());
return value;
}
value=defaultValue;
Enumeration<String> names = _req.getAttributeNames();
String k;
while(names.hasMoreElements()){
k=names.nextElement();
if(k.equalsIgnoreCase(key.getString())) {
value= _req.getAttribute(k);
_req.removeAttribute(k);
return value;
}
}
return defaultValue;
}
}
@Override
public Object get(Key key, Object defaultValue) {
synchronized (_req) {
Object value = _req.getAttribute(key.getLowerString());
if(value!=null) return value;
Enumeration<String> names = _req.getAttributeNames();
Collection.Key k;
while(names.hasMoreElements()){
k=KeyImpl.init(names.nextElement());
if(key.equals(k)) return _req.getAttribute(k.getString());
}
return defaultValue;
}
}
@Override
public Object setEL(Key key, Object value) {
synchronized (_req) {
_req.setAttribute(key.getLowerString(), value);
}
return value;
}
@Override
public Object set(Key key, Object value) throws PageException {
return setEL(key, value);
}
@Override
public Collection duplicate(boolean deepCopy) {
Struct trg=new StructImpl();
StructImpl.copy(this, trg,deepCopy);
return trg;
}
@Override
public boolean containsKey(Key key) {
return get(key,NullSupportHelper.NULL())!=NullSupportHelper.NULL();
}
public DumpData toDumpData(PageContext pageContext, int maxlevel, DumpProperties dp) {
return ScopeSupport.toDumpData(pageContext, maxlevel, dp, this, getTypeAsString());
}
}