/*
This file belongs to the Servoy development and deployment environment, Copyright (C) 1997-2010 Servoy BV
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU Affero General Public License as published by the Free
Software Foundation; either version 3 of the License, or (at your option) any
later version.
This program 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License along
with this program; if not, see http://www.gnu.org/licenses or write to the Free
Software Foundation,Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
*/
package com.servoy.j2db.dataprocessing;
import org.mozilla.javascript.Scriptable;
import com.servoy.j2db.scripting.GlobalScope;
import com.servoy.j2db.scripting.ScopesScope;
import com.servoy.j2db.scripting.ScriptVariableScope;
import com.servoy.j2db.util.Pair;
import com.servoy.j2db.util.ScopesUtils;
/**
* Helper class to handle dataprovider with the "scopes." prefix
*
* @author rgansevles
*/
class ScopesScopeProvider implements IGlobalValueEntry
{
private final ScopesScope scopesScope;
public ScopesScopeProvider(ScopesScope scopesScope)
{
this.scopesScope = scopesScope;
}
public boolean containsDataProvider(String dataProviderID)
{
Pair<String, String> scope = ScopesUtils.getVariableScope(dataProviderID);
if (scope.getLeft() != null)
{
GlobalScope globalScope = scopesScope.getGlobalScope(scope.getLeft());
if (globalScope != null)
{
return globalScope.has(scope.getRight(), scopesScope);
}
}
return false;
}
public Object getDataProviderValue(String dataProviderID)
{
Pair<String, String> scope = ScopesUtils.getVariableScope(dataProviderID);
if (scope.getLeft() != null)
{
GlobalScope globalScope = scopesScope.getGlobalScope(scope.getLeft());
if (globalScope != null)
{
Scriptable scriptable = globalScope;
Object value = null;
String[] datapath = scope.getRight().split("\\."); //$NON-NLS-1$
for (String provider : datapath)
{
value = scriptable.get(provider, scriptable);
if (value instanceof Scriptable)
{
scriptable = (Scriptable)value;
}
else break;
}
// have to unwrap because out of scriptables we could get native stuff (like NativeDate)
value = ScriptVariableScope.unwrap(value);
return value;
}
}
return null;
}
public Object setDataProviderValue(String dataProviderID, Object value)
{
Pair<String, String> scope = ScopesUtils.getVariableScope(dataProviderID);
if (scope.getLeft() != null)
{
GlobalScope globalScope = scopesScope.getGlobalScope(scope.getLeft());
if (globalScope != null)
{
return globalScope.put(scope.getRight(), value);
}
}
return null;
}
}