blob: a1e0bf3e671cb0f6f61a4e915cac71c141f71563 [file] [log] [blame]
/*
* generated by Xtext
*/
package org.eclipse.vorto.fbeditor.validation
import org.eclipse.vorto.fbeditor.internal.validation.validator.PropertyConstraintMappingValidation
import org.eclipse.vorto.functionblock.Entity
import org.eclipse.vorto.functionblock.Enum
import org.eclipse.vorto.functionblock.FBFeature
import org.eclipse.vorto.functionblock.FunctionBlock
import org.eclipse.vorto.functionblock.FunctionblockModel
import org.eclipse.vorto.functionblock.FunctionblockPackage
import org.eclipse.vorto.functionblock.Operation
import org.eclipse.vorto.functionblock.PrimitiveProperty
import org.eclipse.vorto.functionblock.Property
import java.util.HashSet
import java.util.LinkedList
import org.eclipse.xtext.validation.Check
import org.eclipse.vorto.fbeditor.internal.validation.SystemMessage
import org.eclipse.vorto.fbeditor.internal.validation.ConstraintValidatorFactory
/**
* Custom validation rules.
*
* see http://www.eclipse.org/Xtext/documentation.html#validation
*/
class FunctionblockValidator extends AbstractFunctionblockValidator {
public val propertyValidator = new PropertyConstraintMappingValidation
@Check
def checkConstraint(PrimitiveProperty prop) {
var list = prop.constraints
if(list.length == 0) return;
var primi = prop.type
for (i : list.size >.. 0) {
var constraint = list.get(i)
if (!propertyValidator.checkPropertyConstraints(primi, constraint)) {
error(propertyValidator.errorMessage, constraint, FunctionblockPackage.Literals.CONSTRAINT__TYPE)
}else{
var validator = ConstraintValidatorFactory.getValueValidator(constraint.type)
if (!validator.evaluateValueType(primi, constraint)) {
error(validator.errorMessage, constraint, FunctionblockPackage.Literals.CONSTRAINT__CONSTRAINT_VALUES)
}
}
}
}
@Check
def checkDuplicatedConstraint(PrimitiveProperty feature) {
var set = new HashSet<String>();
var list = feature.constraints;
for (var i = 0; i < list.length; i ++) {
var con = list.get(i);
if (!set.add(con.type.literal)) {
error(SystemMessage.ERROR_DUPLICATED_CONSTRAINT, con, FunctionblockPackage.Literals.CONSTRAINT__TYPE)
}
}
}
@Check
def checkDuplicateEntityName(Entity ent) {
var superEntity = ent.eContainer() as FunctionblockModel;
var set = new HashSet<String>();
var elems = superEntity.elements
for (var i = 0; i < elems.length; i ++) {
var elem = elems.get(i);
if (!set.add(elem.name)) {
error(SystemMessage.ERROR_DUPLICATED_ENTITY_NAME, elem, FunctionblockPackage.Literals.OBJECT_TYPE__NAME)
}
}
}
@Check
def checkFunctionBlockName(FunctionblockModel model) {
val name = model.name
if (isCamelCasedName(name)) {
error(SystemMessage.ERROR_FBNAME_INVALID, model, FunctionblockPackage.Literals.FUNCTIONBLOCK_MODEL__NAME)
}
}
@Check
def checkEntityName(Entity entity) {
val name = entity.name
if (isCamelCasedName(name)) {
error(SystemMessage.ERROR_ENTITYNAME_INVALID_CAMELCASE, entity, FunctionblockPackage.Literals.OBJECT_TYPE__NAME)
}
if (name.toLowerCase.endsWith('reply')) {
error(SystemMessage.ERROR_ENTITYNAME_SUFFIX_REPLY, entity, FunctionblockPackage.Literals.OBJECT_TYPE__NAME)
}
}
def boolean isCamelCasedName(String name) {
!Character.isUpperCase((name).charAt(0))
}
@Check
def checkProperty(Property feature) {
var set = new HashSet<String>();
var features = feature.eContainer() as FBFeature;
var props = features.properties
for (var i = 0; i < props.length; i++) {
var feat = props.get(i)
if (!set.add(feat.propName)) {
error(SystemMessage.ERROR_DUPLICATED_PROPERTY_NAME, feat, FunctionblockPackage.Literals.PROPERTY__PROP_NAME)
}
}
}
@Check
def checkDuplicateParameter(Operation operation) {
var set = new HashSet<String>();
for (var i = 0; i < operation.params.length; i++) {
var param = operation.params.get(i)
if (!set.add(param.paramName)) {
error(SystemMessage.ERROR_DUPLICATED_PARAMETER_NAME, param, FunctionblockPackage.Literals.PARAMETER__PARAM_NAME)
}
}
}
@Check
def checkDuplicateOperation(Operation op) {
var set = new HashSet<String>();
var fb = op.eContainer() as FunctionBlock;
var ops = fb.features
for (var i = 0; i < ops.length; i++) {
var method = ops.get(i)
if (!set.add(method.methodName)) {
error(SystemMessage.ERROR_DUPLICATED_METHOD_NAME, method, FunctionblockPackage.Literals.OPERATION__METHOD_NAME)
}
}
}
@Check
def checkPropertyName(Property feature) {
var name = feature.propName
if (name.endsWith('TS')) {
error(SystemMessage.ERROR_PROPNAME_SUFFIX_TS, feature, FunctionblockPackage.Literals.PROPERTY__PROP_NAME)
}
}
@Check
def checkOpNameAgainstEntityName(Operation op) {
var fb = op.eContainer() as FunctionBlock
var fbm = fb.eContainer() as FunctionblockModel
var elems = fbm.elements
var enums = fbm.enums
var entLs = new LinkedList<String>;
for (i : elems.size >.. 0) {
entLs.add(elems.get(i).name.toLowerCase)
}
var enmLs = new LinkedList<String>;
for (i : enums.size >.. 0) {
enmLs.add(enums.get(i).name.toLowerCase)
}
var arr = entLs.toArray
var arr2 = enmLs.toArray
var ops = fb.features
for (i : ops.size >.. 0) {
if (arr.contains(ops.get(i).methodName.toLowerCase)) {
error(SystemMessage.ERROR_OPERATION_SAME_ENTITYNAME, ops.get(i),
FunctionblockPackage.Literals.OPERATION__METHOD_NAME)
}
if (arr2.contains(ops.get(i).methodName.toLowerCase)) {
error(SystemMessage.ERROR_OPERATION_SAME_ENUMNAME, ops.get(i),
FunctionblockPackage.Literals.OPERATION__METHOD_NAME)
}
}
}
@Check
def checkEnumNameAgainstEntityName(Enum enm) {
var fbm = enm.eContainer() as FunctionblockModel
var elems = fbm.elements
var entLs = new LinkedList<String>;
for (i : elems.size >.. 0) {
entLs.add(elems.get(i).name.toLowerCase)
}
var arr = entLs.toArray
if(arr.contains(enm.name.toLowerCase)){
error(SystemMessage.ERROR_ENTITY_SAME_ENUMNAME, enm,
FunctionblockPackage.Literals.OBJECT_TYPE__NAME)
}
}
@Check
def checkVersionPattern(FunctionBlock functionblock){
if(!functionblock.version.matches("\\d+\\.\\d+\\.\\d+(\\-.+)?")){
error(SystemMessage.ERROR_VERSION_PATTERN, functionblock, FunctionblockPackage.Literals.FUNCTION_BLOCK__VERSION)
}
}
@Check
def checkDuplicatedLiteral(Enum enu){
var list = enu.enums
var set = new HashSet<String>();
for (var i = 0; i < list.length; i++) {
if(!set.add(list.get(i).literal)){
error(SystemMessage.ERROR_DUPLICATED_ENUM_LITERAL, list.get(i), FunctionblockPackage.Literals.ENUM_LITERAL__LITERAL)
}
}
}
@Check
def checkDuplicateEnumName(Enum ent) {
var superEntity = ent.eContainer() as FunctionblockModel;
var set = new HashSet<String>();
var enums = superEntity.enums
for (var i = 0; i < enums.length; i ++) {
var elem = enums.get(i);
if (!set.add(elem.name)) {
error(SystemMessage.ERROR_DUPLICATED_ENUM_NAME, elem, FunctionblockPackage.Literals.OBJECT_TYPE__NAME)
}
}
}
@Check
def checkEnumName(Enum ent) {
val name = ent.name
if (isCamelCasedName(name)) {
error(SystemMessage.ERROR_ENUMNAME_INVALID_CAMELCASE, ent, FunctionblockPackage.Literals.OBJECT_TYPE__NAME)
}
}
@Check
def checkEnum(Enum ent) {
if(ent.getEnums().empty){
error(SystemMessage.ERROR_ENUM_CANNOT_BE_EMPTY, ent, FunctionblockPackage.Literals.ENUM__ENUMS)
}
}
}