Should there be a ResourceType.OBJECT? If I were to redesign the core, I would make objects able to have "child" objects. That way Document, Attachment, Space and even Wiki could extend Object. It might be a lofty ideal but I think we ought to make our APIs so they would be compatible if we were to go that route.
Caleb Thomas Mortagne wrote: > On Tue, Dec 15, 2009 at 20:39, Thomas Mortagne > <thomas.morta...@xwiki.com> wrote: >> On Tue, Dec 15, 2009 at 19:02, Vincent Massol <vinc...@massol.net> wrote: >>> 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). > > I think there is a misunderstanding, if what you mean is that > ResourceNameFactory is too generic to know '@' syntax i don't see why. > The resources types are an enum and not generic string in your > proposal so ResourceNameFactory knows very well all the types and can > decide to have different separators character for each element. > >> The factory does not escape anything. A factory take a string in some >> syntax (syntax including escaping syntax) and parse it to create an >> object where all the part of the names are separated and unescaped. >> You have to give it a proper string, i don't see what it has to do >> with HTML form. >> >> I you want the factory to not take care of the attachment syntax part >> then you use ResourceNameFactory.create(String stringRepresentation, >> ResourceType.DOCUMENT) you put in your proposal... >> >>> The multi-factory solution removes this problem. >> Multi-factory does not bring any value, it's the opposite. It will >> just generate more classes and code duplicate. >> >>> 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 >>> >> >> >> -- >> Thomas Mortagne >> > > > _______________________________________________ devs mailing list devs@xwiki.org http://lists.xwiki.org/mailman/listinfo/devs