I copied this e-mail onto this wiki page <https://wiki.openmrs.org/x/tgGeAQ> in case that helps anyone (Roger) in reviewing (commenting on) it. Anyone interested in this topic may want to watch that page as well as the associated ticket <https://tickets.openmrs.org/browse/TRUNK-2588>.
-Burke On Sat, Sep 24, 2011 at 4:03 PM, Darius Jazayeri <[email protected]>wrote: > 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<https://tickets.openmrs.org/browse/TRUNK-2588> > ) > > 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<[email protected]?body=SIGNOFF%20openmrs-devel-l>from > OpenMRS Developers' mailing list _________________________________________ To unsubscribe from OpenMRS Developers' mailing list, send an e-mail to [email protected] with "SIGNOFF openmrs-devel-l" in the body (not the subject) of your e-mail. [mailto:[email protected]?body=SIGNOFF%20openmrs-devel-l]

