/* * Copyright (C) 2003-2008 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.jcr.usecases.query; import org.exoplatform.services.jcr.core.nodetype.ExtendedNodeTypeManager; import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager; import org.exoplatform.services.jcr.usecases.BaseUsecasesTest; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.util.GregorianCalendar; import javax.jcr.NamespaceException; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.query.Query; import javax.jcr.query.QueryResult; /** * Created by The eXo Platform SARL Author : Pham Xuan Hoa hoa.pham@exoplatform.com Jan 16, 2008 */ public class TestQueryMixinNodeTypes extends BaseUsecasesTest { public void testQueryMixinNodeTypes() throws Exception { registerNodetypes(); Node testFolder = root.addNode("testFolder", "nt:unstructured"); root.save(); // add an exo:article Node article = testFolder.addNode("myArticle", "exo:article"); article.setProperty("exo:title", "title"); article.setProperty("exo:summary", "article summary"); article.setProperty("exo:text", "article content"); article.addMixin("exo:datetime"); article.setProperty("exo:dateCreated", new GregorianCalendar()); article.setProperty("exo:dateModified", new GregorianCalendar()); article.addMixin("mix:commentable"); article.addMixin("mix:i18n"); article.addMixin("exo:owneable"); article.addMixin("mix:votable"); session.save(); Session systemSession = repositoryService.getCurrentRepository().getSystemSession(WORKSPACE); Node articleNode = (Node)systemSession.getItem("/testFolder/myArticle"); articleNode.addMixin("exo:publishingState"); articleNode.setProperty("exo:currentState", "Validating"); articleNode.addMixin("exo:validationRequest"); systemSession.save(); systemSession.logout(); Session session1 = repositoryService.getCurrentRepository().getSystemSession(WORKSPACE); Node testArticle = (Node)session1.getItem("/testFolder/myArticle"); assertTrue(testArticle.isNodeType("exo:datetime")); assertTrue(testArticle.isNodeType("exo:publishingState")); assertTrue(testArticle.getProperty("exo:currentState").getString().equals("Validating")); String datetimeStatement = "//element(*,exo:datetime)"; Query query = session1.getWorkspace().getQueryManager().createQuery(datetimeStatement, Query.XPATH); QueryResult result = query.execute(); NodeIterator resNodes = result.getNodes(); int nodesFound = 0; while (resNodes.hasNext()) { nodesFound++; resNodes.nextNode(); } assertEquals("The search should find one node. Result size = " + resNodes.getSize() + ", actual = " + nodesFound, 1, nodesFound); // Please try with both statements // String stateStatement = // "//element(*,exo:publishingState)[@exo:currentState='Validating']"; String stateStatement = "//element(*,exo:publishingState)"; Query stateQuery = session1.getWorkspace().getQueryManager().createQuery(stateStatement, Query.XPATH); QueryResult result1 = stateQuery.execute(); assertEquals(1, result1.getNodes().getSize()); } private void registerNodetypes() throws Exception { registerNamespace("kfx", "http://www.exoplatform.com/jcr/kfx/1.1/"); registerNamespace("dc", "http://purl.org/dc/elements/1.1/"); InputStream xml = this.getClass().getResourceAsStream("/org/exoplatform/services/jcr/usecases/query/ext-nodetypes-config.xml"); repositoryService.getCurrentRepository().getNodeTypeManager() .registerNodeTypes(xml, ExtendedNodeTypeManager.IGNORE_IF_EXISTS, NodeTypeDataManager.TEXT_XML); InputStream xml1 = this.getClass().getResourceAsStream("/org/exoplatform/services/jcr/usecases/query/nodetypes-config.xml"); repositoryService.getCurrentRepository().getNodeTypeManager() .registerNodeTypes(xml1, ExtendedNodeTypeManager.IGNORE_IF_EXISTS, NodeTypeDataManager.TEXT_XML); InputStream xml2 = this.getClass().getResourceAsStream( "/org/exoplatform/services/jcr/usecases/query/nodetypes-config-extended.xml"); repositoryService.getCurrentRepository().getNodeTypeManager() .registerNodeTypes(xml2, ExtendedNodeTypeManager.IGNORE_IF_EXISTS, NodeTypeDataManager.TEXT_XML); InputStream xml3 = this.getClass().getResourceAsStream("/org/exoplatform/services/jcr/usecases/query/nodetypes-ecm.xml"); repositoryService.getCurrentRepository().getNodeTypeManager() .registerNodeTypes(xml3, ExtendedNodeTypeManager.IGNORE_IF_EXISTS, NodeTypeDataManager.TEXT_XML); InputStream xml4 = this.getClass().getResourceAsStream( "/org/exoplatform/services/jcr/usecases/query/business-process-nodetypes.xml"); repositoryService.getCurrentRepository().getNodeTypeManager() .registerNodeTypes(xml4, ExtendedNodeTypeManager.IGNORE_IF_EXISTS, NodeTypeDataManager.TEXT_XML); } public void registerNamespace(String prefix, String uri) { try { session.getWorkspace().getNamespaceRegistry().getPrefix(uri); } catch (NamespaceException e) { try { session.getWorkspace().getNamespaceRegistry().registerNamespace(prefix, uri); } catch (NamespaceException e1) { throw new RuntimeException(e1); } catch (RepositoryException e1) { throw new RuntimeException(e1); } } catch (RepositoryException e) { throw new RuntimeException(e); } } private ByteArrayInputStream readXmlContent(String fileName) { try { InputStream is = TestQueryMixinNodeTypes.class.getResourceAsStream(fileName); ByteArrayOutputStream output = new ByteArrayOutputStream(); int r = is.available(); byte[] bs = new byte[r]; while (r > 0) { r = is.read(bs); if (r > 0) { output.write(bs, 0, r); } r = is.available(); } is.close(); return new ByteArrayInputStream(output.toByteArray()); } catch (Exception ex) { ex.printStackTrace(); return null; } } }