[all pages:] introduction message/location/muli format dtd xantlr tdom ops paisley metajava umod option auxiliaries d2d downloads & licenses people bibliography APPENDICES:: white papers white papers 2 white papers 3 project struct proposal SOURCE:option.dtd SOURCE:dtd.umod DOC:deliverables.ddf DOC-DE:deliverables.ddf DOC:mtdocpage.ddf DOC-DE:mtdocpage.ddf DOC-EN:lablog.ddf SOURCE:basic.dd2 DOC:xslt.ddf SOURCE:xslt.dd2 DOC:meta.ddf [site map]
All pages: introduction message/location/muli format dtd xantlr tdom ops paisley metajava umod option auxiliaries d2d downloads & licenses people bibliography APPENDICES:: white papers white papers 2 white papers 3 project struct proposal SOURCE:option.dtd SOURCE:dtd.umod DOC:deliverables.ddf DOC-DE:deliverables.ddf DOC:mtdocpage.ddf DOC-DE:mtdocpage.ddf DOC-EN:lablog.ddf SOURCE:basic.dd2 DOC:xslt.ddf SOURCE:xslt.dd2 DOC:meta.ddf [site map]
introduction | bandm meta_tools | format |
Classes and Concepts for User Messaging
(related API documentation: package message, package muli )
1
Basic Concepts for User Messaging
2
Details on Message and MessageReceivers
3
Details on Location
3.1
The Parametrization Chain and Methods for Easier Handling
4
Details on the muli Package
In the context of meta_tools , all messaging is done by creating and passing on objects of class message.Message . This type is abstract and needs to be specialized.
Up to now, one single simple instantiation of this type was sufficient for all situations (in meta_tools themselves and in many applications), namely message.SimpleMessage .
There is a whole zoo of message receiving (and possibly propagating) objects. They all are generic over the type of message they can receive. They all implement message.MessageReceiver . Those which propagate a message to one single receiver extend message.SingleSender .
For identifying positions in documents there is the class message.Location .
The class Location and the class Message and all of its sub-classes provided in metatools have all algebraicsemantics w.r.t equal(), and are immutable.
The package muli provides means for internationalization of text messages: advanced look-up methods and means for maintaining tables of translations, dynamically as well as by code generation.
The abstract type Message is the base class for all message types, and only defines three(3) fields:
protected Message.Kind | kind |
protected long | timestamp |
protected java.lang.RuntimeException | the "cause" of the message |
The timestamp is set automatically, memoizing the moment in real-time of construction, and the cause may be specified, to encapsulate a caught Java exception.
The kind must be specified explicitly by the caller of the constructor. It reflects the different roles a message can play in the context of a running application or server process:
Error | an exceptional behaviour caused by some ("wrong") user input. It is part of the normal work that this happens (frequently !-) |
Failure | an internal error of the software which should not happen. This is caused by a programming bug/flaw, either by the coder of the software, or of the underlying "virtual machine", etc. |
Warning | is issued to the user for convenience, indicating critical input which might have unintended effect. |
Hint | similar to warning, but gives more information for remedy. Possible as additional message to a preceding warning. |
Log | indicates some processing progress, or documents decisions the application has taken. |
LogStart/LogEnd | indicate that the application has started/conpleted a certain phase of processing. |
Messages are constructed and then passed through a pipeline of MessageReceivers. This pipeline must be constructed by the programmer explicitly. It may be dynamic, i.e. it may change during execution.
Please note that this pipeline must be configured correctly: Not specifiying a message receiver at any place where it is expected will make the attempt to send a message crash with a null pointer exception. Of course this should never happen in cleanly written programs! There is intentionally no default behaviour foreseen by the authors in case of missing message receivers, --- if the messaging pipeline is not reliable, then the program hardly is.
Furthermore, the message processing pipeline should be cycle free.
(Cycles cannot be detected automatically: just imagine
"MessageCatcher", which
propagates to a
"MessageAsync", which
propagates to a
"MessageThrower".
Or even better: do not imagine !-)
The classes implementing MessageReceiver perform very different and useful things with messages, e.g. filtering, sorting, counting, storing (incl. visualization), disposing, etc. Please refer to the API doc of message.MessageReceiver , or to the class list of the package documentation.
As mentioned above, we work with a very simple instantiation of abstract Message, namely SimpleMessage<D>. This only defines two new fields and their getter methods:
protected Location<D> | getLocation() |
protected String | getText() |
The parameter "<D>" is the most general document identifier supported by the location class.
The class itself provides a whole zoo of static factory methods, for convenient constructor calls with many different combinations of parameters.
The subclass SimpleMessage.Ping is originally intended for the typical co-operation with a MessagePrinter.Indenting. Such a printer will show an increasing row of dots on a terminal, one dot for each received Ping message.
The toString()method of SimpleMessage is compatible to the next-error function of XEmacs .
The overall zoo of message processing classes is shown in the following picture in a simplified way. For the exact relations please refer to the package's class tree:
+--------------+ .drain +-----------------+ | SingleSender |-----------------------------> | MessageReceiver | +--------------+ ---> +-----------------+ +--------------+ / -.> +-----------------+ /\ .drains / / -> /\ /__\ |/ / /__\ | | / | +---------------+-----+ +---------+----- |/ -------------+-----+ | | | | | | | | | +------------+ | | | | | MessageTee |--+ | | | | +------------+ | | +-------------+ +--------------+ |Primitive | +--------------+ |SimpleMessage| | MessageAsync |-----+ | MessageDemux| +--|MessageCounter| |.Generator |--+ +--+-----------+ | +------/\-----* | +--------------+ +-------------+ | |MessageKindFilter|-+ /__\ |MessageDisposer|-+ |MessageCatcher | +-----------------+ | | +---------------+ | +---------------+ | MessagePasser |-+ +------------+ | MessagePrinter |-+ +----------------+ | |MessageDemux| +----------------+ | | MessageSync | +------------+ +-| MessageStore | +---------------+ | +----------------+ +----|MessageThrower | | +----------------+ | TrafficLight | +--------------+ |
The class message.Location is the means for identifying positions in documents. It supports a sophisticated algebra, between "points", "ranges" and "set of ranges". It must be instantiated with some class which serves for identifying documents as a whole. For this you can use message.XMLDocumentIdentifier .
Please refer to the API doc for further information.
In fact, the message receivers, as employed in the meta_tools code itself, are currently our "deepest" practical experience with parametrization in java. The chain of type parameters is e.g. as follows:
MessageReceiver <SimpleMessage --> contains Location <DocumentIdentifier>> <DocumentIdentifier> |
In practice, there are cases where you have messages without any location information. Whenever a stream of such messages shall be joined with a second, which does have, translation functions must be applied. This can soon become very tedious, because for changing something deeply nested you normally have to de-compose, update and re-construct it. To make this easier there is a collection of "lift" methods, which are spread over the different class definitions, but intended to co-operate.
The are based on the ops.Function class, as described in ops.html.
In detail we have
The co-operation of these lift-methods is illustrated by the following code snippet:
static { final MessageReceiver<SimpleMessage<String>> rcv = null ; final MessageReceiver<SimpleMessage<XMLDocumentIdentifier>> hmm = MessageMapper.lift (SimpleMessage.liftMapLocation (Location.liftMapDocumentId(XMLDocumentIdentifier.getSystemId))).apply(rcv) ; } |
The muli package provides means for maintaining translation tables, and advanced translation look-up. Please refer to the API doc.
The main datastructures are MuLi for one single entry in several languages, Catalog realizing a map with versatile access methods, and MuLi.TextFound which represents look-up results.
All entries can be added programmatically, but also read incrementally
from a translation file. This is an XML document, following
http://bandm.eu/doctypes/muli.dtd.
(See also the
rendered and linked version.)
Furthermore such a file can be compiled to Java constant initialization, which can stil be mixed freely with the other definition methods.
The language codes used are currently not restricted, but they should follow the common practice as with xml:lang, i.e. follow RFC 4646 / RFC 4647 / "[IETF BCP 47], Tags for the Identification of Languages".
(( Currently, we refer to ISO 639-2, as listed e.g. in [isolanguage] , instead, because the URL for IETF BCP 47 as referred to at the end of [xml] is BROKEN !!))
So it can also take forms like ...
<entry key="bomb_warning_on_an_international_airport"> <text lang="en-us">Please mind your baggage</text> <text lang="en-uk">Please mind your luggage</text> </entry> <entry key="month1"> <text lang="de">Januar</text> <text lang="de-au">Jänner</text> </entry> |
introduction | bandm meta_tools | format |
made
2024-08-30_17h42 by
lepper on
happy-ubuntu
produced with
eu.bandm.metatools.d2d
and
XSLT
FYI view
page d2d source text