«IMPORT messageDsl» «EXTENSION ch::ethz::origo::aranea::validation::MessageDslExtensions» «REM»template of the message class«ENDREM» «DEFINE messageTemplate FOR Message-» «LET properties.restrictions AS restrictions-» «FILE (namespace().name).toLowerCase() + "/" + fullName().camelCaseToUnderscore().toLowerCase()+"_message.e"-» note description: "«name» message. GENERATED DO NOT MODIFY" author: "Origo Team " date: "$Date$" revision: "$Revision$" class «fullName().toUpperCase()»_MESSAGE inherit «IF extends != null-» «extends.fullName().toUpperCase()»_MESSAGE rename make as make_«extends.fullName().camelCaseToUnderscore().toLowerCase()»_message redefine handle, namespace, parse_tag, serialization_list, type end «ELSE-» A_MESSAGE rename make as make_aranea_message end «ENDIF-» «(project().prefix + namespace().name.camelCaseToUnderscore()).toUpperCase()»_CONSTANTS undefine is_equal, out end create make, make_from_tokenizer create {«this.project().prefix»MESSAGE_FACTORY} make_from_ems_message feature {NONE} -- Initialization «EXPAND make(restrictions) FOR this» feature -- Message handling handle (a_handler: «fullName().toUpperCase()»_MESSAGE_HANDLER) -- do a_handler.handle_«name.camelCaseToUnderscore().toLowerCase()» (Current) end feature -- Access namespace: STRING -- Namespace of the message type. once Result := «namespace().name.camelCaseToUnderscore().toLowerCase()»_namespace end type: STRING -- Type of the message. once Result := «namespace().name.camelCaseToUnderscore().toLowerCase() + "_" + name.camelCaseToUnderscore().toLowerCase() + "_type"» end «FOREACH properties AS property» «property.name.toLowerCase()»: «EXPAND eiffelType(this.namespace().name, this.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 «IF extends != null-» Result := precursor if Result.is_empty then create Result.make_empty «IF properties.size > 0-» else Result.append (",") «ENDIF-» end check Result /= Void end «ELSE-» create Result.make_empty «ENDIF-» «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 extends != null-» precursor(a_tag, a_tokenizer) «ENDIF» «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 Message -» «LET this.allProperties() AS fullPropertyList -» «LET this.ancestorProperties() AS fullAncestorPropertyList -» «LET this.allRestrictions(this.allProperties()) AS allRestrictions -» make («FOREACH fullPropertyList AS property SEPARATOR "; "»a_«property.name.toLowerCase()»: like «property.name.toLowerCase()»«ENDFOREACH») -- Create «IF !allRestrictions.isEmpty-» require «FOREACH allRestrictions AS restriction-» «EXPAND makePrecondition FOR restriction» «ENDFOREACH-» «ENDIF-» do «IF extends ==null-» make_aranea_message «ELSE-» make_«extends.fullName().camelCaseToUnderscore().toLowerCase()»_message «IF !fullAncestorPropertyList.isEmpty-»(«FOREACH fullAncestorPropertyList AS property SEPARATOR ", "-»a_«property.name.toLowerCase()»«ENDFOREACH-») «ENDIF-» «ENDIF-» «FOREACH properties AS property-» «property.name.toLowerCase()» := a_«property.name.toLowerCase()» «ENDFOREACH-» ensure «FOREACH fullPropertyList AS property-» «property.name.toLowerCase()»_set: «property.name.toLowerCase()» = a_«property.name.toLowerCase()» «ENDFOREACH-» end «ENDLET -» «ENDLET -» «ENDLET -» «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»