UISearchResult.java
/*
* Copyright (C) 2003-2007 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.ecm.webui.component.explorer.search;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import javax.jcr.*;
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
import javax.jcr.query.QueryResult;
import javax.jcr.query.Row;
import org.apache.commons.lang.StringUtils;
import org.exoplatform.commons.api.search.data.SearchResult;
import org.exoplatform.ecm.jcr.model.Preference;
import org.exoplatform.ecm.webui.component.explorer.UIDocumentContainer;
import org.exoplatform.ecm.webui.component.explorer.UIDocumentWorkspace;
import org.exoplatform.ecm.webui.component.explorer.UIDrivesArea;
import org.exoplatform.ecm.webui.component.explorer.UIJCRExplorer;
import org.exoplatform.ecm.webui.component.explorer.UIWorkingArea;
import org.exoplatform.ecm.webui.component.explorer.sidebar.UISideBar;
import org.exoplatform.ecm.webui.utils.JCRExceptionManager;
import org.exoplatform.ecm.webui.utils.Utils;
import org.exoplatform.portal.webui.util.Util;
import org.exoplatform.portal.webui.workspace.UIPortalApplication;
import org.exoplatform.services.cms.BasePath;
import org.exoplatform.services.cms.folksonomy.NewFolksonomyService;
import org.exoplatform.services.cms.link.LinkManager;
import org.exoplatform.services.cms.link.LinkUtils;
import org.exoplatform.services.cms.link.NodeFinder;
import org.exoplatform.services.cms.taxonomy.TaxonomyService;
import org.exoplatform.services.cms.templates.TemplateService;
import org.exoplatform.services.jcr.RepositoryService;
import org.exoplatform.services.jcr.core.ManageableRepository;
import org.exoplatform.services.jcr.ext.hierarchy.NodeHierarchyCreator;
import org.exoplatform.services.jcr.impl.core.JCRPath;
import org.exoplatform.services.jcr.impl.core.SessionImpl;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.wcm.core.NodetypeConstant;
import org.exoplatform.services.wcm.search.QueryCriteria;
import org.exoplatform.services.wcm.search.base.AbstractPageList;
import org.exoplatform.services.wcm.search.base.NodeSearchFilter;
import org.exoplatform.services.wcm.search.base.PageListFactory;
import org.exoplatform.services.wcm.search.base.QueryData;
import org.exoplatform.services.wcm.search.base.SearchDataCreator;
import org.exoplatform.services.wcm.utils.WCMCoreUtils;
import org.exoplatform.wcm.webui.paginator.UILazyPageIterator;
import org.exoplatform.web.application.ApplicationMessage;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIApplication;
import org.exoplatform.webui.core.UIContainer;
import org.exoplatform.webui.core.UIPageIterator;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
/**
* Created by The eXo Platform SARL
* Author : Tran The Trong
* trongtt@gmail.com
* Oct 2, 2006
* 16:37:15
*
* Edited by : Dang Van Minh
* minh.dang@exoplatform.com
* Jan 5, 2007
*/
@ComponentConfig(
template = "app:/groovy/webui/component/explorer/search/UISearchResult.gtmpl",
events = {
@EventConfig(listeners = UISearchResult.ViewActionListener.class),
@EventConfig(listeners = UISearchResult.OpenFolderActionListener.class),
@EventConfig(listeners = UISearchResult.SortASCActionListener.class),
@EventConfig(listeners = UISearchResult.SortDESCActionListener.class)
}
)
public class UISearchResult extends UIContainer {
/**
* Logger.
*/
private static final Log LOG = ExoLogger.getLogger(UISearchResult.class.getName());
private QueryData queryData_;
private long searchTime_ = 0;
private UIPageIterator uiPageIterator_;
private String iconType = "";
private String iconScore = "";
static private int PAGE_SIZE = 10;
private List<String> categoryPathList = new ArrayList<String>();
private String constraintsCondition;
private String workspaceName = null;
private String currentPath = null;
private String keyword ="";
private AbstractPageList<RowData> pageList;
public List<String> getCategoryPathList() { return categoryPathList; }
public void setCategoryPathList(List<String> categoryPathListItem) {
categoryPathList = categoryPathListItem;
}
public String getConstraintsCondition() { return constraintsCondition; }
public void setConstraintsCondition(String constraintsConditionItem) {
constraintsCondition = constraintsConditionItem;
}
public UISearchResult() throws Exception {
uiPageIterator_ = addChild(UILazyPageIterator.class, null, "UISearchResultPageIterator");
}
public void setQuery(String queryStatement, String workspaceName, String language, boolean isSystemSession, String keyword) {
queryData_ = new QueryData(queryStatement, workspaceName, language, isSystemSession);
this.keyword = keyword;
}
public long getSearchTime() { return searchTime_; }
public void setSearchTime(long time) { this.searchTime_ = time; }
public String getIconType() {
return iconType;
}
public String getIconScore() {
return iconScore;
}
public void setIconScore(String iconScore) {
this.iconScore = iconScore;
}
public void setIconType(String iconType) {
this.iconType = iconType;
}
public List getCurrentList() throws Exception {
return uiPageIterator_.getCurrentPageData();
}
public DateFormat getSimpleDateFormat() {
Locale locale = Util.getUIPortal().getAncestorOfType(UIPortalApplication.class).getLocale();
return SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.SHORT, SimpleDateFormat.SHORT, locale);
}
public Session getSession() throws Exception {
return getAncestorOfType(UIJCRExplorer.class).getTargetSession();
}
public Date getDateCreated(Node node) throws Exception{
if (node.hasProperty("exo:dateCreated")) {
return node.getProperty("exo:dateCreated").getDate().getTime();
}
return new GregorianCalendar().getTime();
}
public Node getNodeByPath(String path) throws Exception {
try {
JCRPath nodePath = ((SessionImpl)getSession()).getLocationFactory().parseJCRPath(path);
return (Node)getSession().getItem(nodePath.getAsString(false));
} catch (Exception e) {
return null;
}
}
public UIPageIterator getUIPageIterator() { return uiPageIterator_; }
public void updateGrid() throws Exception {
TemplateService templateService = WCMCoreUtils.getService(TemplateService.class);
List<String> documentList = templateService.getDocumentTemplates();
UIJCRExplorer uiExplorer = getAncestorOfType(UIJCRExplorer.class);
UISideBar uiSideBar = uiExplorer.findFirstComponentOfType(UISideBar.class);
Set<String> tagPathsUsedInSearch = null;
if (uiSideBar != null && uiSideBar.isRendered()
&& StringUtils.equals(uiSideBar.getSelectedComp(), UISideBar.UI_TAG_EXPLORER)) {
tagPathsUsedInSearch = uiExplorer.getTagPaths();
}
QueryCriteria queryCriteria = new QueryCriteria();
queryCriteria.setKeyword(keyword);
queryCriteria.setSearchPath(uiExplorer.getCurrentPath());
queryCriteria.setSearchWebpage(false);
WebuiRequestContext requestContext = WebuiRequestContext.getCurrentInstance();
pageList = PageListFactory.createPageList(queryData_.getQueryStatement(),
requestContext.getLocale(),
queryData_.getWorkSpace(),
queryData_.getLanguage_(),
queryData_.isSystemSession(),
new NodeFilter(categoryPathList, tagPathsUsedInSearch, keyword, documentList),
new RowDataCreator(),
PAGE_SIZE,
0,
queryCriteria);
uiPageIterator_.setPageList(pageList);
}
private static class SearchComparator implements Comparator<RowData> {
public static final String SORT_TYPE = "NODE_TYPE";
public static final String SORT_SCORE = "JCR_SCORE";
public static final String ASC = "ASC";
public static final String DESC = "DECS";
private String sortType;
private String orderType;
public void setSortType(String value) { sortType = value; }
public void setOrderType(String value) { orderType = value; }
public int compare(RowData row1, RowData row2) {
try {
if (SORT_TYPE.equals(sortType.trim())) {
String s1 = row1.getJcrPrimaryType();
String s2 = row2.getJcrPrimaryType();
if (DESC.equals(orderType.trim())) { return s2.compareTo(s1); }
return s1.compareTo(s2);
} else if (SORT_SCORE.equals(sortType.trim())) {
Long l1 = row1.getJcrScore();
Long l2 = row2.getJcrScore();
if (DESC.equals(orderType.trim())) { return l2.compareTo(l1); }
return l1.compareTo(l2);
}
} catch (Exception e) {
if (LOG.isErrorEnabled()) {
LOG.error("Cannot compare rows", e);
}
}
return 0;
}
}
public String StriptHTML(String s) {
String[] targets = {"<div>", "</div>", "<span>", "</span>"};
for (String target : targets) {
s = s.replace(target, "");
}
return s;
}
static public class ViewActionListener extends EventListener<UISearchResult> {
public void execute(Event<UISearchResult> event) throws Exception {
UISearchResult uiSearchResult = event.getSource();
UIJCRExplorer uiExplorer = uiSearchResult.getAncestorOfType(UIJCRExplorer.class);
String path = event.getRequestContext().getRequestParameter(OBJECTID);
UIApplication uiApp = uiSearchResult.getAncestorOfType(UIApplication.class);
String workspaceName = event.getRequestContext().getRequestParameter("workspaceName");
Item item = null;
try {
Session session = uiExplorer.getSessionByWorkspace(workspaceName);
// Check if the path exists
NodeFinder nodeFinder = uiSearchResult.getApplicationComponent(NodeFinder.class);
item = nodeFinder.getItem(session, path);
} catch(PathNotFoundException pa) {
uiApp.addMessage(new ApplicationMessage("UITreeExplorer.msg.path-not-found", null,
ApplicationMessage.WARNING)) ;
return ;
} catch(ItemNotFoundException inf) {
uiApp.addMessage(new ApplicationMessage("UITreeExplorer.msg.path-not-found", null,
ApplicationMessage.WARNING)) ;
return ;
} catch(AccessDeniedException ace) {
uiApp.addMessage(new ApplicationMessage("UIDocumentInfo.msg.access-denied", null,
ApplicationMessage.WARNING)) ;
return ;
} catch(RepositoryException e) {
if (LOG.isErrorEnabled()) {
LOG.error("Repository cannot be found");
}
uiApp.addMessage(new ApplicationMessage("UITreeExplorer.msg.repository-error", null,
ApplicationMessage.WARNING)) ;
return ;
} catch (Exception e) {
JCRExceptionManager.process(uiApp, e);
return;
}
if (isInTrash(item))
return;
UIWorkingArea uiWorkingArea = uiExplorer.getChild(UIWorkingArea.class);
UIDocumentWorkspace uiDocumentWorkspace = uiWorkingArea.getChild(UIDocumentWorkspace.class);
if(!uiDocumentWorkspace.isRendered()) {
uiWorkingArea.getChild(UIDrivesArea.class).setRendered(false);
uiWorkingArea.getChild(UIDocumentWorkspace.class).setRendered(true);
}
uiExplorer.setSelectNode(workspaceName, path) ;
uiDocumentWorkspace.getChild(UIDocumentContainer.class).setRendered(true);
uiSearchResult.setRendered(false);
uiExplorer.refreshExplorer((Node)item, true);
}
private boolean isInTrash(Item item) throws RepositoryException {
return (item instanceof Node) && Utils.isInTrash((Node) item);
}
}
static public class OpenFolderActionListener extends EventListener<UISearchResult> {
public void execute(Event<UISearchResult> event) throws Exception {
UISearchResult uiSearchResult = event.getSource();
UIJCRExplorer uiExplorer = uiSearchResult.getAncestorOfType(UIJCRExplorer.class);
String path = event.getRequestContext().getRequestParameter(OBJECTID);
String folderPath = LinkUtils.getParentPath(path);
Node node = null;
try {
node = uiExplorer.getNodeByPath(folderPath, uiExplorer.getTargetSession());
} catch(AccessDeniedException ace) {
UIApplication uiApp = uiSearchResult.getAncestorOfType(UIApplication.class);
uiApp.addMessage(new ApplicationMessage("UISearchResult.msg.access-denied", null,
ApplicationMessage.WARNING));
return;
} catch(PathNotFoundException ace) {
UIApplication uiApp = uiSearchResult.getAncestorOfType(UIApplication.class);
uiApp.addMessage(new ApplicationMessage("UISearchResult.msg.access-denied", null,
ApplicationMessage.WARNING));
return;
} catch(Exception e) {
if (LOG.isErrorEnabled()) {
LOG.error("Cannot access the node at " + folderPath, e);
}
}
uiExplorer.setSelectNode(node.getSession().getWorkspace().getName(), folderPath);
uiExplorer.refreshExplorer(node, true);
}
}
static public class SortASCActionListener extends EventListener<UISearchResult> {
public void execute(Event<UISearchResult> event) throws Exception {
UISearchResult uiSearchResult = event.getSource();
String objectId = event.getRequestContext().getRequestParameter(OBJECTID);
SearchComparator comparator = new SearchComparator();
if (objectId.equals("type")) {
uiSearchResult.pageList.setSortByField(Utils.JCR_PRIMARYTYPE);
comparator.setSortType(SearchComparator.SORT_TYPE);
uiSearchResult.setIconType(Preference.BLUE_DOWN_ARROW);
uiSearchResult.setIconScore("");
} else if (objectId.equals("score")) {
uiSearchResult.pageList.setSortByField(Utils.JCR_SCORE);
comparator.setSortType(SearchComparator.SORT_SCORE);
uiSearchResult.setIconScore(Preference.BLUE_DOWN_ARROW);
uiSearchResult.setIconType("");
}
comparator.setOrderType(SearchComparator.ASC);
uiSearchResult.pageList.setComparator(comparator);
uiSearchResult.pageList.setOrder("ASC");
uiSearchResult.pageList.sortData();
event.getRequestContext().addUIComponentToUpdateByAjax(uiSearchResult.getParent());
}
}
static public class SortDESCActionListener extends EventListener<UISearchResult> {
public void execute(Event<UISearchResult> event) throws Exception {
UISearchResult uiSearchResult = event.getSource() ;
String objectId = event.getRequestContext().getRequestParameter(OBJECTID);
SearchComparator comparator = new SearchComparator();
if (objectId.equals("type")) {
uiSearchResult.pageList.setSortByField(Utils.JCR_PRIMARYTYPE);
comparator.setSortType(SearchComparator.SORT_TYPE);
uiSearchResult.setIconType(Preference.BLUE_UP_ARROW);
uiSearchResult.setIconScore("");
} else if (objectId.equals("score")) {
uiSearchResult.pageList.setSortByField(Utils.JCR_SCORE);
comparator.setSortType(SearchComparator.SORT_SCORE);
uiSearchResult.setIconScore(Preference.BLUE_UP_ARROW);
uiSearchResult.setIconType("");
}
comparator.setOrderType(SearchComparator.DESC);
uiSearchResult.pageList.setComparator(comparator);
uiSearchResult.pageList.setOrder("DESC");
uiSearchResult.pageList.sortData();
event.getRequestContext().addUIComponentToUpdateByAjax(uiSearchResult.getParent());
}
}
public static class NodeFilter implements NodeSearchFilter {
private List<String> categoryPathList;
private Set<String> tagPaths;
private TaxonomyService taxonomyService;
private NodeHierarchyCreator nodeHierarchyCreator;
private RepositoryService repositoryService;
private NewFolksonomyService folksonomyService;
private String rootTreePath;
private LinkManager linkManager = null;
private String keyword ="";
private List<String> documentTypes;
final static private String CHECK_LINK_MATCH_QUERY1 = "select * from nt:base "
+ "where jcr:path = '$0' and ( contains(*, '$1') "
+ "or lower(exo:name) like '%$2%' "
+ "or lower(exo:title) like '%$2%')";
final static private String CHECK_LINK_MATCH_QUERY2 = "select * from nt:base where jcr:path like '$0/%' "
+ "and ( contains(*, '$1') or lower(exo:name) like '%$2%' "
+ "or lower(exo:title) like '%$2%')";
public NodeFilter(List<String> categories, Set<String> tagPaths, String keyword, List<String> documentTypes) {
taxonomyService = WCMCoreUtils.getService(TaxonomyService.class);
nodeHierarchyCreator = WCMCoreUtils.getService(NodeHierarchyCreator.class);
linkManager = WCMCoreUtils.getService(LinkManager.class);
repositoryService = WCMCoreUtils.getService(RepositoryService.class);
folksonomyService = WCMCoreUtils.getService(NewFolksonomyService.class);
rootTreePath = nodeHierarchyCreator.getJcrPath(BasePath.TAXONOMIES_TREE_STORAGE_PATH);
categoryPathList = categories;
this.tagPaths = tagPaths;
this.keyword = keyword;
this.documentTypes = documentTypes;
}
public NodeFilter(List<String> categories, String keyword, List<String> documentTypes) {
taxonomyService = WCMCoreUtils.getService(TaxonomyService.class);
nodeHierarchyCreator = WCMCoreUtils.getService(NodeHierarchyCreator.class);
linkManager = WCMCoreUtils.getService(LinkManager.class);
rootTreePath = nodeHierarchyCreator.getJcrPath(BasePath.TAXONOMIES_TREE_STORAGE_PATH);
categoryPathList = categories;
this.keyword = keyword;
this.documentTypes = documentTypes;
}
public Node filterNodeToDisplay(Node node) {
try {
if (node == null || node.getPath().contains("/jcr:system/")) return null;
if (node != null) {
if ((tagPaths != null) && (tagPaths.size() > 0)) {
ManageableRepository repository = repositoryService.getCurrentRepository();
String workspaceName = repository.getConfiguration().getDefaultWorkspaceName();
if (node.isNodeType(Utils.EXO_SYMLINK)
|| ((Node) node.getAncestor(1)).isNodeType(NodetypeConstant.EXO_TRASH_FOLDER)) {
return null;
} else {
for (String tagPath : tagPaths) {
List<Node> taggedDocuments = folksonomyService.getAllDocumentsByTag(tagPath,
workspaceName,
WCMCoreUtils.getUserSessionProvider());
boolean nodeExistsInTag = false;
Iterator<Node> nodesIterator = taggedDocuments.iterator();
while (nodesIterator.hasNext() && !nodeExistsInTag) {
Node taggedNode = nodesIterator.next();
nodeExistsInTag = taggedNode.isSame(node);
}
if (!nodeExistsInTag) {
return null;
}
}
}
}
if ((categoryPathList != null) && (categoryPathList.size() > 0)){
for (String categoryPath : categoryPathList) {
int index = categoryPath.indexOf("/");
String taxonomyName = categoryPath;
String postFixTaxonomy = "";
if (index > 0) {
taxonomyName = categoryPath.substring(0, index);
postFixTaxonomy = categoryPath.substring(index + 1);
}
List<String> pathCategoriesList = new ArrayList<String>();
String searchCategory = taxonomyService.getTaxonomyTree(taxonomyName).getPath() +
("".equals(postFixTaxonomy) ? "" : "/" + postFixTaxonomy);
Node targetNode = node.isNodeType(Utils.EXO_SYMLINK) ?
linkManager.getTarget(node) : node;
List<Node> listCategories = taxonomyService.getCategories(targetNode, taxonomyName);
for (Node category : listCategories) {
pathCategoriesList.add(category.getPath());
}
if (pathCategoriesList.contains(searchCategory))
{
if (node.isNodeType(Utils.EXO_SYMLINK)) {
if (checkTargetMatch(node, keyword)) return node;
}else {
return node;
}
}
}
return null;
} else {
if (node.isNodeType(Utils.EXO_SYMLINK)) {
if (checkTargetMatch(node, keyword)) return node;
} else if (node.isNodeType(Utils.NT_RESOURCE)) {
return node.getParent();
} else if (node.isNodeType(Utils.EXO_COMMENTS)) {
return node.getParent().getParent();
} else {
return node;
}
}
}
} catch (Exception e) {
LOG.warn(e.getMessage());
}
return null;
}
/**
* Check a symlink/taxonomylink if its target matches with keyword for searching ...link
* @param symlinkNode
* @param keyword
* @return
*/
protected boolean checkTargetMatch(Node symlinkNode, String keyword) {
String queryStatement = CHECK_LINK_MATCH_QUERY1;
Session targetSession;
Node target=null;
if (keyword ==null || keyword.length()==0 ) return true;
if (linkManager==null) {
linkManager = WCMCoreUtils.getService(LinkManager.class);
}
try {
if (!linkManager.isLink(symlinkNode)) return true;
target = linkManager.getTarget(symlinkNode);
if (target == null) return false;
targetSession = target.getSession();
queryStatement = StringUtils.replace(queryStatement,"$0", target.getPath());
queryStatement = StringUtils.replace(queryStatement,"$1", keyword.replaceAll("'", "''"));
queryStatement = StringUtils.replace(queryStatement,"$2", keyword.replaceAll("'", "''").toLowerCase());
QueryManager queryManager = targetSession.getWorkspace().getQueryManager();
Query query = queryManager.createQuery(queryStatement, Query.SQL);
QueryResult queryResult = query.execute();
if ( queryResult.getNodes().getSize()>0 ) return true;
if (isFodlderDocument(target)||target.hasNode("jcr:content") ) {
queryStatement = CHECK_LINK_MATCH_QUERY2;
queryStatement = StringUtils.replace(queryStatement,"$0", target.getPath());
queryStatement = StringUtils.replace(queryStatement,"$1", keyword.replaceAll("'", "''"));
queryStatement = StringUtils.replace(queryStatement,"$2", keyword.replaceAll("'", "''").toLowerCase());
query = queryManager.createQuery(queryStatement, Query.SQL);
queryResult = query.execute();
return queryResult.getNodes().getSize()>0;
}else {
return false;
}
} catch (RepositoryException e) {
return false;
}
}
private boolean isFodlderDocument(Node node) throws RepositoryException{
if (!node.isNodeType(NodetypeConstant.NT_UNSTRUCTURED)) return false;
for (String documentType : documentTypes) {
if (node.getPrimaryNodeType().isNodeType(documentType))
return true;
}
return false;
}
}
public static class RowDataCreator implements SearchDataCreator<RowData> {
public RowData createData(Node node, Row row, SearchResult searchResult) {
return new RowData(row, node, searchResult);
}
}
public static class RowData {
private String jcrPath = "";
private String repExcerpt = "";
private long jcrScore = 0;
private String jcrPrimaryType = "";
public RowData(Row row) {
this(row, null, null);
}
public RowData(Row row, Node node, SearchResult result) {
try {
jcrPath = node != null ? node.getPath() : row.getValue("jcr:path").getString();
} catch (Exception e) {
if (LOG.isWarnEnabled()) {
LOG.warn(e.getMessage());
}
}
try {
if(row != null) {
Value rowExcerptValue = row.getValue("rep:excerpt(.)");
repExcerpt = rowExcerptValue != null ? rowExcerptValue.getString() : "";
}
if(StringUtils.isEmpty(repExcerpt) && result != null) {
repExcerpt = result.getExcerpt();
}
} catch (Exception e) {
if (LOG.isWarnEnabled()) {
LOG.warn("Cannot get excerpt of node " + jcrPath, e);
}
}
try {
if(row != null) {
Value rowScoreValue = row.getValue("jcr:score");
jcrScore = rowScoreValue != null ? rowScoreValue.getLong() : 0;
}
if(jcrScore == 0 && result != null) {
jcrScore = result.getRelevancy();
}
} catch (Exception e) {
if (LOG.isWarnEnabled()) {
LOG.warn("Cannot get excerpt of node " + jcrPath, e);
}
}
try {
if(row != null) {
Value rowPrimaryTypeValue = row.getValue("jcr:primaryType");
jcrPrimaryType = rowPrimaryTypeValue != null ? rowPrimaryTypeValue.getString() : "";
}
if(StringUtils.isEmpty(jcrPrimaryType) && result != null) {
jcrPrimaryType = node.getPrimaryNodeType().getName();
}
} catch (Exception e) {
if (LOG.isWarnEnabled()) {
LOG.warn("Cannot get excerpt of node " + jcrPath, e);
}
}
}
public String getJcrPath() {
return jcrPath;
}
public void setJcrPath(String jcrPath) {
this.jcrPath = jcrPath;
}
public String getRepExcerpt() {
return repExcerpt;
}
public void setRepExcerpt(String repExcerpt) {
this.repExcerpt = repExcerpt;
}
public long getJcrScore() {
return jcrScore;
}
public void setJcrScore(long jcrScore) {
this.jcrScore = jcrScore;
}
public String getJcrPrimaryType() {
return jcrPrimaryType;
}
public void setJcrPrimaryType(String value) {
jcrPrimaryType = value;
}
public int hashCode() {
return (jcrPath == null ? 0 : jcrPath.hashCode());
}
public boolean equals(Object o) {
if (o == null) return false;
if (! (o instanceof RowData)) return false;
RowData data = (RowData) o;
return (jcrPath == null && data.jcrPath == null || jcrPath.equals(data.jcrPath));
}
}
}