On Mon, Oct 22, 2012 at 6:58 PM, Jerome Velociter <[email protected]> wrote: > On 10/22/2012 12:26 PM, Marius Dumitru Florea wrote: >> >> On Mon, Oct 22, 2012 at 1:13 PM, Thomas Mortagne >> <[email protected]> wrote: >>> >>> On Mon, Oct 22, 2012 at 11:33 AM, Marius Dumitru Florea >>> <[email protected]> wrote: >>>> >>>> On Mon, Oct 22, 2012 at 12:15 PM, Thomas Mortagne >>>> <[email protected]> wrote: >>>>> >>>>> 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 >>>> >>>> To be clear. This is not backwards compatibility. Are you sure that a >>>> XAR from 4.2 can be imported in XWiki 1.0 for instance? In other >>>> words, whenever we extended the XAR/XML format did we take care to >>>> keep the new XARs working on older versions of XWiki? If the answer is >>>> yes then I agree with your suggestions below. But for me it's enough >>>> to ensure that older XARs work with newer versions of XWiki, not the >>>> other way around. >>> >>> I don't have any breaking change in mind except that obviously a 2.0 >>> document is not going to be parsed properly with XWiki version that >>> only knows 1.0. >>> >>> Anyway the point is not if it's going to fully work with XWiki 1.0. >>> I don't see any reason to break anything here and it's not even like >>> either of my suggestions was introducing any important complexity in >>> your proposal. >> >> Sure. That's what I did initially. My latest code is a bit more >> complex exactly because I didn't wanted to use the full Java class >> name as hint. So it's a choice between: 'don't break anything' and >> 'hide technical details from the XML'. I'm more for the second option >> but let's see what others think. > > > If I read correctly, "breaking the format" here means an extension exported > as XAR from 4.3 can only be installed in 4.3+ installations ? If that's > correct, IMO it's not acceptable.
Yes that's the main example I have in mlnd too. > > Jerome > > >> >> Thanks, >> Marius >> >>>> Thanks, >>>> Marius >>>> >>>>> 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 >>>> >>>> _______________________________________________ >>>> 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 >> >> _______________________________________________ >> devs mailing list >> [email protected] >> http://lists.xwiki.org/mailman/listinfo/devs > > > > _______________________________________________ > 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

