/* * 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.usecases; import org.exoplatform.services.jcr.core.ManageableRepository; import org.exoplatform.services.jcr.core.nodetype.ExtendedNodeTypeManager; import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager; import java.io.InputStream; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.Value; import javax.jcr.query.Query; import javax.jcr.query.QueryManager; import javax.jcr.query.QueryResult; import javax.jcr.query.Row; import javax.jcr.query.RowIterator; /** * Created by The eXo Platform SAS Author : Ly Dinh Quang * quang.ly@exoplatform.com xxx5669@yahoo.com Aug 8, 2008 */ public class TestExcerpt extends BaseUsecasesTest { private String s1 = "Additionally there is a parameter that controls the format of the excerpt created. " + "In JCR 1.9 the default is set to" + "org.exoplatform.services.jcr.impl.core.query.lucene.DefaultHTMLExcerpt. " + "the configuration parameter for this setting is:" + "This is the test for Excerpt query"; private String string1_excerpt = "<div><span>Additionally there is a parameter that controls the format of the " + "<strong>excerpt</strong> created. In JCR 1.9 the default is set ...</span><span>" + "the configuration parameter for this setting is:This is the test for " + "<strong>Excerpt</strong> query</span></div>"; private String s2 = "It is a test for excerpt query.Searching with synonyms is integrated in the jcr:contains() " + "function and uses the same syntax " + "like synonym searches with Google. If a search " + "term is prefixed with ~ also synonyms of the search term are considered. Example:"; private String string2_excerpt = "<div><span>It is a test for <strong>excerpt</strong> query.Searching with synonyms is integrated in the jcr:contains() function and uses the same syntax like synonym searches ...</span></div>"; private String s3 = "JCR supports such features as Lucene Fuzzy Searches"; private String string3_excerpt= "<div><span></span></div>"; private Session testSession; private Node testRoot; /** * Initialization flag. */ private static boolean isInitialized = false; @Override public void initRepository() throws RepositoryException { super.initRepository(); if (!isInitialized) { ExtendedNodeTypeManager ntManager = (ExtendedNodeTypeManager)session.getWorkspace().getNodeTypeManager(); InputStream is = TestExcerpt.class.getResourceAsStream("/nodetypes/ext-registry-nodetypes.xml"); ntManager.registerNodeTypes(is, ExtendedNodeTypeManager.REPLACE_IF_EXISTS, NodeTypeDataManager.TEXT_XML); ntManager.registerNodeTypes(TestExcerpt.class .getResourceAsStream("/org/exoplatform/services/jcr/api/nodetypes/ecm/nodetypes-config.xml"), 0, NodeTypeDataManager.TEXT_XML); ntManager.registerNodeTypes(TestExcerpt.class .getResourceAsStream("/org/exoplatform/services/jcr/api/nodetypes/ecm/nodetypes-config-extended.xml"), 0, NodeTypeDataManager.TEXT_XML); isInitialized = true; } } /** * @see org.exoplatform.services.jcr.BaseStandaloneTest#setUp() */ @Override public void setUp() throws Exception { // TODO Auto-generated method stub super.setUp(); ManageableRepository db1tckRepo = repositoryService.getRepository("db1tck"); assertNotNull(db1tckRepo); testSession = db1tckRepo.login(credentials, "ws2"); testRoot = testSession.getRootNode(); } public void testExcerpt() throws Exception { for (int z = 0; z < 1; z++) { Node excerptTest = testRoot.addNode("testExcerpt"); Node node1 = excerptTest.addNode("Node1", "exo:article"); node1.setProperty("exo:title", ""); node1.setProperty("exo:text", s1); Node node2 = excerptTest.addNode("Node2", "exo:article"); node2.setProperty("exo:title", ""); node2.setProperty("exo:text", s2); Node node3 = excerptTest.addNode("Node3", "exo:article"); node3.setProperty("exo:title", ""); node3.setProperty("exo:text", s3); testSession.save(); QueryManager queryManager = testSession.getWorkspace().getQueryManager(); Query q1 = queryManager.createQuery("select exo:text, excerpt(.) from exo:article where jcr:path LIKE '" + excerptTest.getPath() + "/%' and contains(., 'excerpt') ORDER BY exo:title", Query.SQL); for (int i = 0; i < 1; i++) { checkResult(q1); } Query q2 = queryManager.createQuery("/jcr:root/" + excerptTest.getPath() + "//*[jcr:contains(., 'excerpt')]/(@exo:text|rep:excerpt(.)) order by @exo:title", Query.XPATH); for (int i = 0; i < 1; i++) { checkResult(q2); } excerptTest.remove(); testSession.save(); } } private void checkResult(Query query) throws RepositoryException { QueryResult result2 = query.execute(); RowIterator rows = result2.getRows(); assertEquals(2, rows.getSize()); for (RowIterator it = rows; it.hasNext();) { Row r = it.nextRow(); Value excerpt = r.getValue("rep:excerpt(.)"); Value text = r.getValue("exo:text"); if (text.getString().equals(s1)) { assertEquals(string1_excerpt, excerpt.getString()); } else if (text.getString().equals(s2)) { assertEquals(string2_excerpt, excerpt.getString()); } } } public void testExcerptWithEmptyProperty () throws Exception { Node node4 = testRoot.addNode("Node4", "exo:article"); node4.setProperty("exo:title", ""); node4.setProperty("exo:text", s1); testSession.save(); QueryManager queryManager = testSession.getWorkspace().getQueryManager(); Query query = queryManager.createQuery("select excerpt(.) from exo:article where " + "contains(., 'excerpt') ORDER BY exo:title", Query.SQL); QueryResult result = query.execute(); RowIterator rows = result.getRows(); for (RowIterator it = rows; it.hasNext();) { Row r = it.nextRow(); Value excerpt = r.getValue("rep:excerpt(exo:title)"); assertEquals(string3_excerpt, excerpt.getString()); } node4.remove(); testSession.save(); } public void testExcerptWithRules() throws Exception { Node node5 = testRoot.addNode("mynode", "exo:JCR_2394_1"); node5.addMixin("exo:sortable"); node5.setProperty("exo:name", "myword"); node5.setProperty("exo:title", "mydoc"); Node resourceNode = node5.addNode("exo:content", "exo:JCR_2394_2"); resourceNode.setProperty("exo:summary", "text"); resourceNode.setProperty("exo:data", s3); testSession.save(); String excerpt = getExcerpt("Fuzzy"); assertNotNull(excerpt); assertTrue(excerpt.contains("<strong>Fuzzy</strong>")); node5.remove(); testSession.save(); } public void testExcerptWithRules2() throws Exception { Node node5 = testRoot.addNode("mynode", "exo:JCR_2394_1"); node5.addMixin("exo:sortable"); node5.setProperty("exo:name", "myword"); node5.setProperty("exo:title", "mydoc"); Node resourceNode = node5.addNode("exo:content", "exo:JCR_2394_2"); resourceNode.setProperty("exo:summary", "text"); resourceNode.setProperty("exo:data", "bla bla bla bla bla bla"); testSession.save(); String excerpt = getExcerpt("myword"); assertNotNull(excerpt); assertFalse(excerpt.contains("<strong>")); excerpt = getExcerpt("text"); assertNotNull(excerpt); assertTrue(excerpt.contains("<strong>text</strong>")); node5.remove(); testSession.save(); } public void testAggregateRules() throws Exception { Node node6 = testRoot.addNode("testNode", "exo:JCR_2417"); node6.setProperty("exo:title", "test search"); Node resourceNode = node6.addNode("exo:content", "exo:JCR_2394_2"); resourceNode.setProperty("exo:summary", "text"); resourceNode.setProperty("exo:data", "bla bla bla exoplatform bla bla"); testSession.save(); QueryManager queryManager = testSession.getWorkspace().getQueryManager(); Query query = queryManager.createQuery("select * from exo:JCR_2417 where " + "contains(., 'exoplatform')", Query.SQL); QueryResult result = query.execute(); RowIterator rows = result.getRows(); assertEquals(1, rows.getSize()); node6.remove(); testSession.save(); } public void testIndexingFieldsWithoutRules() throws Exception { Node node7 = testRoot.addNode("notAllExcerptNode", "exo:JCR_2416"); node7.setProperty("exo:title", "test search indexed"); node7.setProperty("exo:fieldJCR_2416", "escapedIndex"); Node resourceNode = node7.addNode("exo:content", "exo:JCR_2394_2"); resourceNode.addMixin("exo:archiveable"); resourceNode.setProperty("exo:summary", "text"); resourceNode.setProperty("exo:data", "bla bla bla exoplatform bla bla"); resourceNode.setProperty("exo:restorePath","/Path/restorepath"); testSession.save(); QueryManager queryManager = testSession.getWorkspace().getQueryManager(); Query query = queryManager.createQuery("select * from exo:JCR_2416 where " + "exo:fieldJCR_2416='escapedIndex'", Query.SQL); QueryResult result = query.execute(); RowIterator rows = result.getRows(); assertEquals(1, rows.getSize()); query = queryManager.createQuery("select * from exo:JCR_2416 where " + "contains(., 'escapedIndex')", Query.SQL); result = query.execute(); rows = result.getRows(); assertEquals(1, rows.getSize()); //test useInExcerpt False query = queryManager.createQuery("select excerpt(.) from exo:JCR_2416 where " + "contains(., 'escapedIndex')", Query.SQL); result = query.execute(); rows = result.getRows(); Value v = rows.nextRow().getValue("rep:excerpt(.)"); String excerpt = v.getString(); assertFalse(excerpt.contains("test")); //check content in aggregate query = queryManager.createQuery("select * from exo:JCR_2416 where " + "contains(., 'exoplatform')", Query.SQL); result = query.execute(); rows = result.getRows(); assertEquals(1, rows.getSize()); //check content in associated mixin query = queryManager.createQuery("select * from exo:JCR_2416 where " + "contains(., 'restorepath')", Query.SQL); result = query.execute(); rows = result.getRows(); assertEquals(1, rows.getSize()); node7.remove(); testSession.save(); } private String getExcerpt(String term) throws RepositoryException { QueryManager queryManager = testSession.getWorkspace().getQueryManager(); Query query = queryManager.createQuery("select rep:excerpt() from exo:JCR_2394_1 where " + "contains(., '"+term+"')", Query.SQL); QueryResult result = query.execute(); RowIterator rows = result.getRows(); Value v = rows.nextRow().getValue("rep:excerpt(.)"); if (v != null) { return v.getString(); } else { return null; } } }