/**
* Copyright 2004-2016 Riccardo Solmi. All rights reserved.
* This file is part of the Whole Platform.
*
* The Whole Platform 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 3 of the License, or
* (at your option) any later version.
*
* The Whole Platform 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 the Whole Platform. If not, see <http://www.gnu.org/licenses/>.
*/
package org.whole.lang.util;
import org.whole.lang.bindings.IBindingManager;
import org.whole.lang.bindings.IBindingScope;
import org.whole.lang.bindings.NullScope;
import org.whole.lang.model.IEntity;
/**
* @author Riccardo Solmi
*/
public class BindingUtils {
public static final String ENVIRONMENT_URI_PREFIX = "whole:environment:";
public static final String createQualifiedVariable(String envName, String varName) {
return ENVIRONMENT_URI_PREFIX+envName+"#"+varName;
}
public static final boolean hasEnvironmentPart(String variable) {
return variable.startsWith(ENVIRONMENT_URI_PREFIX);
}
public static final String getEnvironmentPart(String variable) {
int index = variable.indexOf('#');
return index > 0 ? variable.substring(
hasEnvironmentPart(variable) ? ENVIRONMENT_URI_PREFIX.length() : 0, index) : null;
}
public static final String getEnvironmentName(String variable) {
if (hasEnvironmentPart(variable)) {
int index = variable.indexOf('#');
if (index > 0)
return variable.substring(ENVIRONMENT_URI_PREFIX.length(), index);
}
return null;
}
public static final String getVariableName(String variable) {
int index = variable.indexOf('#');
return index > 0 ? variable.substring(index+1) : variable;
}
public static IBindingManager getEnvironment(IBindingManager bm, String variable) {
if (hasEnvironmentPart(variable)) {
int index = variable.indexOf('#');
bm = bm.wGetEnvironmentManager().getEnvironment(
variable.substring(ENVIRONMENT_URI_PREFIX.length(), index));
}
return bm;
}
public static boolean wIsSet(IBindingManager bm, String variable) {
if (hasEnvironmentPart(variable)) {
int index = variable.indexOf('#');
bm = bm.wGetEnvironmentManager().getEnvironment(
variable.substring(ENVIRONMENT_URI_PREFIX.length(), index));
variable = variable.substring(index+1);
}
return bm.wIsSet(variable);
}
public static IEntity wGet(IBindingManager bm, String variable) {
if (hasEnvironmentPart(variable)) {
int index = variable.indexOf('#');
bm = bm.wGetEnvironmentManager().getEnvironment(
variable.substring(ENVIRONMENT_URI_PREFIX.length(), index));
variable = variable.substring(index+1);
}
return bm.wGet(variable);
}
public static void wSet(IBindingManager bm, String variable, IEntity value) {
if (hasEnvironmentPart(variable)) {
int index = variable.indexOf('#');
bm = bm.wGetEnvironmentManager().getEnvironment(
variable.substring(ENVIRONMENT_URI_PREFIX.length(), index));
variable = variable.substring(index+1);
}
bm.wSet(variable, value);
}
public static void wDef(IBindingManager bm, String variable, IEntity value) {
if (hasEnvironmentPart(variable)) {
int index = variable.indexOf('#');
bm = bm.wGetEnvironmentManager().getEnvironment(
variable.substring(ENVIRONMENT_URI_PREFIX.length(), index));
variable = variable.substring(index+1);
}
bm.wDef(variable, value);
}
// public static IBindingManager getEnvironment(IBindingManager bm, String variable) {
// String environmentName = getEnvironmentName(variable);
// if (environmentName != null) {
// if (!bm.wIsSet(environmentName)) {
// IBindingManager environment = bm.wGetEnvironmentManager().getEnvironment(environmentName);
// bm.wDefValue(environmentName, environment);
// }
// bm = (IBindingManager) bm.wGetValue(environmentName);
// }
// return bm;
// }
//
// public static boolean wIsSet(IBindingManager bm, String variable) {
// return getEnvironment(bm, variable).wIsSet(getVariableName(variable));
// }
// public static IEntity wGet(IBindingManager bm, String variable) {
// return getEnvironment(bm, variable).wGet(getVariableName(variable));
// }
// public static void wSet(IBindingManager bm, String variable, IEntity value) {
// getEnvironment(bm, variable).wSet(getVariableName(variable), value);
// }
// public static void wDef(IBindingManager bm, String variable, IEntity value) {
// getEnvironment(bm, variable).wDef(getVariableName(variable), value);
// }
public static IBindingScope wOuterScope(IBindingScope scope, boolean preceding) {
IBindingScope precedingScope = scope;
switch (scope.getKind()) {
case OUTER_GROUP_ADAPTER:
return wOuterScope(scope.wTargetScope(), preceding);
case OUTER_SCOPE_ADAPTER:
do {
precedingScope = scope;
scope = scope.wEnclosingScope();
} while (scope.getKind().equals(IBindingScope.Kind.OUTER_SCOPE_ADAPTER));
if (scope == NullScope.instance)
break;
case SCOPE:
case INNER_SCOPE_ADAPTER:
do {
precedingScope = scope;
scope = scope.wEnclosingScope();
} while (scope.getKind().equals(IBindingScope.Kind.INNER_SCOPE_ADAPTER));
break;
}
return preceding ? precedingScope : scope;
}
}