My First Web Application
Example Application: Keeping Track of Publications
In this tutorial we build a small web application for registering publications and writing reviews about them. This could be the start of a larger community site for sharing bibliographic references and opinions about these. Such a site could deal with the following entities:
- Publication
- Author
- Review
- User
- Group
- Bibliography
- Collection
- Citations
Data Models: Records
We start simply with the entity of publications. A first attempt is the following 'record' data model of Publication:
entity Publication {
title :: String (name)
authors :: String
abstract :: String
published :: String
url :: String
}
According to this entity definition, a Publication has several String valued properties. The properties of an entity type store the information of entity objects of that type. If e denotes an object of type Publication, then e.title can be used to obtain the title of the the publication. The title property has a name annotation, this has the effect of adding a derived property name. By convention, any WebDSL object can be asked for its name, which provides a generic interface to naming an object, for instance when producing links.
Data Models: Associations
Instead of using a String to encode (the names of) the authors of a Publication, we'd rather like to use a list of references to actual Persons, i.e., objects represented by a proper entity definition in WebDSL. To this end we introduce a Person entity and make the authors property of Publication and association to a List of Person. Likewise, we'd like to an association from Person to the Set of Publications that the Person has authored. Moreover, we'd like this relation to be consistent. That is, whenever, a person is listed as author of a publication, the publication should be in the set of publications of that person. This is what the inverse annotation on the authors property achieves.
entity Publication {
title :: String (name)
authors -> List<Person> (inverse=Person.publications)
abstract :: String
published :: String
url :: String
}
entity Person {
fullname :: String (name)
homepage :: String
email :: String
address <> Address
publications -> Set<Publication>
}
entity Address {
street :: String
city :: String
country :: String
phone :: String
}
The authors association is a reference association. In contrast, the address association of Person is a composite association, which indicates that the address is 'owned' by the person; if the person object is deleted, the corresponding address object can be deleted as well.
Data Models: Special Types
Entity associations provide a more informative type for a property than the plain string type. While (string) value types are fine for other properties such as title, abstract, and url, it would be useful to have a better distinction in the role of these values. Therefore, WebDSL provides a range of special value types such as Text, WikiText Date, URL, and Email that convey the sort of string value that is contained in the property, such that appropriate operations and user interfaces can be attached to these properties.
entity Publication {
title :: String (name)
authors -> List<Person> (inverse=Person.publications)
abstract :: Text
published :: Date
url :: URL
}
entity Person {
fullname :: String (name)
homepage :: URL (optional)
email :: Email (optional)
address <> Address
publications -> Set<Publication>
}
entity Address {
street :: String
city :: String
country :: String
phone :: String
}
Defining an Application (Mark 1)
Now we have a complete data model for publications and their authors. From such a data model we can already generate a prototype application for creating, viewing, and editing objects for the entity types. An application definition starts with the keyword application and then contains a number of descriptions and sections containing entity and other definitions.
application org.researchr.www
description { A community site about research. }
section data model
entity Publication { ... }
entity Person { ... }
entity Address { ... }
section templates
define main() { body() manageMenu() }
define body() {}
define manageMenu() {}
define page home() { main() }
Here is the complete code of this application.
The code:
My First Web Application