dhis2-devs team mailing list archive
-
dhis2-devs team
-
Mailing list archive
-
Message #14136
Fwd: [OPENMRS-DEV] Current state of attributes
Couldn't help but notice that the openmrs team are also engaged in a
process of defining generic attributes. And making them the subject
of design calls :-)
It might be useful to compare. Two things i pick up from the below is
that there seems to be much effort put into attribute types (validated
strings, dates etc) though I don't see the coded attributes which we
have and (ii) they DO have an interface, Customizable, which applies
to all classes which can e extended.
Interesting to see these efforts happening at the same time.
Cheers
Bob
---------- Forwarded message ----------
From: Darius Jazayeri <djazayeri@xxxxxxxxx>
Date: 24 September 2011 21:03
Subject: [OPENMRS-DEV] Current state of attributes
To: openmrs-devel-l@xxxxxxxxxxxxxxxxxx
Hi All,
On our last few design calls we've been working through the generic
AttributeType mechanism that we're introducing in 1.9. (see ticket)
I wanted to summarize the current state of things. Some of this is in
trunk, but some is refactoring I'm doing. I'm especially interested in
thoughts about how these classes should be linked together with
parameterized types, since I'm not convinced I've gotten that right:
interface CustomDatatypeHandler<T>
Capable of converting T to/from a String that can be persisted in the
varchar column of a database. E.g. a date would be stored as
yyyy-mm-dd and an image might be stored as a uri pointing to a PACS
system. Also capable of validating T, e.g. so we can use a plain
java.util.Date to represent "date-in-past" but limit its possible
values.
Defines a String "datatypeHandled", e.g. "date", "regex-validated-string")
T fromPersistedString(String)
String toPersistedString(T)
void validate(T)
String render(String persistedValue, String view)
can be configured with setHandlerConfiguration(String)
interface CustomDatatyped
holds the definition of a custom datatype (which is handled by a
handler of the above interface). For example VisitAttributeType and
GlobalProperty (we're able to do typed GPs trivially now)
required: String getDatatype()
optional: String getPreferredHandlerClassname()
if specified, will be handled by this specific CustomDatatypeHandler,
otherwise it will be handled by the default handler for this thing's
datatype
optional: String getHandlerConfig()
interface AttributeType<OwningType extends Customizable> extends
CustomDatatyped, OpenmrsMetadata
for user-defined extensions to core domain objects, which would be
handled by adding custom database columns in a less generic system.
E.g. VisitAttributeType implements AttributeType<Visit>
datatype/handler specified via CustomDatatyped superinterface
Integer getMinOccurs()
Integer getMaxOccurs()
class VisitAttributeType, class LocationAttributeType, class
ProviderAttributeType
trivial implementations of AttributeType (via BaseAttributeType)
interface Customizable<AttrClass extends Attribute>
Implemented by domain classes that may be customized by the user via
custom attributes. E.g. Visit implements Customizable<VisitAttribute>,
Location implements Customizable<LocationAttribute>
Has convenience methods for dealing with a collection of attributes,
of different types:
Collection<AttrClass> getAttributes() //includes voided
Collection<AttrClass> getActiveAttributes() //non-voided
void addAttribute(AttrClass)
void setAttribute(AttrClass) //voids other attributes of the given type
interface CustomValue
holds a value managed by a CustomDatatypeHandler. E.g. VisitAttribute,
GlobalProperty. Any implementation of this has a corresponding
CustomDatatyped implementation. "persistedValue" is a String suitable
for persisting in a db varchar column; "objectValue" is what you'd
want to work with in the API.
String getPersistedValue()
void setPersistedValue()
Object getObjectValue() // don't remember why this isn't <T>
void setObjectValue(Object)
interface Attribute<OwningType extends Customizable> implements
CustomValue, OpenmrsData
value corresponding to an AttributeType (which defines its datatype,
whether it's required, whether it can repeat, etc), e.g.
VisitAttribute corresponds to VisitAttributeType
OwningType getOwner()
void setOwner(OwningType)
AttributeType<OwningType> getAttributeType()
class VisitAttribute, class LocationAttribute, class ProviderAttribute
trivial implementation of Attribute (via BaseAttribute)
class GlobalProperty implements CustomDatatyped, CustomValue
this is interesting in that it both defines a custom datatype and
stores its value
Thoughts welcome...
-Darius
________________________________
Click here to unsubscribe from OpenMRS Developers' mailing list
Follow ups