/* * Copyright (C) 2003-2013 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.exoplatform.services.wcm.search.connector; import org.exoplatform.commons.api.search.data.SearchContext; import org.exoplatform.container.xml.InitParams; import org.exoplatform.services.jcr.core.ManageableRepository; 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.ResultNode; import org.exoplatform.services.wcm.utils.WCMCoreUtils; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.Session; import java.net.URLEncoder; /** * The search should be capable to match files of the DMS. \ */ public class FileSearchServiceConnector extends BaseContentSearchServiceConnector { private static final Log LOG = ExoLogger.getLogger(FileSearchServiceConnector.class.getName()); public FileSearchServiceConnector(InitParams initParams) throws Exception { super(initParams); } /** * {@inheritDoc} */ @Override protected String[] getSearchedDocTypes() { return new String[]{NodetypeConstant.NT_FILE}; } protected String[] getNodeTypes() { return new String[]{NodetypeConstant.NT_FILE}; } /** * {@inheritDoc} * @throws RepositoryException */ @Override protected ResultNode filterNode(ResultNode node) throws RepositoryException { return node.isNodeType(NodetypeConstant.NT_FILE) ? node : null; } /** * {@inheritDoc} * @throws RepositoryException */ @Override protected String getPath(ResultNode node, SearchContext context) throws Exception { return documentService.getLinkInDocumentsApp(node.getPath()); } @Override protected String getPreviewUrl(ResultNode node, SearchContext context) throws Exception { String restContextName = WCMCoreUtils.getRestContextName(); Session session = node.getSession(); String repositoryName = ((ManageableRepository) session.getRepository()).getConfiguration().getName(); String workspaceName = node.getSession().getWorkspace().getName(); StringBuffer downloadUrl = new StringBuffer(); downloadUrl.append('/').append(restContextName).append("/jcr/"). append(WCMCoreUtils.getRepository().getConfiguration().getName()).append('/'). append(workspaceName).append(node.getPath()); // get document author String authorUsername = null; if(node.hasProperty("exo:owner")) { authorUsername = node.getProperty("exo:owner").getString(); } StringBuilder url = new StringBuilder("javascript:require(['SHARED/social-ui-activity'], function(activity) {activity.previewDoc(event, {doc:{"); if(node.isNodeType(NodetypeConstant.MIX_REFERENCEABLE)) { url.append("id:'").append(node.getUUID()).append("',"); } url.append("fileType:'").append(getFileType(node)).append("',"); url.append("title:'").append(getTitleResult(node)).append("',"); url.append("path:'").append(node.getPath()) .append("', repository:'").append(repositoryName) .append("', workspace:'").append(workspaceName) .append("', downloadUrl:'").append(downloadUrl.toString()) .append("', openUrl:'").append(documentService.getLinkInDocumentsApp(node.getPath())) .append("'}"); if(authorUsername != null) { url.append(",author:{username:'").append(authorUsername).append("'}"); } //add void(0) to make firefox execute js url.append("})});void(0);"); return url.toString(); } /** * gets the image url * @return */ @Override protected String getImageUrl(Node node) { try { String path = node.getPath().replaceAll("'", "\\\\'"); String encodedPath = URLEncoder.encode(path, "utf-8"); encodedPath = encodedPath.replaceAll ("%2F", "/"); //we won't encode the slash characters in the path String portalName = WCMCoreUtils.getPortalName(); String restContextName = WCMCoreUtils.getRestContextName(); String preferenceWS = node.getSession().getWorkspace().getName(); String thumbnailImage = "/" + restContextName + "/thumbnailImage/medium/" + WCMCoreUtils.getRepository().getConfiguration().getName() + "/" + preferenceWS + encodedPath; return thumbnailImage; } catch (Exception e) { if (LOG.isWarnEnabled()) { LOG.warn("Can not get image link", e); } return super.getImageUrl(node); } } }