On Thu, Dec 17, 2009 at 13:57, Vincent Massol <vinc...@massol.net> wrote: > > On Dec 16, 2009, at 9:40 AM, Thomas Mortagne wrote: > >> On Tue, Dec 15, 2009 at 18:39, Thomas Mortagne >> <thomas.morta...@xwiki.com> wrote: >>> On Tue, Dec 15, 2009 at 15:40, Vincent Massol <vinc...@massol.net> >>> wrote: >>>> Hi, >>>> >>>> I'd like to propose a refactoring for org.xwiki.model.DocumentName/ >>>> AttachmentName. >>>> >>>> There are currently 2 problems with the current implementation: >>>> - DocumentName doesn't support nested spaces (we need that for the >>>> future) >>>> - We need to generalize the concept of resource names so that we can >>>> use the generic concept in the Model in some APIs >>>> >>>> Thus I'd like to propose: >>>> >>>> enum ResourceType >>>> - WIKI, DOCUMENT, SPACE, ATTACHMENT >>>> >>>> ResourceName >>>> - ResourceName(String name, ResourceName parent) >>>> - get/setName() >>>> - get/setParent(ResourceName) >>>> - get/setType(ResourceType) >>>> >>>> DocumentName extends ResourceName >>>> - DocumentName(String pageName, SpaceName parent) >>>> >>>> AttachmentName extends ResourceName >>>> - AttachmentName(String fileName, DocumentName parent) >>>> >>>> WikiName extends ResourceName >>>> - WikiName(String wikiName) >>>> >>>> SpaceName extends ResourceName >>>> - SpaceName(String spaceName, SpaceName parent) >>>> - SpaceName(String spaceName, WikiName parent) >>>> >>>> Open questions and comments >>>> ======================== >>>> >>>> - Should we replace "Name" by "Reference", i.e. DocumentReference >>>> instead of DocumentName, WikiReference instead of WikiName? >>> >>> "Reference" or "Path" or something like that yes since it's not >>> really a name. >>> >>>> - Note: A name (or reference) isn't resistant to change. Resources >>>> (Document, Space, Wiki, etc) must also have an Identifier (unique >>>> id) >>>> to uniquely identify them. For example a Document can be moved from >>>> one space to another (the DocumentName changes in this case). >>>> - The scheme above allows to map this easily to the JCR API >>>> - Do we want helper methods for locating the wiki in which a >>>> DocumentName is? That would mean adding: >>>> WikiName DocumentName.getWiki() (algo: getParent() till getType == >>>> WIKI or null) >>>> Same question for getting the last Space or Wiki from AttachmentName >>> >>> Seems useful yes, we are using it a lot in the current DocumentName. >>> >>>> - Do we want a helper constructor to make it easier to create a >>>> DocumentName? With the proposal above it means: >>>> new DocumentName("page", new SpaceName("space", new >>>> WikiName("wiki"))); >>>> A helper constructor could be: DocumentName(String page, String >>>> space, >>>> String wiki). >>> >>> I don't think it's really necessary. We can always add it latter. >>> >>>> Problems: a) we would need another constructor to support a list of >>>> spaces and b) if there are fields other than the name to set on >>>> ResourceNames later on, it's not going to work as smoothly) >>>> >>>> Factory and Serializer >>>> ================= >>>> >>>> This is a big question I haven't yet solved. We have 2 options: >>>> 1) have specialized Factory/Serializer. For ex: DocumentNameFactory, >>>> DocumentNameSerializer >>>> 2) have generic ones: ResourceNameFactory/ResourceNameSerializer >>>> >>>> 2) seems nicer initially but the problem with 2) is that we need a >>>> global String representation of any resource in the system. There >>>> are >>>> 2 problems with that: >>>> - we may not want that. For example when the user is asked to >>>> enter a >>>> document name in a field, we may not need/want to parse this as a >>>> general resource that could for example point to an attachment (and >>>> btw as a consequence allow entering "@" which is our separator for >>>> attachments) >>>> - it's very hard to add new Resource types later on (since we'd need >>>> more special characters to separate them and this means these chars >>>> wouldn't be allowed in names for pages for ex) >>> >>> We need escaping support anyway, we can't continue to use a syntax >>> that does not support all characters, it introduce important >>> limitations for no reason. In a real syntax the special characters >>> has >>> nothing to do with the supported content... >>> >>>> >>>> The other option is to have 2) but with the type passed as >>>> parameter: >>>> ResourceName ResourceNameFactory.create(String stringRepresentation, >>>> ResourceType) >>>> >>>> However this simply means that ResourceNameFactory would be a >>>> factory >>>> for actual factories (DocumentNameFactory, AttachmentNameFactory, >>>> etc) >>>> so I don't really see the added value in our component-based world >>>> (we >>>> can look up the right factory directly). >>> >>> In this case I don't see the point of having lots of different >>> components interfaces just to support this ResourceType parameter. >>> Plus: >>> - when you need to write another (un)serializer syntax for resources >>> (URIResourceNameSerializer for example) it's a lot less work/classes >>> - it's easier to handle escaping when you serialize in a central >>> component like ResourceNameSerializer that knows all the syntaxes to >>> escape. If you separate it in several different serializers >>> WikiDocumentNameSerializer don't know it has to escape '@' for >>> example >>> since at its level attachment does not exists or you have to copy/ >>> past >>> the code but with escaping of '@' in WikiAttachmentNameSerializer >> >> - actually the worst i think is that 2) make pretty much impossible to >> renderer a generic ResourceName . DocumentName, AttachmentNames etc... >> are supposed to be only helpers to make easier to manipulate a generic >> ResourceName but with 2) It mean instead of being generic >> ResourceName is not more that an abstract class... > > Ok, I agree. I'd like to use this signature though: > ResourceNameFactory.create(String textualRepresentation, ResourceType > type) > > The reason is that we need to know what the text represents in order > to have a performant implementation and also because the text passed > shouldn't have to escape "@" for example if it represents a Document > name since it's a character allowed in a document name.
Ok for me. Note that ResourceNameSerializer does not need that (since the type is located in the ResourceName itself). > > Thanks > -Vincent > >>>> Thus IMO we want 1). >>> >>> +1 for 2), -0 for 1) >>> >>>> >>>> WDYT? >>>> >>>> Thanks >>>> -Vincent > > _______________________________________________ > devs mailing list > devs@xwiki.org > http://lists.xwiki.org/mailman/listinfo/devs > -- Thomas Mortagne _______________________________________________ devs mailing list devs@xwiki.org http://lists.xwiki.org/mailman/listinfo/devs