/**
* Copyright 2010 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.drools.ide.common.assistant.refactor.drl;
import org.drools.ide.common.assistant.info.drl.RuleBasicContentInfo;
public class VariableBinding extends VariableOption {
private static final String DEFAULT_VARIABLE_NAME = "$default";
public static String execute(RuleBasicContentInfo contentInfo, int offset) {
detectCurrentVariables(contentInfo);
return execute(contentInfo.getContent(), offset);
}
public static String execute(String line, int offset) {
if (offset > line.length())
return line;
int position;
for (position = offset-1; position >= 0; position--) {
if (line.charAt(position)==' ' || line.charAt(position)=='(' || line.charAt(position)=='\t' || line.charAt(position)==',') {
String left = line.substring(0, position+1);
String right = line.substring(position+1, line.length());
if (!VariableBinding.isVariableOrParameter(right, left) && !VariableBinding.hasVariableAssigned(left)) {
return left + getVariableName(right) + right;
}
return line;
}
}
// search to the right the first : before ( and ,
for (position = 0; position < line.length(); position++) {
if (line.charAt(position)==':') {
return line;
}
if (line.charAt(position)=='(' || line.charAt(position)==',') {
return getVariableName(line) + line;
}
}
return line;
}
// detect if already has an assigned variable or is the right side of the comparator parameter
private static boolean isVariableOrParameter(String right, String left) {
int position;
for (position = 0; position <= right.length()-1; position++) {
if (right.charAt(position)==',' || right.charAt(position)=='(') {
break;
}
if (right.charAt(position)==':') {
return true;
}
}
for (position = left.length()-1; position >=0; position--) {
if (left.charAt(position)=='>' || left.charAt(position)=='<' || left.charAt(position)=='=') {
return true;
}
if (left.charAt(position)==',') {
return false;
}
}
return false;
}
private static String getVariableName(String right) {
for (int position = 0; position < right.length(); position++) {
if (right.charAt(position)=='(' || right.charAt(position)==')' || right.charAt(position)==',' ||
right.charAt(position)=='<' || right.charAt(position)=='>' || right.charAt(position)=='=') {
String varname = "$" + right.substring(0, position).toLowerCase().trim();
return generateVariableName(varname);
}
}
return DEFAULT_VARIABLE_NAME;
}
private static boolean hasVariableAssigned(String line) {
for (int position = line.length()-1; position >=0; position--) {
if (line.charAt(position)==':') {
return true;
}
if (line.charAt(position)==',' || line.charAt(position)=='(') {
return false;
}
}
return false;
}
private static String generateVariableName(String varname) {
if (!existsVariableWithSameName(varname)) {
return varname + " : ";
}
// generate a pseudo-random variable name
for (int count=1; count <= 100; count++) {
if (!existsVariableWithSameName(varname+count)) {
return varname+count + " : ";
}
}
return varname;
}
}