On Mon, Oct 22, 2012 at 12:26 PM, Marius Dumitru Florea < [email protected]> 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. > Well, I am more like Marius, and imagine Thomas will agree, that it would be better to remove that technical details from the XML as soon as we can. I also agree with Thomas that it is not nice to break a format we have kept stable since very long. However, we will need to break it soon or later, if we want real improvement. This is a usual situation with file formats, at some point you need to introduce some versioning. So, why not starting now ? What I mean by introducing versioning is: 1) Add a version to the file, stating its format version 2) Support loading any earlier formats 3) Support saving to an older format 2) and 3) could be implemented using XSLT or a similar kind of converter, so it will avoid garbaging our latest format version. WDYT ? > > 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 > -- Denis Gervalle SOFTEC sa - CEO eGuilde sarl - CTO _______________________________________________ devs mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/devs

