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
notifications(a)xwiki.org
http://lists.xwiki.org/mailman/listinfo/notifications
--
Thomas Mortagne
_______________________________________________
notifications mailing list
notifications(a)xwiki.org