UISavedSearches.java
/*
* 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.ecm.webui.component.explorer.sidebar;
import java.util.ArrayList;
import java.util.List;
import javax.jcr.AccessDeniedException;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.query.Query;
import org.exoplatform.ecm.utils.text.Text;
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.search.UIContentNameSearch;
import org.exoplatform.ecm.webui.component.explorer.search.UIECMSearch;
import org.exoplatform.ecm.webui.component.explorer.search.UISavedQuery;
import org.exoplatform.ecm.webui.component.explorer.search.UISearchResult;
import org.exoplatform.ecm.webui.component.explorer.search.UISimpleSearch;
import org.exoplatform.portal.webui.util.Util;
import org.exoplatform.services.cms.queries.QueryService;
import org.exoplatform.services.wcm.utils.WCMCoreUtils;
import org.exoplatform.web.application.ApplicationMessage;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.application.portlet.PortletRequestContext;
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.UIComponent;
import org.exoplatform.webui.core.UIPopupContainer;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
/**
* Created by The eXo Platform SARL
* Author : Dang Van Minh
* minh.dang@exoplatform.com
* Oct 23, 2009
* 4:01:53 AM
*/
@ComponentConfig(
template = "app:/groovy/webui/component/explorer/sidebar/UISavedSearches.gtmpl",
events = {
@EventConfig(listeners = UISavedSearches.ExecuteActionListener.class),
@EventConfig(listeners = UISavedSearches.AdvanceSearchActionListener.class),
@EventConfig(listeners = UISavedSearches.SavedQueriesActionListener.class)
}
)
public class UISavedSearches extends UIComponent {
public final static String ACTION_TAXONOMY = "exo:taxonomyAction";
public final static String EXO_TARGETPATH = "exo:targetPath";
public final static String EXO_TARGETWORKSPACE = "exo:targetWorkspace";
private String queryPath;
public UISavedSearches() throws Exception {
}
public List<Object> queryList() throws Exception {
List<Object> objectList = new ArrayList<Object>();
List<Node> sharedQueries = getSharedQueries();
if(!sharedQueries.isEmpty()) {
for(Node node : sharedQueries) {
objectList.add(new NodeData(node));
}
}
List<Query> queries = getQueries();
if(!queries.isEmpty()) {
for(Query query : queries) {
objectList.add(new QueryData(query));
}
}
return objectList;
}
public String getCurrentUserId() { return Util.getPortalRequestContext().getRemoteUser();}
public List<Query> getQueries() throws Exception {
QueryService queryService = getApplicationComponent(QueryService.class);
try {
return queryService.getQueries(getCurrentUserId(), WCMCoreUtils.getUserSessionProvider());
} catch(AccessDeniedException ace) {
return new ArrayList<Query>();
}
}
public List<Node> getSharedQueries() throws Exception {
PortletRequestContext pcontext = (PortletRequestContext)WebuiRequestContext.getCurrentInstance();
QueryService queryService = getApplicationComponent(QueryService.class);
String userId = pcontext.getRemoteUser();
return queryService.getSharedQueries(userId, WCMCoreUtils.getSystemSessionProvider());
}
public void setQueryPath(String queryPath) throws Exception {
this.queryPath = queryPath;
}
public String getQueryPath() throws Exception {
return this.queryPath;
}
static public class ExecuteActionListener extends EventListener<UISavedSearches> {
public void execute(Event<UISavedSearches> event) throws Exception {
UISavedSearches uiSavedSearches = event.getSource();
UIJCRExplorer uiExplorer = uiSavedSearches.getAncestorOfType(UIJCRExplorer.class);
String queryPath = event.getRequestContext().getRequestParameter(OBJECTID);
uiSavedSearches.setQueryPath(queryPath);
uiExplorer.setPathToAddressBar(Text.unescapeIllegalJcrChars(
uiExplorer.filterPath(queryPath)));
String wsName = uiSavedSearches.getAncestorOfType(UIJCRExplorer.class).getCurrentWorkspace();
UIApplication uiApp = uiSavedSearches.getAncestorOfType(UIApplication.class);
QueryService queryService = uiSavedSearches.getApplicationComponent(QueryService.class);
UIWorkingArea uiWorkingArea = uiExplorer.getChild(UIWorkingArea.class);
UIComponent uiSearch = uiWorkingArea.getChild(UIDocumentWorkspace.class);
UIDrivesArea uiDrivesArea = uiWorkingArea.getChild(UIDrivesArea.class);
UISearchResult uiSearchResult = ((UIDocumentWorkspace)uiSearch).getChild(UISearchResult.class);
Query query = null;
try {
query = queryService.getQuery(queryPath,
wsName,
WCMCoreUtils.getSystemSessionProvider(),
uiSavedSearches.getCurrentUserId());
query.execute();
} catch(Exception e) {
uiApp.addMessage(new ApplicationMessage("UISearchResult.msg.query-invalid", null,
ApplicationMessage.WARNING));
} finally {
uiSearchResult.setQuery(query.getStatement(), wsName, query.getLanguage(), false, null);
uiSearchResult.updateGrid();
}
if (uiDrivesArea != null) uiDrivesArea.setRendered(false);
uiWorkingArea.getChild(UIDocumentWorkspace.class).setRendered(true);
((UIDocumentWorkspace)uiSearch).setRenderedChild(UISearchResult.class);
}
}
static public class AdvanceSearchActionListener extends EventListener<UISavedSearches> {
public void execute(Event<UISavedSearches> event) throws Exception {
UIJCRExplorer uiJCRExplorer = event.getSource().getAncestorOfType(UIJCRExplorer.class);
UIPopupContainer UIPopupContainer = uiJCRExplorer.getChild(UIPopupContainer.class);
UIECMSearch uiECMSearch = event.getSource().createUIComponent(UIECMSearch.class, null, null);
UIContentNameSearch contentNameSearch = uiECMSearch.findFirstComponentOfType(UIContentNameSearch.class);
String currentNodePath = uiJCRExplorer.getCurrentNode().getPath();
contentNameSearch.setLocation(currentNodePath);
UISimpleSearch uiSimpleSearch = uiECMSearch.findFirstComponentOfType(UISimpleSearch.class);
uiSimpleSearch.getUIFormInputInfo(UISimpleSearch.NODE_PATH).setValue(currentNodePath);
UIPopupContainer.activate(uiECMSearch, 700, 500, false);
event.getRequestContext().addUIComponentToUpdateByAjax(UIPopupContainer);
}
}
static public class SavedQueriesActionListener extends EventListener<UISavedSearches> {
public void execute(Event<UISavedSearches> event) throws Exception {
UIJCRExplorer uiJCRExplorer = event.getSource().getAncestorOfType(UIJCRExplorer.class);
UIPopupContainer UIPopupContainer = uiJCRExplorer.getChild(UIPopupContainer.class);
UISavedQuery uiSavedQuery = event.getSource().createUIComponent(UISavedQuery.class, null, null);
uiSavedQuery.setIsQuickSearch(true);
uiSavedQuery.updateGrid(1);
UIPopupContainer.activate(uiSavedQuery, 700, 400);
event.getRequestContext().addUIComponentToUpdateByAjax(UIPopupContainer);
}
}
public class QueryData {
private String storedQueryPath_;
public QueryData(Query query) {
try {
storedQueryPath_ = query.getStoredQueryPath();
} catch (RepositoryException e) {
storedQueryPath_ = "";
}
}
public String getStoredQueryPath() {
return storedQueryPath_;
}
public void setStoredQueryPath(String storedQueryPath) {
storedQueryPath_ = storedQueryPath;
}
}
public class NodeData {
private String path_;
private String name_;
public NodeData(Node node) throws RepositoryException {
this.path_ = node.getPath();
this.name_ = node.getName();
}
public String getPath() {
return path_;
}
public void setPath(String path) {
path_ = path;
}
public String getName() {
return name_;
}
public void setName(String name) {
name_ = name;
}
}
}