package railo.runtime.type.scope;
import java.util.Iterator;
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.op.Duplicator;
import railo.runtime.type.Collection;
import railo.runtime.type.dt.DateTime;
import railo.runtime.type.util.CollectionUtil;
import railo.runtime.type.util.KeyConstants;
import railo.runtime.type.util.StructSupport;
/**
* caller scope
*/
public final class CallerImpl extends StructSupport implements Caller {
private static final long serialVersionUID = -6228400815042475435L;
private PageContext pc;
private Variables variablesScope;
private Local localScope;
private Argument argumentsScope;
private boolean checkArgs;
@Override
public Object get(Collection.Key key) throws PageException {
char c=key.lowerCharAt(0);
if('a'==c) {
if(KeyConstants._application.equalsIgnoreCase(key)) return pc.applicationScope();
else if(checkArgs && KeyConstants._arguments.equalsIgnoreCase(key)) return argumentsScope;//pc.argumentsScope();
}
else if('c'==c) {
if(KeyConstants._cgi.equalsIgnoreCase(key)) return pc.cgiScope();
if(KeyConstants._cookie.equalsIgnoreCase(key)) return pc.cookieScope();
if(KeyConstants._client.equalsIgnoreCase(key)) return pc.clientScope();
if(KeyConstants._cluster.equalsIgnoreCase(key)) return pc.clusterScope();
}
else if('f'==c) {
if(KeyConstants._form.equalsIgnoreCase(key)) return pc.formScope();
}
else if('r'==c) {
if(KeyConstants._request.equalsIgnoreCase(key)) return pc.requestScope();
}
else if('l'==c) {
if(KeyConstants._local.equalsIgnoreCase(key) && checkArgs) return localScope;//pc.localScope();
}
else if('s'==c) {
if(KeyConstants._session.equalsIgnoreCase(key)) return pc.sessionScope();
if(KeyConstants._server.equalsIgnoreCase(key)) return pc.serverScope();
}
else if('u'==c) {
if(KeyConstants._url.equalsIgnoreCase(key)) return pc.urlScope();
}
else if('v'==c) {
if(KeyConstants._variables.equalsIgnoreCase(key)) return variablesScope;
}
// upper variable scope
Object o;
if(checkArgs) {
o=localScope.get(key,NullSupportHelper.NULL());
if(o!=NullSupportHelper.NULL()) return o;
o=argumentsScope.get(key,NullSupportHelper.NULL());
if(o!=NullSupportHelper.NULL()) return o;
}
o=variablesScope.get(key,NullSupportHelper.NULL());
if(o!=NullSupportHelper.NULL()) return o;
// get from cascaded scopes
o=((UndefinedImpl)pc.undefinedScope()).getCascading(key,NullSupportHelper.NULL());
if(o!=NullSupportHelper.NULL()) return o;
/*
// get scopes
if(key.equalsIgnoreCase(VARIABLES)) {
return variablesScope;//new StructImpl(getMap());
}
scope=VariableInterpreter.scopeKey2Int(key);
if(scope!=Scope.SCOPE_UNDEFINED)
return pc.scope(scope);
*/
throw new ExpressionException("["+key.getString() +"] not found in caller scope");
}
@Override
public Object get(Collection.Key key, Object defaultValue) {
char c=key.lowerCharAt(0);
if('a'==c) {
if(KeyConstants._application.equalsIgnoreCase(key)){
try {
return pc.applicationScope();
}
catch (PageException e) {}
}
else if(checkArgs && KeyConstants._arguments.equalsIgnoreCase(key)) return argumentsScope;//pc.argumentsScope();
}
else if('c'==c) {
if(KeyConstants._cgi.equalsIgnoreCase(key)) return pc.cgiScope();
if(KeyConstants._cookie.equalsIgnoreCase(key)) return pc.cookieScope();
if(KeyConstants._client.equalsIgnoreCase(key)){
try {
return pc.clientScope();
}
catch (PageException e) {}
}
if(KeyConstants._cluster.equalsIgnoreCase(key)){
try {
return pc.clusterScope();
}
catch (PageException e) {}
}
}
else if('f'==c) {
if(KeyConstants._form.equalsIgnoreCase(key)) return pc.formScope();
}
else if('r'==c) {
if(KeyConstants._request.equalsIgnoreCase(key)) return pc.requestScope();
}
else if('l'==c) {
if(checkArgs && KeyConstants._local.equalsIgnoreCase(key)) return localScope;//pc.localScope();
}
else if('s'==c) {
if(KeyConstants._session.equalsIgnoreCase(key)){
try {
return pc.sessionScope();
}
catch (PageException e) {}
}
if(KeyConstants._server.equalsIgnoreCase(key)){
try {
return pc.serverScope();
}
catch (PageException e) {}
}
}
else if('u'==c) {
if(KeyConstants._url.equalsIgnoreCase(key)) return pc.urlScope();
}
else if('v'==c) {
if(KeyConstants._variables.equalsIgnoreCase(key)) return variablesScope;
}
Object o;
if(checkArgs) {
o=localScope.get(key,NullSupportHelper.NULL());
if(o!=NullSupportHelper.NULL()) return o;
o=argumentsScope.get(key,NullSupportHelper.NULL());
if(o!=NullSupportHelper.NULL()) return o;
}
o=variablesScope.get(key,NullSupportHelper.NULL());
if(o!=NullSupportHelper.NULL()) return o;
// get from cascaded scopes
o=((UndefinedImpl)pc.undefinedScope()).getCascading(key,NullSupportHelper.NULL());
if(o!=NullSupportHelper.NULL()) return o;
return defaultValue;
}
@Override
public void initialize(PageContext pc) {
this.pc=pc;
}
@Override
public void setScope(Variables variablesScope, Local localScope, Argument argumentsScope, boolean checkArgs) {
this.variablesScope = variablesScope;
this.localScope = localScope;
this.argumentsScope = argumentsScope;
this.checkArgs = checkArgs;
}
@Override
public boolean isInitalized() {
return pc!=null;
}
@Override
public void release() {
this.pc=null;
}
@Override
public void release(PageContext pc) {
this.pc=null;
}
@Override
public int size() {
return variablesScope.size();
}
@Override
public Collection.Key[] keys() {
return CollectionUtil.keys(this);
}
@Override
public Object remove(Collection.Key key) throws PageException {
if(checkArgs && localScope.containsKey(key))
return localScope.remove(key);
return variablesScope.remove(key);
}
@Override
public Object removeEL(Collection.Key key) {
if(checkArgs && localScope.containsKey(key))
return localScope.removeEL(key);
return variablesScope.removeEL(key);
}
@Override
public void clear() {
variablesScope.clear();
}
public Object set(Key key, Object value) throws PageException {
if(checkArgs) {
if(localScope.containsKey(key)) return localScope.set(key,value);
if(argumentsScope.containsKey(key)) return argumentsScope.set(key,value);
}
return variablesScope.set(key,value);
}
@Override
public Object setEL(Key key, Object value) {
if(checkArgs) {
if(localScope.containsKey(key)) return localScope.setEL(key,value);
if(argumentsScope.containsKey(key)) return argumentsScope.setEL(key,value);
}
return variablesScope.setEL(key,value);
}
@Override
public Iterator<Collection.Key> keyIterator() {
return variablesScope.keyIterator();
}
@Override
public Iterator<String> keysAsStringIterator() {
return variablesScope.keysAsStringIterator();
}
@Override
public Iterator<Entry<Key, Object>> entryIterator() {
return variablesScope.entryIterator();
}
@Override
public Iterator<Object> valueIterator() {
return variablesScope.valueIterator();
}
@Override
public Collection duplicate(boolean deepCopy) {
return (Collection) Duplicator.duplicate(variablesScope,deepCopy);
}
@Override
public boolean containsKey(Collection.Key key) {
return get(key,null)!=null;
}
@Override
public DumpData toDumpData(PageContext pageContext, int maxlevel, DumpProperties dp) {
return variablesScope.toDumpData(pageContext, --maxlevel,dp);
}
@Override
public String castToString() throws PageException {
return variablesScope.castToString();
}
@Override
public String castToString(String defaultValue) {
return variablesScope.castToString(defaultValue);
}
@Override
public boolean castToBooleanValue() throws PageException {
return variablesScope.castToBooleanValue();
}
@Override
public Boolean castToBoolean(Boolean defaultValue) {
return variablesScope.castToBoolean(defaultValue);
}
@Override
public double castToDoubleValue() throws PageException {
return variablesScope.castToDoubleValue();
}
@Override
public double castToDoubleValue(double defaultValue) {
return variablesScope.castToDoubleValue(defaultValue);
}
@Override
public DateTime castToDateTime() throws PageException {
return variablesScope.castToDateTime();
}
@Override
public DateTime castToDateTime(DateTime defaultValue) {
return variablesScope.castToDateTime(defaultValue);
}
@Override
public int compareTo(boolean b) throws PageException {
return variablesScope.compareTo(b);
}
@Override
public int compareTo(DateTime dt) throws PageException {
return variablesScope.compareTo(dt);
}
@Override
public int compareTo(double d) throws PageException {
return variablesScope.compareTo(d);
}
@Override
public int compareTo(String str) throws PageException {
return variablesScope.compareTo(str);
}
@Override
public int getType() {
return SCOPE_CALLER;
}
@Override
public String getTypeAsString() {
return "caller";
}
@Override
public boolean containsValue(Object value) {
return variablesScope.containsValue(value);
}
@Override
public java.util.Collection values() {
return variablesScope.values();
}
@Override
public Variables getVariablesScope() {
return variablesScope;
}
@Override
public Local getLocalScope() {
return localScope;
}
@Override
public Argument getArgumentsScope() {
return argumentsScope;
}
}