| /* |
| * 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) |
| } |
| } |
| } |
| |