Shouldn't we have only one component which do the serialize/unserialize to make sure the same rule is applied in the two way ? It seems weird to me to be able to change the way to parse a document reference and let the document reference creation to another implementation.
On Fri, Apr 3, 2009 at 22:48, vmassol <[email protected]> wrote: > Author: vmassol > Date: 2009-04-03 22:48:34 +0200 (Fri, 03 Apr 2009) > New Revision: 18236 > > Added: > > platform/core/branches/xwiki-core-1.8/xwiki-bridge/src/main/java/org/xwiki/bridge/DocumentNameFactory.java > > platform/core/branches/xwiki-core-1.8/xwiki-bridge/src/main/java/org/xwiki/bridge/DocumentNameSerializer.java > > platform/core/branches/xwiki-core-1.8/xwiki-core/src/main/java/com/xpn/xwiki/doc/DefaultDocumentNameFactory.java > > platform/core/branches/xwiki-core-1.8/xwiki-core/src/main/java/com/xpn/xwiki/doc/DefaultDocumentNameSerializer.java > > platform/core/branches/xwiki-core-1.8/xwiki-core/src/test/java/com/xpn/xwiki/doc/DefaultDocumentNameFactoryTest.java > > platform/core/branches/xwiki-core-1.8/xwiki-core/src/test/java/com/xpn/xwiki/doc/DefaultDocumentNameSerializerTest.java > Modified: > > platform/core/branches/xwiki-core-1.8/xwiki-core/src/main/resources/META-INF/plexus/components.xml > Log: > XWIKI-3501: Add Document Name factory and serializer > > Merged from trunk (rev 18235) > > > Added: > platform/core/branches/xwiki-core-1.8/xwiki-bridge/src/main/java/org/xwiki/bridge/DocumentNameFactory.java > =================================================================== > --- > platform/core/branches/xwiki-core-1.8/xwiki-bridge/src/main/java/org/xwiki/bridge/DocumentNameFactory.java > (rev 0) > +++ > platform/core/branches/xwiki-core-1.8/xwiki-bridge/src/main/java/org/xwiki/bridge/DocumentNameFactory.java > 2009-04-03 20:48:34 UTC (rev 18236) > @@ -0,0 +1,41 @@ > +/* > + * See the NOTICE file distributed with this work for additional > + * information regarding copyright ownership. > + * > + * This is free software; you can redistribute it and/or modify it > + * under the terms of the GNU Lesser General Public License as > + * published by the Free Software Foundation; either version 2.1 of > + * the License, or (at your option) any later version. > + * > + * This software is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with this software; if not, write to the Free > + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA > + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. > + */ > +package org.xwiki.bridge; > + > +/** > + * Generate a Document Name from a raw string reference. > + * > + * @version $Id: $ > + * @since 1.8.1 > + */ > +public interface DocumentNameFactory > +{ > + /** > + * Role for looking up implementing components. > + */ > + String ROLE = DocumentNameFactory.class.getName(); > + > + /** > + * @param reference the document's name as a string using a textual > format (eg {...@code wiki:space.page}). > + * The supported format is up to implementers of this method. > + * @return the object representing a document reference > + */ > + DocumentName createDocumentName(String reference); > +} > > Added: > platform/core/branches/xwiki-core-1.8/xwiki-bridge/src/main/java/org/xwiki/bridge/DocumentNameSerializer.java > =================================================================== > --- > platform/core/branches/xwiki-core-1.8/xwiki-bridge/src/main/java/org/xwiki/bridge/DocumentNameSerializer.java > (rev 0) > +++ > platform/core/branches/xwiki-core-1.8/xwiki-bridge/src/main/java/org/xwiki/bridge/DocumentNameSerializer.java > 2009-04-03 20:48:34 UTC (rev 18236) > @@ -0,0 +1,41 @@ > +/* > + * See the NOTICE file distributed with this work for additional > + * information regarding copyright ownership. > + * > + * This is free software; you can redistribute it and/or modify it > + * under the terms of the GNU Lesser General Public License as > + * published by the Free Software Foundation; either version 2.1 of > + * the License, or (at your option) any later version. > + * > + * This software is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with this software; if not, write to the Free > + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA > + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. > + */ > +package org.xwiki.bridge; > + > +/** > + * Generate a fully qualified document reference string (ie of the form > + * {...@code wiki:space.page}) out of a {...@link DocumentName}. > + * > + * @version $Id: $ > + * @since 1.8.1 > + */ > +public interface DocumentNameSerializer > +{ > + /** > + * Role for looking up implementing components. > + */ > + String ROLE = DocumentNameSerializer.class.getName(); > + > + /** > + * @param documentName the document name to serialize > + * @return the fully qualified document reference string (ie of the form > {...@code wiki:space.page}) > + */ > + String serialize(DocumentName documentName); > +} > > Added: > platform/core/branches/xwiki-core-1.8/xwiki-core/src/main/java/com/xpn/xwiki/doc/DefaultDocumentNameFactory.java > =================================================================== > --- > platform/core/branches/xwiki-core-1.8/xwiki-core/src/main/java/com/xpn/xwiki/doc/DefaultDocumentNameFactory.java > (rev 0) > +++ > platform/core/branches/xwiki-core-1.8/xwiki-core/src/main/java/com/xpn/xwiki/doc/DefaultDocumentNameFactory.java > 2009-04-03 20:48:34 UTC (rev 18236) > @@ -0,0 +1,163 @@ > +/* > + * See the NOTICE file distributed with this work for additional > + * information regarding copyright ownership. > + * > + * This is free software; you can redistribute it and/or modify it > + * under the terms of the GNU Lesser General Public License as > + * published by the Free Software Foundation; either version 2.1 of > + * the License, or (at your option) any later version. > + * > + * This software is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with this software; if not, write to the Free > + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA > + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. > + */ > +package com.xpn.xwiki.doc; > + > +import org.apache.commons.lang.StringUtils; > +import org.xwiki.bridge.DocumentName; > +import org.xwiki.bridge.DocumentNameFactory; > +import org.xwiki.context.Execution; > + > +import com.xpn.xwiki.XWikiContext; > + > +/** > + * Generate a Document Name from a raw string reference. > + * > + * @version $Id: $ > + * @since 1.8.1 > + */ > +public class DefaultDocumentNameFactory implements DocumentNameFactory > +{ > + /** > + * Default space to use when the user has not specified any space and > there's no current space set in the context. > + */ > + private static final String DEFAULT_SPACE = "XWiki"; > + > + /** > + * Default page name when the user has not specified the page name. > + */ > + private static final String DEFAULT_PAGE = "WebHome"; > + > + /** > + * Default wiki to use when the user has not specified any wiki and > there's no current wiki set in the context. > + */ > + private static final String DEFAULT_WIKI = "xwiki"; > + > + private static final String WIKI_SEPARATOR = ":"; > + > + private static final String SPACE_SEPARATOR = "."; > + > + /** > + * Execution context handler, needed for accessing the XWikiContext. > + */ > + private Execution execution; > + > + public DocumentName createDocumentName(String reference) > + { > + String wiki; > + String space; > + String page; > + > + if (StringUtils.isBlank(reference)) { > + wiki = getDefaultWikiName(); > + space = getDefaultSpaceName(); > + page = DEFAULT_PAGE; > + } else { > + > + // Step 1: Extract the wiki name > + > + // We allow the wiki separator in wiki names and thus we look > for the last wiki sep in the reference. > + // TODO: Note that this was done to have the same behavior of > XWikiDocument.setFullName() but it would > + // seem better to me to allow the wiki sep in space names > rather than in wiki names (since wiki > + // names are constrained by database schema names). > + int spaceSeparatorPosition; > + int wikiSeparatorPosition = > reference.lastIndexOf(WIKI_SEPARATOR); > + if (wikiSeparatorPosition != -1) { > + wiki = reference.substring(0, wikiSeparatorPosition); > + if (wiki.length() == 0) { > + wiki = getDefaultWikiName(); > + } > + > + spaceSeparatorPosition = reference.indexOf(SPACE_SEPARATOR, > wikiSeparatorPosition); > + } else { > + // No wiki separator, use default wiki. > + wiki = getDefaultWikiName(); > + > + // We allow space sep in space names and thus we look for > the last space sep in the reference. > + // TODO: Note that this was done to have the same behavior > of XWikiDocument.setFullName() but it would > + // seem better to me to allow space sep in pages names > rather than in space names (since users > + // want more liberty in page names and usually create > pages in existing spaces). > + spaceSeparatorPosition = > reference.lastIndexOf(SPACE_SEPARATOR); > + } > + > + // Step 2: Extract the space and page names > + > + if (spaceSeparatorPosition != -1) { > + space = reference.substring(wikiSeparatorPosition + > WIKI_SEPARATOR.length(), > + spaceSeparatorPosition); > + if (space.length() == 0) { > + space = getDefaultSpaceName(); > + } > + > + // Make sure the space separator is not the last char of the > reference > + if (spaceSeparatorPosition + SPACE_SEPARATOR.length() < > reference.length()) { > + page = reference.substring(spaceSeparatorPosition + > SPACE_SEPARATOR.length()); > + } else { > + page = DEFAULT_PAGE; > + } > + } else { > + // No space separator the whole substring is thus the page. > + space = getDefaultSpaceName(); > + > + // Make sure the wiki separator is not the last char of the > reference > + if (wikiSeparatorPosition == -1 > + || wikiSeparatorPosition + WIKI_SEPARATOR.length() < > reference.length()) > + { > + page = reference.substring(wikiSeparatorPosition + > WIKI_SEPARATOR.length()); > + } else { > + page = DEFAULT_PAGE; > + } > + } > + } > + > + return new DocumentName(wiki, space, page); > + } > + > + private String getDefaultWikiName() > + { > + String wiki = getContext().getDatabase(); > + if (wiki == null) { > + wiki = DEFAULT_WIKI; > + } > + return wiki; > + } > + > + private String getDefaultSpaceName() > + { > + String space; > + XWikiDocument currentDocument = getContext().getDoc(); > + if (currentDocument == null) { > + space = DEFAULT_SPACE; > + } else { > + space = currentDocument.getSpace(); > + if (space == null) { > + space = DEFAULT_SPACE; > + } > + } > + return space; > + } > + > + /** > + * @return the XWiki Context used to bridge with the old API > + */ > + private XWikiContext getContext() > + { > + return (XWikiContext) > this.execution.getContext().getProperty("xwikicontext"); > + } > +} > > Added: > platform/core/branches/xwiki-core-1.8/xwiki-core/src/main/java/com/xpn/xwiki/doc/DefaultDocumentNameSerializer.java > =================================================================== > --- > platform/core/branches/xwiki-core-1.8/xwiki-core/src/main/java/com/xpn/xwiki/doc/DefaultDocumentNameSerializer.java > (rev 0) > +++ > platform/core/branches/xwiki-core-1.8/xwiki-core/src/main/java/com/xpn/xwiki/doc/DefaultDocumentNameSerializer.java > 2009-04-03 20:48:34 UTC (rev 18236) > @@ -0,0 +1,51 @@ > +/* > + * See the NOTICE file distributed with this work for additional > + * information regarding copyright ownership. > + * > + * This is free software; you can redistribute it and/or modify it > + * under the terms of the GNU Lesser General Public License as > + * published by the Free Software Foundation; either version 2.1 of > + * the License, or (at your option) any later version. > + * > + * This software is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with this software; if not, write to the Free > + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA > + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. > + */ > +package com.xpn.xwiki.doc; > + > +import org.xwiki.bridge.DocumentName; > +import org.xwiki.bridge.DocumentNameSerializer; > + > +/** > + * Generate a fully qualified document reference string (ie of the form > + * {...@code <wiki>:<space>.<page>} out of a {...@link DocumentName}. > + * > + * @version $Id: $ > + * @since 1.8.1 > + */ > +public class DefaultDocumentNameSerializer implements DocumentNameSerializer > +{ > + /** > + * {...@inheritdoc} > + * @see DocumentNameSerializer#serialize(DocumentName) > + */ > + public String serialize(DocumentName documentName) > + { > + // A valid DocumentName must not have any null value and thus we > don't need to check for nulls here. > + // It's the responsibility of creators of DocumentName factories to > ensure it's valid. > + StringBuffer result = new StringBuffer(); > + result.append(documentName.getWiki()); > + result.append(':'); > + result.append(documentName.getSpace()); > + result.append('.'); > + result.append(documentName.getPage()); > + > + return result.toString(); > + } > +} > > Modified: > platform/core/branches/xwiki-core-1.8/xwiki-core/src/main/resources/META-INF/plexus/components.xml > =================================================================== > --- > platform/core/branches/xwiki-core-1.8/xwiki-core/src/main/resources/META-INF/plexus/components.xml > 2009-04-03 20:46:01 UTC (rev 18235) > +++ > platform/core/branches/xwiki-core-1.8/xwiki-core/src/main/resources/META-INF/plexus/components.xml > 2009-04-03 20:48:34 UTC (rev 18236) > @@ -51,7 +51,6 @@ > <role-hint>default</role-hint> > > <implementation>com.xpn.xwiki.doc.DefaultDocumentAccessBridge</implementation> > <instantiation-strategy>singleton</instantiation-strategy> > - <lifecycle-handler>xwiki</lifecycle-handler> > <requirements> > <requirement> > <role>org.xwiki.context.Execution</role> > @@ -59,11 +58,27 @@ > </requirements> > </component> > <component> > + <role>org.xwiki.bridge.DocumentNameFactory</role> > + <role-hint>default</role-hint> > + > <implementation>com.xpn.xwiki.doc.DefaultDocumentNameFactory</implementation> > + <instantiation-strategy>singleton</instantiation-strategy> > + <requirements> > + <requirement> > + <role>org.xwiki.context.Execution</role> > + </requirement> > + </requirements> > + </component> > + <component> > + <role>org.xwiki.bridge.DocumentNameSerializer</role> > + <role-hint>default</role-hint> > + > <implementation>com.xpn.xwiki.doc.DefaultDocumentNameSerializer</implementation> > + <instantiation-strategy>singleton</instantiation-strategy> > + </component> > + <component> > <role>org.xwiki.bridge.SkinAccessBridge</role> > <role-hint>default</role-hint> > <implementation>com.xpn.xwiki.DefaultSkinAccessBridge</implementation> > <instantiation-strategy>singleton</instantiation-strategy> > - <lifecycle-handler>xwiki</lifecycle-handler> > <requirements> > <requirement> > <role>org.xwiki.context.Execution</role> > > Added: > platform/core/branches/xwiki-core-1.8/xwiki-core/src/test/java/com/xpn/xwiki/doc/DefaultDocumentNameFactoryTest.java > =================================================================== > --- > platform/core/branches/xwiki-core-1.8/xwiki-core/src/test/java/com/xpn/xwiki/doc/DefaultDocumentNameFactoryTest.java > (rev 0) > +++ > platform/core/branches/xwiki-core-1.8/xwiki-core/src/test/java/com/xpn/xwiki/doc/DefaultDocumentNameFactoryTest.java > 2009-04-03 20:48:34 UTC (rev 18236) > @@ -0,0 +1,119 @@ > +/* > + * See the NOTICE file distributed with this work for additional > + * information regarding copyright ownership. > + * > + * This is free software; you can redistribute it and/or modify it > + * under the terms of the GNU Lesser General Public License as > + * published by the Free Software Foundation; either version 2.1 of > + * the License, or (at your option) any later version. > + * > + * This software is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with this software; if not, write to the Free > + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA > + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. > + */ > +package com.xpn.xwiki.doc; > + > +import org.xwiki.bridge.DocumentName; > +import org.xwiki.bridge.DocumentNameFactory; > + > +import com.xpn.xwiki.test.AbstractBridgedXWikiComponentTestCase; > + > +/** > + * Unit tests for {...@link DocumentNameFactory}. > + * > + * @version $Id: $ > + * @since 1.8.1 > + */ > +public class DefaultDocumentNameFactoryTest extends > AbstractBridgedXWikiComponentTestCase > +{ > + private DocumentNameFactory factory; > + > + protected void setUp() throws Exception > + { > + super.setUp(); > + this.factory = (DocumentNameFactory) > getComponentManager().lookup(DocumentNameFactory.ROLE); > + } > + > + public void testCreateDocumentNameWhenCurrentDocSet() throws Exception > + { > + getContext().setDatabase("testwiki"); > + XWikiDocument document = new XWikiDocument(); > + document.setSpace("testspace"); > + getContext().setDoc(document); > + verify("testwiki", "testspace"); > + } > + > + public void testCreateDocumentNameWhenNoCurrentDoc() throws Exception > + { > + verify("xwiki", "XWiki"); > + } > + > + private void verify(String expectedDefaultWiki, String > expectedDefaultSpace) > + { > + DocumentName name = factory.createDocumentName("wiki:space.page"); > + assertEquals("wiki", name.getWiki()); > + assertEquals("space", name.getSpace()); > + assertEquals("page", name.getPage()); > + > + name = factory.createDocumentName("wiki1:wiki2:page"); > + assertEquals("wiki1:wiki2", name.getWiki()); > + assertEquals(expectedDefaultSpace, name.getSpace()); > + assertEquals("page", name.getPage()); > + > + name = factory.createDocumentName("wiki:"); > + assertEquals("wiki", name.getWiki()); > + assertEquals(expectedDefaultSpace, name.getSpace()); > + assertEquals("WebHome", name.getPage()); > + > + name = factory.createDocumentName("wiki1.wiki2:page"); > + assertEquals("wiki1.wiki2", name.getWiki()); > + assertEquals(expectedDefaultSpace, name.getSpace()); > + assertEquals("page", name.getPage()); > + > + name = factory.createDocumentName("wiki:page"); > + assertEquals("wiki", name.getWiki()); > + assertEquals(expectedDefaultSpace, name.getSpace()); > + assertEquals("page", name.getPage()); > + > + name = factory.createDocumentName("wiki:space."); > + assertEquals("wiki", name.getWiki()); > + assertEquals("space", name.getSpace()); > + assertEquals("WebHome", name.getPage()); > + > + name = factory.createDocumentName("space."); > + assertEquals(expectedDefaultWiki, name.getWiki()); > + assertEquals("space", name.getSpace()); > + assertEquals("WebHome", name.getPage()); > + > + name = factory.createDocumentName("page"); > + assertEquals(expectedDefaultWiki, name.getWiki()); > + assertEquals(expectedDefaultSpace, name.getSpace()); > + assertEquals("page", name.getPage()); > + > + name = factory.createDocumentName("."); > + assertEquals(expectedDefaultWiki, name.getWiki()); > + assertEquals(expectedDefaultSpace, name.getSpace()); > + assertEquals("WebHome", name.getPage()); > + > + name = factory.createDocumentName(":"); > + assertEquals(expectedDefaultWiki, name.getWiki()); > + assertEquals(expectedDefaultSpace, name.getSpace()); > + assertEquals("WebHome", name.getPage()); > + > + name = factory.createDocumentName(null); > + assertEquals(expectedDefaultWiki, name.getWiki()); > + assertEquals(expectedDefaultSpace, name.getSpace()); > + assertEquals("WebHome", name.getPage()); > + > + name = factory.createDocumentName(""); > + assertEquals(expectedDefaultWiki, name.getWiki()); > + assertEquals(expectedDefaultSpace, name.getSpace()); > + assertEquals("WebHome", name.getPage()); > + } > +} > > Added: > platform/core/branches/xwiki-core-1.8/xwiki-core/src/test/java/com/xpn/xwiki/doc/DefaultDocumentNameSerializerTest.java > =================================================================== > --- > platform/core/branches/xwiki-core-1.8/xwiki-core/src/test/java/com/xpn/xwiki/doc/DefaultDocumentNameSerializerTest.java > (rev 0) > +++ > platform/core/branches/xwiki-core-1.8/xwiki-core/src/test/java/com/xpn/xwiki/doc/DefaultDocumentNameSerializerTest.java > 2009-04-03 20:48:34 UTC (rev 18236) > @@ -0,0 +1,41 @@ > +/* > + * See the NOTICE file distributed with this work for additional > + * information regarding copyright ownership. > + * > + * This is free software; you can redistribute it and/or modify it > + * under the terms of the GNU Lesser General Public License as > + * published by the Free Software Foundation; either version 2.1 of > + * the License, or (at your option) any later version. > + * > + * This software is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with this software; if not, write to the Free > + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA > + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. > + */ > +package com.xpn.xwiki.doc; > + > +import org.xwiki.bridge.DocumentName; > +import org.xwiki.bridge.DocumentNameSerializer; > +import org.xwiki.test.AbstractXWikiComponentTestCase; > + > +/** > + * Unit tests for {...@link DocumentNameSerializer}. > + * > + * @version $Id: $ > + * @since 1.8.1 > + */ > +public class DefaultDocumentNameSerializerTest extends > AbstractXWikiComponentTestCase > +{ > + public void testSerialize() throws Exception > + { > + DocumentNameSerializer serializer = > + (DocumentNameSerializer) > getComponentManager().lookup(DocumentNameSerializer.ROLE); > + DocumentName name = new DocumentName("wiki", "space", "page"); > + assertEquals("wiki:space.page", serializer.serialize(name)); > + } > +} > > _______________________________________________ > notifications mailing list > [email protected] > http://lists.xwiki.org/mailman/listinfo/notifications > -- Thomas Mortagne _______________________________________________ devs mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/devs

