On Mon, Oct 22, 2012 at 10:36 AM, Marius Dumitru Florea <[email protected]> wrote: > Hi devs, > > Currently, the available XClass property types are hard-coded in > MetaClass [1]. So in order to add a new property type you need to > recompile the XWiki old core. I'd like to be able to create new > property types using components so I created this branch [2] that > includes the following important changes: > > (A) Use the value of the "classType" XML element from the XAR as a > property type hint > > If you look at the XML export of an XClass you'll see that each > property has a "classType" element whose content is the full name of > the Java class used to implement that property type: > > <classType>com.xpn.xwiki.objects.classes.DBTreeListClass</classType> > > I think this is bad because: > * it exposes an implementation detail > * you cannot change the property type implementation without breaking > backwards compatibility > > So I'm proposing to use the "classType" as a hint for the property > type. Well, technically it will be a hint, but semantically it will > specify the data type of the property value (e.g. String, Date, > Number). For backwards compatibility, the existing property types will > have hints that can be extracted from the value of the 'classType' > (i.e. the full Java class name): > > String hint = StringUtils.removeEnd(StringUtils.substringAfterLast(classType, > "."), "Class"); > > So both: > > <classType>com.xpn.xwiki.objects.classes.DBTreeListClass</classType> > <classType>DBTreeList</classType> > > will point to the property type with hint "DBTreeList". Of course, > when exporting an XClass with the new version of the core you'll only > see the property type hint. > > The only issue with this approach is that XClasses exported with the > new version will not work on an older version but this is acceptable > IMO.
I don't like breaking stuff too much especially when it's far from mandatory technically. We could either: * keep theses old classType and have cleaner ones for new types. It's not a big deal IMO, we are talking about oldcore API here and we will have to introduce a new component API for this anyway with the new model. * or simply introduce a new field in the class which would fallback on String hint = StringUtils.removeEnd(StringUtils.substringAfterLast(classType, "."), "Class"); when it's not defined > > (B) Add a PropertyClassProvider [3] role to retrieve an instance of a > property class and to access its meta class > > Currently, in order to define a new property type you need to create > two Java classes: > * one extending PropertyMetaClass, to define the list of meta > properties of the new property type (e.g. displayType, dateFormat, > multiSelect, etc.) > * one extending ProperyClass, to define setters and getters for the > meta properties and maybe some custom display. This is the property > type itself. > > So I added a PropertyClassProvider role that has two methods: one to > get the meta class and one to get a new instance of the property type > (e.g. when adding a property to an XClass). As a quick implementation > I transformed all meta classes into implementations of this role. > Finally, I modified MetaClass to lookup property class providers > instead of hard-coding the property types. > > WDYT? > > Note that I've not added any CLIRR excludes and I tested my changes > with the default, unchanged, class editor and it works fine. > > Thanks, > Marius > > [1] > https://github.com/xwiki/xwiki-platform/blob/xwiki-platform-4.2/xwiki-platform-core/xwiki-platform-oldcore/src/main/java/com/xpn/xwiki/objects/meta/MetaClass.java#L33 > [2] > https://github.com/xwiki/xwiki-platform/compare/feature-xclass-property-component > [3] > https://github.com/xwiki/xwiki-platform/commit/fb9fcc7313ccb16f38c2d17dd7edf3a8e299a69b#diff-2 > _______________________________________________ > devs mailing list > [email protected] > http://lists.xwiki.org/mailman/listinfo/devs -- Thomas Mortagne _______________________________________________ devs mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/devs

