On Dec 15, 2009, at 6:39 PM, Thomas Mortagne 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 factory cannot know if it needs to escape the '@' char (for e ex).  
So it would the code handling the form (for ex) that would need to  
escape characters depending on what it is expecting (it would need to  
escape '@' for ex if it's expecting a document name and not escape it  
if it's expecting an attachment name).

The multi-factory solution removes this problem.

Thanks
-Vincent

>
>>
>> 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
>
>>
>> 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

Reply via email to