/* * 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.ext.registry; import org.exoplatform.container.StandaloneContainer; import org.exoplatform.services.jcr.ext.BaseStandaloneTest; import org.exoplatform.services.jcr.ext.app.SessionProviderService; import org.exoplatform.services.jcr.ext.common.SessionProvider; import org.exoplatform.services.security.ConversationState; import org.w3c.dom.Document; import java.io.ByteArrayInputStream; import javax.jcr.Node; import javax.jcr.PathNotFoundException; import javax.jcr.RepositoryException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; public class RegistryTest extends BaseStandaloneTest { private SessionProviderService sessionProviderService; private static final String SERVICE_XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<exo_service xmlns:jcr=\"http://www.jcp.org/jcr/1.0\" jcr:primaryType=\"exo:registryEntry\"/>"; private static final String NAV_XML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<node-navigation><owner-type>portal</owner-type><owner-id>portalone</owner-id>" + "<access-permissions>*:/guest</access-permissions><page-nodes><node>" + "<uri>portalone::home</uri><name>home</name><label>Home</label>" + "<page-reference>portal::portalone::content</page-reference></node>" + "<node><uri>portalone::register</uri><name>register</name><label>Register</label>" + "<page-reference>portal::portalone::register</page-reference></node>" + "</page-nodes></node-navigation>"; @Override public void setUp() throws Exception { super.setUp(); this.sessionProviderService = (SessionProviderService)container .getComponentInstanceOfType(SessionProviderService.class); // this.registry = (ConversationRegistry) // container.getComponentInstanceOfType(ConversationRegistry.class); sessionProviderService.setSessionProvider(null, new SessionProvider(ConversationState.getCurrent())); // sessionProviderService.setSessionProvider(null, new SessionProvider(credentials)); } public void testInit() throws Exception { RegistryService regService = (RegistryService)container.getComponentInstanceOfType(RegistryService.class); assertNotNull(regService); Node regNodes = regService.getRegistry(sessionProviderService.getSessionProvider(null)).getNode(); assertNotNull(regNodes); assertTrue(regNodes.hasNode(RegistryService.EXO_SERVICES)); assertTrue(regNodes.hasNode(RegistryService.EXO_APPLICATIONS)); assertTrue(regNodes.hasNode(RegistryService.EXO_USERS)); assertTrue(regNodes.isNodeType("exo:testFirstHideable")); assertTrue(regNodes.isNodeType("exo:testSecondHideable")); assertTrue(regNodes.getNode(RegistryService.EXO_USERS).isNodeType("exo:testFirstHideable")); assertTrue(regNodes.getNode(RegistryService.EXO_USERS).isNodeType("exo:testSecondHideable")); assertTrue(regNodes.getNode(RegistryService.EXO_GROUPS).isNodeType("exo:testFirstHideable")); assertTrue(regNodes.getNode(RegistryService.EXO_GROUPS).isNodeType("exo:testSecondHideable")); assertTrue(regNodes.getNode(RegistryService.EXO_SERVICES).isNodeType("exo:testFirstHideable")); assertTrue(regNodes.getNode(RegistryService.EXO_SERVICES).isNodeType("exo:testSecondHideable")); assertTrue(regNodes.getNode(RegistryService.EXO_APPLICATIONS).isNodeType("exo:testFirstHideable")); assertTrue(regNodes.getNode(RegistryService.EXO_APPLICATIONS).isNodeType("exo:testSecondHideable")); session.getWorkspace().getNodeTypeManager().getNodeType("exo:registry"); session.getWorkspace().getNodeTypeManager().getNodeType("exo:registryEntry"); session.getWorkspace().getNodeTypeManager().getNodeType("exo:registryGroup"); } public void testRegister() throws Exception { RegistryService regService = (RegistryService)container.getComponentInstanceOfType(RegistryService.class); try { regService.getEntry(sessionProviderService.getSessionProvider(null), RegistryService.EXO_USERS + "/exo_service"); fail("ItemNotFoundException should have been thrown"); } catch (PathNotFoundException e) { // ok } regService.createEntry(sessionProviderService.getSessionProvider(null), RegistryService.EXO_USERS, RegistryEntry .parse(new ByteArrayInputStream(SERVICE_XML.getBytes()))); RegistryEntry entry = regService.getEntry(sessionProviderService.getSessionProvider(null), RegistryService.EXO_USERS + "/exo_service"); regService.recreateEntry(sessionProviderService.getSessionProvider(null), RegistryService.EXO_USERS, RegistryEntry.parse(new ByteArrayInputStream(SERVICE_XML.getBytes()))); regService.removeEntry(sessionProviderService.getSessionProvider(null), RegistryService.EXO_USERS + "/exo_service"); try { regService.getEntry(sessionProviderService.getSessionProvider(null), RegistryService.EXO_USERS + "/exo_service"); fail("ItemNotFoundException should have been thrown"); } catch (PathNotFoundException e) { // ok } } public void testRegisterToNonExistedGroup() throws Exception { RegistryService regService = (RegistryService)container.getComponentInstanceOfType(RegistryService.class); String groupPath = RegistryService.EXO_USERS + "/newGroup1/newGroup2"; String entryName = "testEntry"; try { regService.getEntry(sessionProviderService.getSessionProvider(null), groupPath + "/" + entryName); fail("ItemNotFoundException should have been thrown"); } catch (PathNotFoundException e) { // OK } // group path should have been created along with entry regService.createEntry(sessionProviderService.getSessionProvider(null), groupPath, new RegistryEntry(entryName)); RegistryEntry entry = regService.getEntry(sessionProviderService.getSessionProvider(null), groupPath + "/" + entryName); assertNotNull(entry); assertEquals(entryName, entry.getName()); } public void testRegisterFromXMLStream() throws Exception { RegistryService regService = (RegistryService)container.getComponentInstanceOfType(RegistryService.class); String groupPath = RegistryService.EXO_USERS + "/testRegisterFromXMLStream"; regService.createEntry(sessionProviderService.getSessionProvider(null), groupPath, RegistryEntry.parse(NAV_XML .getBytes())); RegistryEntry entry = regService.getEntry(sessionProviderService.getSessionProvider(null), groupPath + "/node-navigation"); assertEquals("node-navigation", entry.getName()); } public void testRegisterFromDOM() throws Exception { RegistryService regService = (RegistryService)container.getComponentInstanceOfType(RegistryService.class); String groupPath = RegistryService.EXO_USERS + "/testRegisterFromDOM"; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document document = db.parse(new ByteArrayInputStream(NAV_XML.getBytes())); regService.createEntry(sessionProviderService.getSessionProvider(null), groupPath, new RegistryEntry(document)); RegistryEntry entry = regService.getEntry(sessionProviderService.getSessionProvider(null), groupPath + "/node-navigation"); assertEquals("node-navigation", entry.getName()); } public void testLocation() throws Exception { RegistryService regService = (RegistryService)container.getComponentInstanceOfType(RegistryService.class); regService.addRegistryLocation("wrong", "wrong"); } /** * author : Trong.Tran */ public void testStoreAndReadXML() throws Exception { String category = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<category name1=\"the_value\" name2=\"the_xvalue\"></category>"; RegistryService regService = (RegistryService)container.getComponentInstanceOfType(RegistryService.class); String groupPath = RegistryService.EXO_USERS + "/testStoreAndReadXML"; regService.createEntry(sessionProviderService.getSessionProvider(null), groupPath, RegistryEntry.parse(category .getBytes())); RegistryEntry entry = regService.getEntry(sessionProviderService.getSessionProvider(null), groupPath + "/category"); assertEquals("the_value", entry.getDocument().getDocumentElement().getAttribute("name1")); // Note : the value with "_x" assertEquals("the_xvalue", entry.getDocument().getDocumentElement().getAttribute("name2")); } public void testCreateEntry() throws Exception { RegistryService regService = (RegistryService)container.getComponentInstanceOfType(RegistryService.class); String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<CategoryData xmlns:exo=\"http://www.exoplatform.com/jcr/exo/1.0\" " + "xmlns:jcr=\"http://www.jcp.org/jcr/1.0\"/>"; String[] groups = new String[]{"aaa", "bbb", "aAaA", "bBbB", "AAA", "BBB", "aaaa"}; for (String g : groups) { String path = RegistryService.EXO_APPLICATIONS + "/ApplicationRegistry" + "/" + g; regService.createEntry(sessionProviderService.getSessionProvider(null), path, RegistryEntry.parse(xml .getBytes())); } } /** * Throws exception when recreates entry continuous **/ public void testRecreateEntryContinuous() throws Exception { RegistryService regService = (RegistryService)container.getComponentInstanceOfType(RegistryService.class); String groupPath = RegistryService.EXO_USERS + "/navigations"; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document document = db.parse(new ByteArrayInputStream(NAV_XML.getBytes())); // Creates entry regService.createEntry(sessionProviderService.getSessionProvider(null), groupPath, new RegistryEntry(document)); // Re-creates entry continuous // FIXME Wrong test, Session should be dedicated to the Thread, see JCR-765 // for (int i = 0; i < 20; i++) { // new Thread(new Recreater(container, sessionProviderService.getSessionProvider(null), // document)).start(); // } } static public class Recreater implements Runnable { StandaloneContainer container; SessionProvider sessionProvider; Document document; public Recreater(StandaloneContainer container, SessionProvider sessionProvider, Document document) { this.container = container; this.sessionProvider = sessionProvider; this.document = document; } public void run() { RegistryService regService = (RegistryService)container.getComponentInstanceOfType(RegistryService.class); String groupPath = RegistryService.EXO_USERS + "/navigations"; try { regService.recreateEntry(sessionProvider, groupPath, new RegistryEntry(document)); } catch (RepositoryException e) { e.printStackTrace(); } } } }