/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
*
* 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.jkiss.dbeaver.ui.editors.sql.templates;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.templates.*;
import org.jkiss.dbeaver.model.DBPContextProvider;
import org.jkiss.dbeaver.model.exec.DBCExecutionContext;
import org.jkiss.dbeaver.ui.editors.sql.SQLEditorBase;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
/**
* SQL context
*/
public class SQLContext extends DocumentTemplateContext implements DBPContextProvider {
private SQLEditorBase editor;
private Map<String, SQLVariable> variables = new HashMap<>();
public SQLContext(TemplateContextType type, IDocument document, Position position, SQLEditorBase editor)
{
super(type, document, position);
this.editor = editor;
}
public SQLEditorBase getEditor()
{
return editor;
}
@Override
public DBCExecutionContext getExecutionContext()
{
return editor.getExecutionContext();
}
@Override
public TemplateBuffer evaluate(Template template) throws BadLocationException, TemplateException
{
if (!canEvaluate(template))
return null;
TemplateTranslator translator = new TemplateTranslator() {
@Override
protected TemplateVariable createVariable(TemplateVariableType type, String name, int[] offsets)
{
SQLVariable variable = new SQLVariable(SQLContext.this, type, name, offsets);
variables.put(name, variable);
return variable;
}
};
TemplateBuffer buffer = translator.translate(template);
formatTemplate(buffer);
/*
// Reorder variables
TemplateVariable[] bufferVariables = buffer.getVariables();
Arrays.sort(bufferVariables, new Comparator<TemplateVariable>() {
@Override
public int compare(TemplateVariable o1, TemplateVariable o2)
{
return variableOrder(o1.getName()) - variableOrder(o2.getName());
}
});
buffer = new TemplateBuffer(buffer.getString(), bufferVariables);
*/
getContextType().resolve(buffer, this);
return buffer;
}
private void formatTemplate(TemplateBuffer buffer) {
TemplateVariable[] variables= buffer.getVariables();
final String indentation = getIndentation();
String content = buffer.getString();
if (!indentation.isEmpty() && content.indexOf('\n') != -1) {
StringBuilder result = new StringBuilder();
for (int i = 0; i < content.length(); i++) {
char c = content.charAt(i);
result.append(c);
if (c == '\n') result.append(indentation);
}
buffer.setContent(result.toString(), variables);
}
}
/*
private static final String[] VAR_ORDER = {
"table",
"column",
"value"
};
private static int variableOrder(String name)
{
for (int i = 0; i < VAR_ORDER.length; i++) {
if (name.equals(VAR_ORDER[i])) {
return i;
}
}
return VAR_ORDER.length + 1;
}
*/
SQLVariable getTemplateVariable(String name)
{
SQLVariable variable = variables.get(name);
if (variable != null && !variable.isResolved())
getContextType().resolve(variable, this);
return variable;
}
Collection<SQLVariable> getVariables()
{
return variables.values();
}
private String getIndentation() {
int start = this.getStart();
IDocument document = this.getDocument();
try {
IRegion region = document.getLineInformationOfOffset(start);
int lineIndent = start - region.getOffset();
if (lineIndent <= 0) {
return "";
}
char[] buf = new char[lineIndent];
for (int i = 0; i < lineIndent; i++) {
buf[i] = ' ';
}
return String.valueOf(buf);
} catch (Exception var6) {
return "";
}
}
}