UISavedQuery.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.util.ArrayList;
import java.util.List;
import javax.jcr.AccessDeniedException;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.query.Query;
import javax.jcr.query.QueryResult;
import org.exoplatform.commons.utils.LazyPageList;
import org.exoplatform.commons.utils.ListAccess;
import org.exoplatform.commons.utils.ListAccessImpl;
import org.exoplatform.ecm.webui.component.explorer.UIDocumentWorkspace;
import org.exoplatform.ecm.webui.component.explorer.UIJCRExplorer;
import org.exoplatform.ecm.webui.component.explorer.UIWorkingArea;
import org.exoplatform.portal.webui.util.Util;
import org.exoplatform.services.cms.queries.QueryService;
import org.exoplatform.services.wcm.core.NodeLocation;
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.UIContainer;
import org.exoplatform.webui.core.UIPageIterator;
import org.exoplatform.webui.core.UIPopupComponent;
import org.exoplatform.webui.core.UIPopupContainer;
import org.exoplatform.webui.core.UIPopupWindow;
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
* Jan 4, 2006
* 16:37:15
*/
@ComponentConfig(
template = "app:/groovy/webui/component/explorer/search/UISavedQuery.gtmpl",
events = {
@EventConfig(listeners = UISavedQuery.ExecuteActionListener.class),
@EventConfig(listeners = UISavedQuery.DeleteActionListener.class, confirm = "UISavedQuery.msg.confirm-delete-query"),
@EventConfig(listeners = UISavedQuery.EditActionListener.class)
}
)
public class UISavedQuery extends UIContainer implements UIPopupComponent {
final static public String EDIT_FORM = "EditSavedQueryForm";
private UIPageIterator uiPageIterator_;
private boolean isQuickSearch_ = false;
public UISavedQuery() throws Exception {
uiPageIterator_ = addChild(UIPageIterator.class, null, "SavedQueryIterator");
}
public void updateGrid(int currentPage) throws Exception {
ListAccess<Object> queryList = new ListAccessImpl<Object>(Object.class,
NodeLocation.getLocationsByNodeList(queryList()));
LazyPageList<Object> pageList = new LazyPageList<Object>(queryList, 10);
uiPageIterator_.setPageList(pageList);
if (currentPage > uiPageIterator_.getAvailablePage())
uiPageIterator_.setCurrentPage(uiPageIterator_.getAvailablePage());
else
uiPageIterator_.setCurrentPage(currentPage);
}
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(node);
}
}
List<Query> queries = getQueries();
if(!queries.isEmpty()) {
for(Query query : queries) {
objectList.add(new QueryData(query));
}
}
return objectList;
}
public UIPageIterator getUIPageIterator() { return uiPageIterator_; }
public List getQueryList() throws Exception {
return NodeLocation.getNodeListByLocationList(uiPageIterator_.getCurrentPageData());
}
public void initPopupEditForm(Query query) throws Exception {
removeChildById(EDIT_FORM);
UIPopupWindow uiPopup = addChild(UIPopupWindow.class, null, EDIT_FORM);
uiPopup.setWindowSize(500,0);
UIJCRAdvancedSearch uiJAdvancedSearch =
createUIComponent(UIJCRAdvancedSearch.class, null, "EditQueryForm");
uiJAdvancedSearch.setActions(new String[] {"Save", "Cancel"});
uiPopup.setUIComponent(uiJAdvancedSearch);
uiPopup.setRendered(true);
uiJAdvancedSearch.setIsEdit(true);
uiJAdvancedSearch.setQuery(query);
uiJAdvancedSearch.update(query);
uiPopup.setShow(true);
uiPopup.setResizable(true);
}
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 String getCurrentUserId() { return Util.getPortalRequestContext().getRemoteUser();}
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 List<Node> getSharedQueries() { return sharedQueries_; }
public void activate() { }
public void deActivate() { }
public void setIsQuickSearch(boolean isQuickSearch) { isQuickSearch_ = isQuickSearch; }
static public class ExecuteActionListener extends EventListener<UISavedQuery> {
public void execute(Event<UISavedQuery> event) throws Exception {
UISavedQuery uiQuery = event.getSource();
UIJCRExplorer uiExplorer = uiQuery.getAncestorOfType(UIJCRExplorer.class);
String wsName = uiQuery.getAncestorOfType(UIJCRExplorer.class).getCurrentWorkspace();
UIApplication uiApp = uiQuery.getAncestorOfType(UIApplication.class);
QueryService queryService = uiQuery.getApplicationComponent(QueryService.class);
String queryPath = event.getRequestContext().getRequestParameter(OBJECTID);
UIComponent uiSearch = null;
UISearchResult uiSearchResult = null;
if(uiQuery.isQuickSearch_) {
uiSearch = uiExplorer.getChild(UIWorkingArea.class).getChild(UIDocumentWorkspace.class);
uiSearchResult = ((UIDocumentWorkspace)uiSearch).getChild(UISearchResult.class);
} else {
uiSearch = uiQuery.getParent();
uiSearchResult = ((UIECMSearch)uiSearch).getChild(UISearchResult.class);
((UIECMSearch)uiSearch).setSelectedTab(uiSearchResult.getId());
}
Query query = null;
QueryResult queryResult = null;
try {
query = queryService.getQuery(queryPath,
wsName,
WCMCoreUtils.getSystemSessionProvider(),
uiQuery.getCurrentUserId());
queryResult = query.execute();
} catch(Exception e) {
uiApp.addMessage(new ApplicationMessage("UISearchResult.msg.query-invalid", null,
ApplicationMessage.WARNING));
if(!uiQuery.isQuickSearch_) ((UIECMSearch)uiSearch).setSelectedTab(uiQuery.getId());
return;
} finally {
if(queryResult == null || queryResult.getNodes().getSize() ==0) {
uiApp.addMessage(new ApplicationMessage("UISavedQuery.msg.not-result-found", null));
if(!uiQuery.isQuickSearch_) ((UIECMSearch)uiSearch).setSelectedTab(uiQuery.getId());
return;
}
uiSearchResult.setQuery(query.getStatement(), wsName, query.getLanguage(), true, null);
uiSearchResult.updateGrid();
}
if(uiQuery.isQuickSearch_) {
((UIDocumentWorkspace)uiSearch).setRenderedChild(UISearchResult.class);
UIPopupContainer uiPopup = uiExplorer.getChild(UIPopupContainer.class);
uiPopup.deActivate();
}
}
}
static public class EditActionListener extends EventListener<UISavedQuery> {
public void execute(Event<UISavedQuery> event) throws Exception {
UISavedQuery uiQuery = event.getSource();
String userName = Util.getPortalRequestContext().getRemoteUser();
QueryService queryService = uiQuery.getApplicationComponent(QueryService.class);
String queryPath = event.getRequestContext().getRequestParameter(OBJECTID);
Query query = queryService.getQueryByPath(queryPath,
userName,
WCMCoreUtils.getSystemSessionProvider());
uiQuery.initPopupEditForm(query);
if(!uiQuery.isQuickSearch_) {
UIECMSearch uiECSearch = uiQuery.getParent();
uiECSearch.setSelectedTab(uiQuery.getId());
event.getRequestContext().addUIComponentToUpdateByAjax(uiECSearch);
} else {
event.getRequestContext().addUIComponentToUpdateByAjax(uiQuery.getParent());
}
}
}
static public class DeleteActionListener extends EventListener<UISavedQuery> {
public void execute(Event<UISavedQuery> event) throws Exception {
UISavedQuery uiQuery = event.getSource();
String userName = Util.getPortalRequestContext().getRemoteUser();
QueryService queryService = uiQuery.getApplicationComponent(QueryService.class);
String path = event.getRequestContext().getRequestParameter(OBJECTID);
queryService.removeQuery(path, userName);
uiQuery.updateGrid(uiQuery.getUIPageIterator().getCurrentPage());
event.getRequestContext().addUIComponentToUpdateByAjax(uiQuery);
}
}
public class QueryData {
private String language_;
private String statement_;
private String storedQueryPath_;
public QueryData(Query query) {
language_ = query.getLanguage();
statement_ = query.getStatement();
try {
storedQueryPath_ = query.getStoredQueryPath();
} catch (RepositoryException e) {
storedQueryPath_ = "";
}
}
public String getLanguage() {
return language_;
}
public void setLanguage(String language) {
language_ = language;
}
public String getStatement() {
return statement_;
}
public void setStatement(String statement) {
statement_ = statement;
}
public String getStoredQueryPath() {
return storedQueryPath_;
}
public void setStoredQueryPath(String storedQueryPath) {
storedQueryPath_ = storedQueryPath;
}
}
}