← Back to team overview

dhis2-devs team mailing list archive

Re: [OPENMRS-DEV] Current state of attributes

 

On coded attributes ...

How is a coded attribute different from a groupset?  From a
dimensionality perspective they realy seem completely identical to me.
 So should we drop groupsets?  Or implement coded attributes as
groupsets?

On 25 September 2011 16:25, Bob Jolliffe <bobjolliffe@xxxxxxxxx> wrote:
> 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

References