/* * Copyright (C) 2003-2009 eXo Platform SAS. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see<http://www.gnu.org/licenses/>. */ package org.exoplatform.services.ecm.dms.queries; import java.util.List; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.PathNotFoundException; import javax.jcr.Session; import javax.jcr.query.Query; import javax.jcr.query.QueryResult; import org.exoplatform.services.cms.BasePath; import org.exoplatform.services.cms.queries.QueryService; import org.exoplatform.services.jcr.ext.common.SessionProvider; import org.exoplatform.services.jcr.ext.hierarchy.NodeHierarchyCreator; import org.exoplatform.services.wcm.BaseWCMTestCase; /** * Created by The eXo Platform SARL Author : Ly Dinh Quang * quang.ly@exoplatform.com xxx5669@gmail.com Jun 12, 2009 */ public class TestQueryService extends BaseWCMTestCase { private QueryService queryService; private NodeHierarchyCreator nodeHierarchyCreator; private String baseUserPath; private String baseQueriesPath; private String relativePath = "Private/Searches"; private static final String[] USERS = {"john", "root", "demo"}; public void setUp() throws Exception { super.setUp(); queryService = (QueryService) container.getComponentInstanceOfType(QueryService.class); nodeHierarchyCreator = (NodeHierarchyCreator) container .getComponentInstanceOfType(NodeHierarchyCreator.class); baseUserPath = nodeHierarchyCreator.getJcrPath(BasePath.CMS_USERS_PATH); baseQueriesPath = nodeHierarchyCreator.getJcrPath(BasePath.QUERIES_PATH); applySystemSession(); } /** * Init all query plugin by giving the following params : repository * Input: * Init three param which is configured in test-queries-configuration.xml * Expect: * Size of list node = 3, contains CreatedDocuments node, CreatedDocumentsDayBefore node, * AllArticles node * @throws Exception */ public void testInit() throws Exception { Session mySession = sessionProviderService_.getSystemSessionProvider(null).getSession(DMSSYSTEM_WS, repository); Node queriesHome = (Node) mySession.getItem(baseQueriesPath); assertEquals(queriesHome.getNodes().getSize(), 3); assertNotNull(queriesHome.getNode("Created Documents")); assertNotNull(queriesHome.getNode("CreatedDocumentDayBefore")); assertNotNull(queriesHome.getNode("All Articles")); } /** * Add new query by giving the following params : queryName, statement, * language, userName, repository * Input: * queryName = "QueryAll"; statement = "Select * from nt:base"; language = "sql"; * userName = "root"; repository = "repository"; * Expect: * node: name = "QueryAll" not null; * @throws Exception */ public void testAddQuery() throws Exception { queryService.addQuery("QueryAll", "Select * from nt:base", "sql", "root"); Node userNode = nodeHierarchyCreator.getUserNode(sessionProvider, "root"); String userPath = userNode.getPath() + "/" + relativePath; Node nodeSearch = (Node) session.getItem(userPath); Node queryAll = nodeSearch.getNode("QueryAll"); assertNotNull(queryAll); } public void testGetQuery() throws Exception { queryService.addQuery("QueryAll", "Select * from nt:base", "sql", "john"); Node userNode = nodeHierarchyCreator.getUserNode(sessionProvider, "john"); String queryPath = userNode.getPath() + "/" + relativePath + "/QueryAll"; assertNotNull(queryService.getQuery(queryPath, COLLABORATION_WS, sessionProvider, "john")); } /** * Get queries by giving the following params : userName, repository, provider * Input: * 1. Add 2 query node to test * 1.1 queryName = "QueryAll1"; statement = "Select * from nt:base"; language = "sql"; * userName = "root"; repository = "repository"; * 1.2 queryName = "QueryAll2"; statement = "//element(*, exo:article)"; language = "xpath"; * userName = "root"; repository = "repository"; * Input: userName = "root", repository = "repository", provider = sessionProvider * Expect: Size of list node = 2 * Input: userName = "marry", repository = "repository", provider = sessionProvider * Expect: Size of list node = 0 * Input: userName = null, repository = "repository", provider = sessionProvider * Expect: Size of list node = 0 * @throws Exception */ public void testGetQueries() throws Exception { SessionProvider sessionProvider = sessionProviderService_.getSystemSessionProvider(null); queryService.addQuery("QueryAll1", "Select * from nt:base", "sql", "root"); queryService.addQuery("QueryAll2", "//element(*, exo:article)", "xpath", "root"); List<Query> listQueryRoot = queryService.getQueries("root", sessionProvider); assertEquals(listQueryRoot.size(), 2); List<Query> listQueryMarry = queryService.getQueries("marry", sessionProvider); assertEquals(listQueryMarry.size(), 0); List<Query> listQueryNull = queryService.getQueries(null, sessionProvider); assertEquals(listQueryNull.size(), 0); List<Query> listQueryAno = queryService.getQueries("ano", sessionProvider); assertEquals(listQueryAno.size(), 0); } /** * Remove query by giving the following params : queryPath, userName, repository * Input: * 1. Add 2 query node to test * 1.1 queryName = "QueryAll1"; statement = "Select * from nt:base"; language = "sql"; * userName = "root"; repository = "repository"; * 1.2 queryName = "QueryAll2"; statement = "//element(*, exo:article)"; language = "xpath"; * userName = "root"; repository = "repository"; * Input: * queryPath = "/Users/root/Private/Searches/QueryAll1", userName = "root", * repository = "repository" * Expect: * node: name = "QueryAll1" is removed * Input: * queryPath = "/Users/marry/Private/Searches/QueryAll2", userName = "marry", * repository = "repository" * Expect: * exception: Query path not found! * @throws Exception */ public void testRemoveQuery() throws Exception { SessionProvider sessionProvider = sessionProviderService_.getSystemSessionProvider(null); queryService.addQuery("QueryAll1", "Select * from nt:base", "sql", "root"); List<Query> listQuery = queryService.getQueries("root", sessionProvider); assertEquals(listQuery.size(), 1); Node userNode = nodeHierarchyCreator.getUserNode(sessionProvider, "root"); String queryPathRoot = userNode.getPath() + "/" + relativePath + "/QueryAll1"; queryService.removeQuery(queryPathRoot, "root"); listQuery = queryService.getQueries("root", sessionProvider); assertEquals(listQuery.size(), 0); } /** * Get query with path by giving the following params : queryPath, userName, repository, provider * Input: * 1. Add 2 query node to test * 1.1 queryName = "QueryAll1"; statement = "Select * from nt:base"; language = "sql"; * userName = "root"; repository = "repository"; * 1.2 queryName = "QueryAll2"; statement = "//element(*, exo:article)"; language = "xpath"; * userName = "root"; repository = "repository"; * Input: * queryPath = "/Users/root/Private/Searches/QueryAll1", userName = "root", * repository = "repository" * Expect: * node: name = "QueryAll1" is not null * Input: * queryPath = "/Users/root/Private/Searches/QueryAll3", userName = "root", * repository = "repository" * Expect: * node: query node is null * @throws Exception */ public void testGetQueryByPath() throws Exception { SessionProvider sessionProvider = sessionProviderService_.getSystemSessionProvider(null); Node userNode = nodeHierarchyCreator.getUserNode(sessionProvider, "root"); queryService.addQuery("QueryAll1", "Select * from nt:base", "sql", "root"); queryService.addQuery("QueryAll2", "//element(*, exo:article)", "xpath", "root"); String queryPath1 = userNode.getPath() + "/" + relativePath + "/QueryAll1"; Query query = queryService.getQueryByPath(queryPath1, "root", sessionProvider); assertNotNull(query); assertEquals(query.getStatement(), "Select * from nt:base"); String queryPath2 = userNode.getPath() + "/" + relativePath + "/QueryAll3"; query = queryService.getQueryByPath(queryPath2, "root", sessionProvider); assertNull(query); } /** * Add new shared query by giving the following params: queryName, statement, language, * permissions, cachedResult, repository * Input: * queryName = "QueryAll1", statement = "Select * from nt:base", language = "sql", * permissions = { "*:/platform/administrators" }, cachedResult = false, repository = "repository" * Expect: * node: name = "QueryAll1" is not null * Value of property * jcr:language = sql, jcr:statement = Select * from nt:base, exo:cachedResult = false, * exo:accessPermissions = *:/platform/administrators * @throws Exception */ public void testAddSharedQuery() throws Exception { Session mySession = sessionProviderService_.getSystemSessionProvider(null).getSession(DMSSYSTEM_WS, repository); queryService.addSharedQuery("QueryAll1", "Select * from nt:base", "sql", new String[] { "*:/platform/administrators" }, false, sessionProviderService_.getSystemSessionProvider(null)); Node queriesHome = (Node) mySession.getItem(baseQueriesPath); Node queryAll1 = queriesHome.getNode("QueryAll1"); assertNotNull(queryAll1); assertEquals(queryAll1.getProperty("jcr:language").getString(), "sql"); assertEquals(queryAll1.getProperty("jcr:statement").getString(), "Select * from nt:base"); assertEquals(queryAll1.getProperty("exo:cachedResult").getBoolean(), false); assertEquals(queryAll1.getProperty("exo:accessPermissions").getValues()[0].getString(), "*:/platform/administrators"); queryService.addSharedQuery("QueryAll1", "//element(*, nt:base)", "xpath", new String[] { "*:/platform/administrators" }, false, sessionProvider); queryAll1 = queriesHome.getNode("QueryAll1"); assertNotNull(queryAll1); assertEquals(queryAll1.getProperty("jcr:language").getString(), "xpath"); assertEquals(queryAll1.getProperty("jcr:statement").getString(), "//element(*, nt:base)"); assertEquals(queryAll1.getProperty("exo:cachedResult").getBoolean(), false); assertEquals(queryAll1.getProperty("exo:accessPermissions").getValues()[0].getString(), "*:/platform/administrators"); queryAll1.remove(); queriesHome.save(); } /** * Get shared queries by giving the following params : userId, repository, provider * Input: * 1. Add a shared query node * queryName = "QueryAll1", statement = "Select * from nt:base", language = "sql", * permissions = { "*:/platform/administrators" }, cachedResult = false, * repository = "repository" * Expect: * node: name = "QueryAll1" is not null * Value of property * jcr:language = sql, jcr:statement = Select * from nt:base, exo:cachedResult = false, * exo:accessPermissions = *:/platform/administrators * @throws Exception */ public void testGetSharedQuery() throws Exception { SessionProvider sessionProvider = sessionProviderService_.getSystemSessionProvider(null); queryService.addSharedQuery("QueryAll1", "Select * from nt:base", "sql", new String[] { "*:/platform/administrators" }, false, sessionProvider); Node nodeQuery = queryService.getSharedQuery("QueryAll1", sessionProvider); assertNotNull(nodeQuery); assertEquals(nodeQuery.getProperty("jcr:language").getString(), "sql"); assertEquals(nodeQuery.getProperty("jcr:statement").getString(), "Select * from nt:base"); assertEquals(nodeQuery.getProperty("exo:cachedResult").getBoolean(), false); assertEquals(nodeQuery.getProperty("exo:accessPermissions").getValues()[0].getString(), "*:/platform/administrators"); Node queriesHome = (Node) sessionProvider.getSession(DMSSYSTEM_WS, repository).getItem(baseQueriesPath); queriesHome.getNode("QueryAll1").remove(); queriesHome.save(); } /** * Remove share query by giving the following params : queryName, repository * Input: * 1. Add a shared query node * queryName = "QueryAll1", statement = "Select * from nt:base", language = "sql", * permissions = { "*:/platform/administrators" }, cachedResult = false, * repository = "repository" * Input: * queryName = "QueryAll2", repository = "repository" * Expect: * exception: Query Path not found! * Input: * queryName = "QueryAll1", repository = "repository" * Expect: * node: name = "QueryAll1" is removed * @throws Exception */ public void testRemoveSharedQuery() throws Exception { queryService.addSharedQuery("QueryAll1", "Select * from nt:base", "sql", new String[] { "*:/platform/administrators" }, false, sessionProvider); queryService.removeSharedQuery("QueryAll1", sessionProvider); Node nodeQuery = queryService.getSharedQuery("QueryAll1", sessionProvider); assertNull(nodeQuery); } /** * Get shared queries * Input: * 1. Add two shared query node * 1.1 queryName = "QueryAll1", statement = "Select * from nt:base", language = "sql", * permissions = { "*:/platform/administrators" }, cachedResult = false, * repository = "repository" * 1.2 queryName = "QueryAll2", statement = "//element(*, exo:article)", language = "xpath", * permissions = { "*:/platform/users" }, cachedResult = true, repository = "repository" * Input: * repository = "repository", provider = sessionProvider * Expect: * Size of listNode = 2, contains QueryAll1 and QueryAll2 node * Input: * userId = "root", repository = "repository", provider = sessionProvider * Expect: * Size of listNode = 2, contains QueryAll1 and QueryAll2 node * Input: * userId = "marry", repository = "repository", provider = sessionProvider * Expect: * Size of listNode = 1, contains QueryAll2 * Input: * queryType = "sql", userId = "root", repository = "repository", provider = sessionProvider * Expect: * Size of listNode = 1, contains QueryAll1 * Input: * queryType = "sql", userId = "marry", repository = "repository", provider = sessionProvider * Expect: * Size of listNode = 0 * Input: * queryType = "xpath", userId = "marry", repository = "repository", provider = sessionProvider * Expect: * Size of listNode = 1, contains QueryAll2 * @throws Exception */ public void testGetSharedQueries() throws Exception { SessionProvider sessionProvider = sessionProviderService_.getSystemSessionProvider(null); queryService.addSharedQuery("QueryAll1", "Select * from nt:base", "sql", new String[] { "*:/platform/administrators" }, false, sessionProvider); queryService.addSharedQuery("QueryAll2", "//element(*, exo:article)", "xpath", new String[] { "*:/platform/users" }, true, sessionProvider); List<Node> listQuery = queryService.getSharedQueries(sessionProvider); assertEquals(listQuery.size(), 5); listQuery = queryService.getSharedQueries("demo", sessionProvider); assertEquals(listQuery.size(), 4); listQuery = queryService.getSharedQueries("xpath", "demo", sessionProvider); assertEquals(listQuery.size(), 4); Node queriesHome = (Node) sessionProvider.getSession(DMSSYSTEM_WS, repository).getItem(baseQueriesPath); queriesHome.getNode("QueryAll1").remove(); queriesHome.getNode("QueryAll2").remove(); queriesHome.save(); } /** * Execute query by giving the following params : queryPath, workspace, repository, * provider, userId * Input: * 1. Add two shared query node * 1.1 queryName = "QueryAll1", statement = * "Select * from nt:base where jcr:path like '/exo:ecm/queries/%'", language = "sql", * permissions = { "*:/platform/administrators" }, cachedResult = false, * repository = "repository" * 1.2 queryName = "QueryAll2", statement = "//element(*, exo:article)", language = "xpath", * permissions = { "*:/platform/users" }, cachedResult = true, repository = "repository" * Input: * queryPath = "/exo:ecm/queries/QueryAll1", workspace = DMSSYSTEM_WS, * repository = "repository", provider = sessionProvider, userId = "root" * Expect: * Size of list node = 2 * Input: * queryPath = "/exo:ecm/queries/QueryAll2", workspace = DMSSYSTEM_WS, * repository = "repository", provider = sessionProvider, userId = "root" * Expect: * exception: Query Path not found! * @throws Exception */ public void testExecute() throws Exception { SessionProvider sessionProvider = sessionProviderService_.getSystemSessionProvider(null); queryService.addSharedQuery("QueryAll1", "Select * from nt:base where jcr:path like '/exo:ecm/queries/%'", "sql", new String[] { "*:/platform/administrators" }, false, sessionProvider); queryService.addSharedQuery("QueryAll2", "Select * from nt:base where jcr:path like '/exo:ecm/queries/%'", "sql", new String[] { "*:/platform/administrators" }, true, sessionProvider); String queryPath = baseQueriesPath + "/QueryAll1"; QueryResult queryResult = queryService.execute(queryPath, DMSSYSTEM_WS, sessionProvider, "root"); assertEquals(queryResult.getNodes().getSize(), 5); queryPath = baseQueriesPath + "/QueryAll2"; queryResult = queryService.execute(queryPath, DMSSYSTEM_WS, sessionProvider, "root"); assertEquals(queryResult.getNodes().getSize(), 5); Node queriesHome = (Node) sessionProvider.getSession(DMSSYSTEM_WS, repository).getItem(baseQueriesPath); queriesHome.getNode("QueryAll1").remove(); queriesHome.getNode("QueryAll2").remove(); queriesHome.save(); } public void tearDown() throws Exception { Session mySession = sessionProviderService_.getSystemSessionProvider(null).getSession(COLLABORATION_WS, repository); for (String user : USERS) { try { Node userNode = nodeHierarchyCreator.getUserNode(sessionProvider, user); String searchPaths = userNode.getPath() + "/" + relativePath; ((Node)mySession.getItem(searchPaths)).remove(); mySession.save(); } catch (PathNotFoundException e) { } } super.tearDown(); } }