/*******************************************************************************
* Copyright © 2012, 2013 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*
*******************************************************************************/
package org.eclipse.edt.mof.eglx.persistence.sql.ext;
import org.eclipse.edt.compiler.ASTValidator;
import org.eclipse.edt.compiler.BaseCompilerExtension;
import org.eclipse.edt.compiler.SystemLibraryUtil;
import org.eclipse.edt.compiler.core.ast.AbstractASTVisitor;
import org.eclipse.edt.compiler.core.ast.AddStatement;
import org.eclipse.edt.compiler.core.ast.CloseStatement;
import org.eclipse.edt.compiler.core.ast.DeleteStatement;
import org.eclipse.edt.compiler.core.ast.ExecuteStatement;
import org.eclipse.edt.compiler.core.ast.Expression;
import org.eclipse.edt.compiler.core.ast.ForEachStatement;
import org.eclipse.edt.compiler.core.ast.GetByKeyStatement;
import org.eclipse.edt.compiler.core.ast.GetByPositionStatement;
import org.eclipse.edt.compiler.core.ast.Node;
import org.eclipse.edt.compiler.core.ast.OpenStatement;
import org.eclipse.edt.compiler.core.ast.PrepareStatement;
import org.eclipse.edt.compiler.core.ast.ReplaceStatement;
import org.eclipse.edt.compiler.internal.egl2mof.ElementGenerator;
import org.eclipse.edt.mof.egl.Type;
import org.eclipse.edt.mof.eglx.persistence.sql.SqlActionStatement;
import org.eclipse.edt.mof.eglx.persistence.sql.validation.SQLActionStatementValidator;
public class SQLExtension extends BaseCompilerExtension {
@Override
public String[] getSystemEnvironmentPaths() {
return new String[]{SystemLibraryUtil.getSystemLibraryPath(SqlActionStatement.class, "egllib")};
}
@Override
public Class[] getExtendedTypes() {
return new Class[]{AddStatement.class, CloseStatement.class, DeleteStatement.class, ExecuteStatement.class, ForEachStatement.class,
GetByKeyStatement.class, GetByPositionStatement.class, OpenStatement.class, PrepareStatement.class, ReplaceStatement.class};
}
@Override
public ElementGenerator getElementGeneratorFor(Node node) {
if (shouldExtend(node)) {
return new SQLActionStatementGenerator();
}
return null;
}
@Override
public ASTValidator getValidatorFor(Node node) {
if (shouldExtend(node)) {
return new SQLActionStatementValidator();
}
return null;
}
private boolean shouldExtend(Node node) {
// The types of various nodes dictate whether this is an SQL statement. Most common is the FromOrToExpressionClause.
final boolean[] result = new boolean[1];
node.accept(new AbstractASTVisitor() {
@Override
public boolean visit(org.eclipse.edt.compiler.core.ast.FromOrToExpressionClause clause) {
if (!result[0]) {
result[0] = Utils.isSQLDataSource(exprToType(clause.getExpression())) || Utils.isSQLResultSet(exprToType(clause.getExpression()));
}
return false;
};
@Override
public boolean visit(org.eclipse.edt.compiler.core.ast.WithExpressionClause clause) {
if (!result[0]) {
result[0] = Utils.isSQLStatement(exprToType(clause.getExpression()));
}
return false;
};
@Override
public boolean visit(CloseStatement stmt) {
if (!result[0]) {
result[0] = Utils.isSQLDataSource(exprToType(stmt.getExpr())) || Utils.isSQLResultSet(exprToType(stmt.getExpr()));
}
return false;
};
@Override
public void endVisit(OpenStatement stmt) {
if (!result[0]) {
result[0] = Utils.isSQLResultSet(exprToType(stmt.getResultSet()));
}
};
});
return result[0];
}
private Type exprToType(Expression expr) {
if (expr != null) {
return expr.resolveType();
}
return null;
}
}