/* * Copyright (C) 2009 eXo Platform SAS. * * 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.exoplatform.services.jcr.api.namespaces; import org.apache.commons.lang.ArrayUtils; import org.apache.lucene.search.BooleanQuery; import org.exoplatform.services.jcr.JcrAPIBaseTest; import org.exoplatform.services.jcr.core.WorkspaceContainerFacade; import org.exoplatform.services.jcr.impl.core.ExtendedNamespaceRegistry; import org.exoplatform.services.jcr.impl.core.NamespaceRegistryImpl; import org.exoplatform.services.jcr.impl.core.NodeImpl; import org.exoplatform.services.jcr.impl.core.query.RepositoryIndexSearcherHolder; import java.util.Arrays; import java.util.Set; import javax.jcr.NamespaceException; import javax.jcr.Node; import javax.jcr.PropertyType; import javax.jcr.RepositoryException; /** * Created by The eXo Platform SAS. * * @author <a href="mailto:gennady.azarenkov@exoplatform.com">Gennady * Azarenkov</a> * @version $Id: TestNamespaceRegistry.java 11907 2008-03-13 15:36:21Z ksm $ */ public class TestNamespaceRegistry extends JcrAPIBaseTest { protected ExtendedNamespaceRegistry namespaceRegistry; private RepositoryIndexSearcherHolder indexSearcherHolder; public void initRepository() throws RepositoryException { workspace = session.getWorkspace(); namespaceRegistry = (ExtendedNamespaceRegistry)workspace.getNamespaceRegistry(); try { namespaceRegistry.getURI("newMapping"); } catch (NamespaceException e) { // not found namespaceRegistry.registerNamespace("newMapping", "http://dumb.uri/jcr"); } } @Override public void setUp() throws Exception { super.setUp(); WorkspaceContainerFacade wsc = repository.getWorkspaceContainer(session.getWorkspace().getName()); indexSearcherHolder = (RepositoryIndexSearcherHolder)wsc.getComponent(RepositoryIndexSearcherHolder.class); //indexSearcherHolder = (RepositoryIndexSearcherHolder)container.getComponentInstanceOfType(RepositoryIndexSearcherHolder.class); } public void testGetPrefixes() throws RepositoryException { // namespaceRegistry.registerNamespace("newMapping", "http://dumb.uri/jcr"); String[] namespaces = {"jcr", "nt", "mix", "", "sv", "exo", "newMapping"}; String[] prefixes = namespaceRegistry.getPrefixes(); for (int i = 0; i < namespaces.length; i++) { String namespace = namespaces[i]; assertTrue("not found " + namespace, ArrayUtils.contains(prefixes, namespace)); } assertTrue(prefixes.length >= 7); assertTrue(Arrays.asList(session.getWorkspace().getNamespaceRegistry().getPrefixes()).containsAll( Arrays.asList(namespaceRegistry.getPrefixes()))); } public void testGetURIs() throws RepositoryException { // namespaceRegistry.registerNamespace("newMapping", "http://dumb.uri/jcr"); String[] namespacesURIs = {"http://www.jcp.org/jcr/1.0", "http://www.jcp.org/jcr/nt/1.0", "http://www.jcp.org/jcr/mix/1.0", "", "http://www.jcp.org/jcr/sv/1.0", "http://www.exoplatform.com/jcr/exo/1.0", "http://dumb.uri/jcr"}; String[] uris = namespaceRegistry.getURIs(); for (int i = 0; i < namespacesURIs.length; i++) { String namespacesURI = namespacesURIs[i]; assertTrue("not found " + namespacesURI, ArrayUtils.contains(uris, namespacesURI)); } } public void testGetURI() throws RepositoryException { // namespaceRegistry.registerNamespace("newMapping", "http://dumb.uri/jcr"); assertNotNull(namespaceRegistry.getURI("mix")); assertNotNull(namespaceRegistry.getURI("newMapping")); } public void testGetPrefix() throws RepositoryException { // namespaceRegistry.registerNamespace("newMapping", "http://dumb.uri/jcr"); assertNotNull(namespaceRegistry.getPrefix("http://www.jcp.org/jcr/mix/1.0")); assertEquals("mix", namespaceRegistry.getPrefix("http://www.jcp.org/jcr/mix/1.0")); assertNotNull(namespaceRegistry.getPrefix("http://dumb.uri/jcr")); try { namespaceRegistry.getPrefix("http://dumb.uri/jcr2"); fail("exception should have been thrown"); } catch (RepositoryException e) { } } // ///////////////// LEVEL 2 public void testBuiltInNamespace() throws RepositoryException { try { namespaceRegistry.registerNamespace("jcr", null); fail("exception should have been thrown"); } catch (NamespaceException e) { } try { namespaceRegistry.registerNamespace("nt", null); fail("exception should have been thrown"); } catch (NamespaceException e) { } try { namespaceRegistry.registerNamespace("mix", null); fail("exception should have been thrown"); } catch (NamespaceException e) { } try { namespaceRegistry.registerNamespace("sv", null); fail("exception should have been thrown"); } catch (NamespaceException e) { } try { namespaceRegistry.registerNamespace("jcr", "http://dumb.uri/jcr"); fail("exception should have been thrown"); } catch (NamespaceException e) { } try { namespaceRegistry.registerNamespace("xml-started", "http://dumb.uri/jcr"); fail("exception should have been thrown"); } catch (NamespaceException e) { } try { namespaceRegistry.unregisterNamespace("jcr"); fail("exception should have been thrown"); } catch (NamespaceException e) { } } public void testRegisterNamespace() throws RepositoryException { // namespaceRegistry.registerNamespace("newMapping", "http://dumb.uri/jcr"); assertNotNull(namespaceRegistry.getURI("newMapping")); assertEquals("http://dumb.uri/jcr", namespaceRegistry.getURI("newMapping")); NodeImpl n = (NodeImpl)root.addNode("newMapping:test", "nt:unstructured"); root.save(); n = (NodeImpl)root.getNode("newMapping:test"); n.remove(); root.save(); // [PN] Unregisteration of node types its not supported in eXo JCR. // (see http://jira.exoplatform.org/browse/JCR-43) namespaceRegistry.unregisterNamespace("newMapping"); try { root.addNode("newMapping:test1", "nt:unstructured"); root.save(); fail("exception should have been thrown"); } catch (RepositoryException e) { } try { assertNull(namespaceRegistry.getURI("newMapping")); fail("exception should have been thrown"); } catch (NamespaceException e) { } } public void testReRegiterNamespace() throws RepositoryException { // (see http://jira.exoplatform.org/browse/JCR-43) namespaceRegistry.registerNamespace("newMapping", "http://dumb.uri/jcr"); namespaceRegistry.registerNamespace("newMapping2", "http://dumb.uri/jcr"); try { assertNull(namespaceRegistry.getURI("newMapping")); fail("exception should have been thrown"); } catch (NamespaceException e) { } assertNotNull(namespaceRegistry.getURI("newMapping2")); assertEquals("http://dumb.uri/jcr", namespaceRegistry.getURI("newMapping2")); } public void testQueryNsPropName() throws Exception { namespaceRegistry.registerNamespace("testuri", "http://testquery.uri/www"); namespaceRegistry.registerNamespace("blahtesturi", "http://blahtesturi.uri/www"); Node test1 = root.addNode("NodeName1"); test1.setProperty("testuriprop", "v1"); Node test2 = root.addNode("nodeName2"); test2.setProperty("testuri:prop", "v2"); Node test3 = root.addNode("nodeName3"); test3.setProperty("blahtesturi:prop", "v2"); test3.setProperty("blahtesturi", "v2"); session.save(); Set<String> nodes = indexSearcherHolder.getNodesByUri("http://testquery.uri/www"); //((NamespaceRegistryImpl)namespaceRegistry).getNodes("testuri"); assertEquals(1, nodes.size()); assertFalse(nodes.contains(((NodeImpl)test1).getData().getIdentifier())); assertFalse(nodes.contains(((NodeImpl)test3).getData().getIdentifier())); assertTrue(nodes.contains(((NodeImpl)test2).getData().getIdentifier())); } public void testQueryNsNodeName() throws Exception { Node test1 = root.addNode("testuri:testNodeName"); Node test2 = root.addNode("testuriNodeName1"); Node test3 = root.addNode("blahtesturiNodeName1"); session.save(); Set<String> nodes = indexSearcherHolder.getNodesByUri("http://testquery.uri/www"); //((NamespaceRegistryImpl)namespaceRegistry).getNodes("testuri"); assertEquals(1, nodes.size()); assertTrue(nodes.contains(((NodeImpl)test1).getData().getIdentifier())); assertFalse(nodes.contains(((NodeImpl)test2).getData().getIdentifier())); assertFalse(nodes.contains(((NodeImpl)test3).getData().getIdentifier())); } public void testQueryNsNodePathValue() throws Exception { Node test1 = root.addNode("NodeName1"); test1.setProperty("tprop", valueFactory.createValue("/rr/testuri:node/", PropertyType.PATH)); Node test2 = root.addNode("nodeName2"); test2.setProperty("prop", "v2"); session.save(); Set<String> nodes = indexSearcherHolder.getNodesByUri("http://testquery.uri/www"); //((NamespaceRegistryImpl)namespaceRegistry).getNodes("testuri"); assertEquals(1, nodes.size()); assertTrue(nodes.contains(((NodeImpl)test1).getData().getIdentifier())); assertFalse(nodes.contains(((NodeImpl)test2).getData().getIdentifier())); } public void testQueryNsNodeNameValue() throws Exception { Node test1 = root.addNode("NodeName1"); test1.setProperty("tprop", valueFactory.createValue("testuri:node", PropertyType.NAME)); Node test2 = root.addNode("nodeName2"); test2.setProperty("prop", "v2"); Node test3 = root.addNode("nodeName2"); test3.setProperty("prop", "blablatesturi:v2"); session.save(); Set<String> nodes = indexSearcherHolder.getNodesByUri("http://testquery.uri/www"); //((NamespaceRegistryImpl)namespaceRegistry).getNodes("testuri"); assertEquals(1, nodes.size()); assertTrue(nodes.contains(((NodeImpl)test1).getData().getIdentifier())); assertFalse(nodes.contains(((NodeImpl)test2).getData().getIdentifier())); assertFalse(nodes.contains(((NodeImpl)test3).getData().getIdentifier())); } public void testTooManyFields() { try { namespaceRegistry.registerNamespace("tmf", "http://www.tmf.org/jcr"); int defClausesCount = BooleanQuery.getMaxClauseCount(); Node tr = root.addNode("testRoot"); for (int i = 0; i < defClausesCount + 10; i++) { tr.setProperty("prop" + i, i); } session.save(); // ok } catch (RepositoryException e) { e.printStackTrace(); fail(); } try { namespaceRegistry.unregisterNamespace("tmf"); } catch (NamespaceException e) { e.printStackTrace(); fail(); } catch (RepositoryException e) { e.printStackTrace(); fail(); } } public void testIsDefaultPrefix() { assertTrue(((NamespaceRegistryImpl)namespaceRegistry).isDefaultPrefix("nt")); assertFalse(((NamespaceRegistryImpl)namespaceRegistry).isDefaultPrefix("somePrefix")); } public void testIsDefaultNamespace() throws NamespaceException, RepositoryException { NamespaceRegistryImpl nameSpace = (NamespaceRegistryImpl)namespaceRegistry; String uri = workspace.getNamespaceRegistry().getURI("nt"); assertTrue(nameSpace.isDefaultNamespace(uri)); assertFalse(nameSpace.isDefaultNamespace(" ")); } public void testValidateNamespace() throws RepositoryException { try { ((NamespaceRegistryImpl)namespaceRegistry).validateNamespace("some:text", ""); fail(); } catch (RepositoryException e) { } try { ((NamespaceRegistryImpl)namespaceRegistry).validateNamespace("nt", null); fail(); } catch (NamespaceException e) { } } }