«IMPORT messageDsl» «EXTENSION ch::ethz::origo::aranea::validation::MessageDslExtensions» «REM»template of the record class«ENDREM» «DEFINE recordTemplate(Message message) FOR NestedRecordType-» «LET properties.restrictions AS restrictions-» «FILE (message.namespace().name).toLowerCase() + "/" + fullName(this, message).camelCaseToUnderscore().toLowerCase()+"_message.e"-» note description: "«name» record. GENERATED DO NOT MODIFY" author: "Origo Team " date: "$Date$" revision: "$Revision$" class «fullName(this, message).toUpperCase()»_MESSAGE inherit A_PARSABLE create make, make_from_tokenizer feature {NONE} -- Initialization «EXPAND make(restrictions) FOR this» feature -- Access «FOREACH properties AS property» «property.name.toLowerCase()»: «EXPAND eiffelType(message.namespace().name, message.project().prefix) FOR property.type» «IF property.description.length > 0 -» -- «property.description» «ENDIF-» «ENDFOREACH» feature {NONE} -- Implementation serialization_list: attached STRING -- Lists the fields to serialize, and under which name do create Result.make_empty «FOREACH properties AS property-» «IF property.canBeVoid()-» if («property.name.toLowerCase()» /= Void) then Result.append ("%"" + «property.name.toLowerCase() »_argument + "%":") Result.append («property.name.toLowerCase()».serialize) «IF property != properties.last() -» Result.append (",") «ENDIF-» end «ELSE-» Result.append ("%"" + «property.name.toLowerCase() »_argument + "%":") Result.append («property.name.toLowerCase()».serialize) «IF property != properties.last() -» Result.append (",") «ENDIF-» «ENDIF-» «ENDFOREACH-» end parse_tag (a_tag: STRING; a_tokenizer: A_JSON_TOKENIZER) do «IF properties.size > 0-» if a_tag.is_equal («properties.first().name.toLowerCase()»_argument) then create «properties.first().name.toLowerCase()».make_from_tokenizer (a_tokenizer) «IF properties.size > 1-» «FOREACH properties.withoutFirst() AS property -» elseif a_tag.is_equal («property.name.toLowerCase()»_argument) then create «property.name.toLowerCase()».make_from_tokenizer (a_tokenizer) «ENDFOREACH -» «ENDIF-» end «ENDIF-» end «FOREACH properties AS property-» «property.name.toLowerCase()»_argument: STRING = "«property.name»" «ENDFOREACH-» «IF !restrictions.isEmpty-» invariant «FOREACH restrictions AS restriction-» «EXPAND messageInvariant FOR restriction» «ENDFOREACH-» «ENDIF-» end «ENDFILE-» «ENDLET-» «ENDDEFINE» «REM»template for the make feature«ENDREM» «DEFINE make(List[Restriction] restrictions) FOR NestedRecordType -» make («FOREACH properties AS property SEPARATOR "; "»a_«property.name.toLowerCase()»: like «property.name.toLowerCase()»«ENDFOREACH») -- Create «IF !restrictions.isEmpty-» require «FOREACH restrictions AS restriction-» «EXPAND makePrecondition FOR restriction» «ENDFOREACH-» «ENDIF-» do «FOREACH properties AS property-» «property.name.toLowerCase()» := a_«property.name.toLowerCase()» «ENDFOREACH-» ensure «FOREACH properties AS property-» «property.name.toLowerCase()»_set: «property.name.toLowerCase()» = a_«property.name.toLowerCase()» «ENDFOREACH-» end «ENDDEFINE» «REM»Define precondition for make«ENDREM» «DEFINE makePrecondition FOR NotVoid»a_«property().name»_not_void: a_«property().name» /= Void«ENDDEFINE» «DEFINE makePrecondition FOR NotEmpty»a_«property().name»_not_empty: a_«property().name» /= Void and then not a_«property().name».is_empty«ENDDEFINE» «DEFINE makePrecondition FOR GreaterZero»a_«property().name»_valid: a_«property().name».value > 0«ENDDEFINE» «DEFINE makePrecondition FOR GreaterEqualZero»a_«property().name»_valid: a_«property().name».value >= 0«ENDDEFINE» «DEFINE makePrecondition FOR Restriction»«ERROR "Undefined Restriction " + name»«ENDDEFINE» «REM»Define message invariant«ENDREM» «DEFINE messageInvariant FOR NotVoid»«property().name»_not_void: «property().name» /= Void«ENDDEFINE» «DEFINE messageInvariant FOR NotEmpty»«property().name»_not_empty: «property().name» /= Void and then not «property().name».is_empty«ENDDEFINE» «DEFINE messageInvariant FOR GreaterZero»«property().name»_valid: «property().name».value > 0«ENDDEFINE» «DEFINE messageInvariant FOR GreaterEqualZero»«property().name»_valid: «property().name».value >= 0«ENDDEFINE» «DEFINE messageInvariant FOR Restriction»«ERROR "Undefined Restriction " + name»«ENDDEFINE» «REM»Define the mappings of the types to eiffel types«ENDREM» «DEFINE eiffelType(String ns, String prefix) FOR AnyType»A_ANY_VALUE«ENDDEFINE» «DEFINE eiffelType(String ns, String prefix) FOR StringType»A_STRING_VALUE«ENDDEFINE» «DEFINE eiffelType(String ns, String prefix) FOR IntegerType»A_INTEGER_VALUE«ENDDEFINE» «DEFINE eiffelType(String ns, String prefix) FOR DoubleType»A_DOUBLE_VALUE«ENDDEFINE» «DEFINE eiffelType(String ns, String prefix) FOR BooleanType»A_BOOLEAN_VALUE«ENDDEFINE» «DEFINE eiffelType(String ns, String prefix) FOR BinaryType»A_BINARY_VALUE«ENDDEFINE» «DEFINE eiffelType(String ns, String prefix) FOR ListType»A_SEQUENCE_VALUE [«EXPAND eiffelType(ns, prefix) FOR parameter»]«ENDDEFINE» «DEFINE eiffelType(String ns, String prefix) FOR MapType»A_MAP_VALUE [«EXPAND eiffelType(ns, prefix) FOR valueType»]«ENDDEFINE» «DEFINE eiffelType(String ns, String prefix) FOR NestedRecordType»«prefix»«ns.toUpperCase()»_«this.name.toUpperCase()»_MESSAGE«ENDDEFINE» «DEFINE eiffelType(String ns, String prefix) FOR DataType»«ERROR "Undefined Type " + name»«ENDDEFINE»