package com.robotoworks.mechanoid.db.validation;
import org.eclipse.emf.common.util.EList;
import org.eclipse.xtext.common.types.JvmType;
import org.eclipse.xtext.common.types.util.TypeReferences;
import org.eclipse.xtext.validation.Check;
import com.google.inject.Inject;
import com.robotoworks.mechanoid.MechanoidPlugin;
import com.robotoworks.mechanoid.db.sqliteModel.ColumnSource;
import com.robotoworks.mechanoid.db.sqliteModel.ColumnSourceRef;
import com.robotoworks.mechanoid.db.sqliteModel.CreateTableStatement;
import com.robotoworks.mechanoid.db.sqliteModel.CreateViewStatement;
import com.robotoworks.mechanoid.db.sqliteModel.DDLStatement;
import com.robotoworks.mechanoid.db.sqliteModel.DatabaseBlock;
import com.robotoworks.mechanoid.db.sqliteModel.InitBlock;
import com.robotoworks.mechanoid.db.sqliteModel.Model;
import com.robotoworks.mechanoid.db.sqliteModel.SelectList;
import com.robotoworks.mechanoid.db.sqliteModel.SqliteModelPackage;
import com.robotoworks.mechanoid.validation.MechanoidIssueCodes;
import com.robotoworks.mechanoid.validation.MechanoidLibClasspathValidationHelper;
public class SqliteModelJavaValidator extends AbstractSqliteModelJavaValidator {
@Inject TypeReferences typeReferences;
@Inject MechanoidLibClasspathValidationHelper libValidationHelper;
@Inject StatementSequenceValidator statementSequenceValidator;
@Check
public void checkMechanoidLibOnClasspath(Model m) {
if(libValidationHelper.shouldValidateMechanoidLibOnClassPath(m)) {
JvmType type = typeReferences.findDeclaredType(MechanoidPlugin.MECHANOID_LIB_CLASS, m);
if(type == null) {
error("mechanoid.jar is required in your /libs folder or on the classpath", SqliteModelPackage.Literals.MODEL__PACKAGE_NAME, MechanoidIssueCodes.MISSING_MECHANOID_LIBS);
}
}
}
@Check
public void checkStatementSequence(DatabaseBlock db) {
StatementSequenceValidatorResult result = statementSequenceValidator.validate(db);
if(!result.valid) {
error(result.message, result.source, result.feature, -1);
}
}
@Check
public void checkInitBlockStatementTypes(InitBlock initBlock) {
for(DDLStatement stmt : initBlock.getStatements()) {
if(!((stmt instanceof CreateViewStatement) ||
(stmt instanceof CreateTableStatement))) {
error("Only tables and view statements allowed in the init block",
stmt, SqliteModelPackage.Literals.DDL_STATEMENT.getEStructuralFeature(SqliteModelPackage.DDL_STATEMENT), -1);
}
if(stmt instanceof CreateViewStatement) {
CreateViewStatement v = (CreateViewStatement) stmt;
if(!v.isTemporary()) {
error("Only temporary views allowed in the init block", stmt, SqliteModelPackage.Literals.TABLE_DEFINITION__NAME);
}
}
if(stmt instanceof CreateTableStatement) {
CreateTableStatement t = (CreateTableStatement) stmt;
if(!t.isTemporary()) {
error("Only temporary tables allowed in the init block", stmt, SqliteModelPackage.Literals.TABLE_DEFINITION__NAME);
}
}
}
}
@Check
public void checkColumnSourceRefComplete(ColumnSourceRef ref) {
if(ref.isAll()) {
return;
}
if(ref.getSource() != null && ref.getColumn() == null) {
error("Incomplete reference", SqliteModelPackage.Literals.COLUMN_SOURCE_REF__COLUMN);
}
}
@Check
public void checkUniqueResultColumnAliases(SelectList list) {
EList<ColumnSource> cols = list.getResultColumns();
for(int i=0; i < cols.size(); i++) {
ColumnSource subject = cols.get(i);
int matches = 0;
for(int j=0; j < cols.size(); j++) {
ColumnSource target = cols.get(j);
if(subject.getName() != null &&
target.getName() != null &&
subject.getName().equalsIgnoreCase(target.getName())) {
matches++;
}
if(matches > 1) {
error("Duplicate alias not allowed", target, SqliteModelPackage.Literals.COLUMN_SOURCE__NAME, -1);
return;
}
}
}
}
}