UIJCRAdvancedSearch.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 org.apache.commons.lang.StringUtils;
import org.exoplatform.ecm.webui.component.explorer.UIJCRExplorer;
import org.exoplatform.ecm.webui.form.validator.ECMNameValidator;
import org.exoplatform.webui.form.validator.MandatoryValidator;
import org.exoplatform.portal.webui.util.Util;
import org.exoplatform.services.cms.queries.QueryService;
import org.exoplatform.services.jcr.RepositoryService;
import org.exoplatform.services.jcr.core.ManageableRepository;
import org.exoplatform.services.security.IdentityConstants;
import org.exoplatform.services.wcm.utils.WCMCoreUtils;
import org.exoplatform.web.application.ApplicationMessage;
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.UIPopupComponent;
import org.exoplatform.webui.core.UIPopupContainer;
import org.exoplatform.webui.core.UIPopupWindow;
import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
import org.exoplatform.webui.core.model.SelectItemOption;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.Event.Phase;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.form.UIForm;
import org.exoplatform.webui.form.UIFormSelectBox;
import org.exoplatform.webui.form.UIFormStringInput;
import org.exoplatform.webui.form.UIFormTextAreaInput;
import javax.jcr.Node;
import javax.jcr.Session;
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
import java.util.ArrayList;
import java.util.List;
/**
* Created by The eXo Platform SARL
* Author : Tran The Trong
* trongtt@gmail.com
* Oct 2, 2006
* 1:55:22 PM
*/
@ComponentConfig(
lifecycle = UIFormLifecycle.class,
template = "system:/groovy/webui/form/UIForm.gtmpl",
events = {
@EventConfig(listeners = UIJCRAdvancedSearch.SaveActionListener.class),
@EventConfig(listeners = UIJCRAdvancedSearch.SearchActionListener.class, phase = Phase.DECODE),
@EventConfig(listeners = UIJCRAdvancedSearch.CancelActionListener.class, phase = Phase.DECODE),
@EventConfig(phase=Phase.DECODE, listeners = UIJCRAdvancedSearch.ChangeOptionActionListener.class)
}
)
public class UIJCRAdvancedSearch extends UIForm implements UIPopupComponent {
public static final String FIELD_NAME = "name" ;
public static final String FIELD_QUERY = "query" ;
public static final String FIELD_SELECT_BOX = "selectBox" ;
private static final String ROOT_SQL_QUERY = "select * from nt:base order by exo:dateCreated DESC" ;
private static final String SQL_QUERY = "select * from nt:base where jcr:path like '$0/%' order by exo:dateCreated DESC" ;
private static final String ROOT_XPATH_QUERY = "//* order by @exo:dateCreated descending" ;
private static final String XPATH_QUERY = "/jcr:root$0//* order by @exo:dateCreated descending" ;
private static final String CHANGE_OPTION = "ChangeOption" ;
private boolean isEdit_ = false ;
private String queryPath_ ;
private String queryStatement_;
private String queryLanguage_;
public UIJCRAdvancedSearch() throws Exception {
addUIFormInput(new UIFormStringInput(FIELD_NAME, FIELD_NAME, null).addValidator(ECMNameValidator.class)
.addValidator(MandatoryValidator.class));
List<SelectItemOption<String>> ls = new ArrayList<SelectItemOption<String>>() ;
ls.add(new SelectItemOption<String>("SQL", "sql")) ;
ls.add(new SelectItemOption<String>("xPath", "xpath")) ;
UIFormSelectBox uiSelectBox = new UIFormSelectBox(FIELD_SELECT_BOX, FIELD_SELECT_BOX, ls) ;
uiSelectBox.setOnChange("Change") ;
addUIFormInput(uiSelectBox) ;
addUIFormInput(new UIFormTextAreaInput(FIELD_QUERY, FIELD_QUERY, null)) ;
setActions(new String[]{"Search", "Save", "Cancel"}) ;
}
public void update(Query query) throws Exception {
if(query == null) {
UIJCRExplorer uiExplorer = getAncestorOfType(UIJCRExplorer.class) ;
Node selectedNode = uiExplorer.getCurrentNode() ;
String path = selectedNode.getPath() ;
String queryText = StringUtils.replace(SQL_QUERY, "$0", path) ;
if ("/".equals(path)) queryText = ROOT_SQL_QUERY ;
getUIStringInput(FIELD_NAME).setValue(null) ;
getUIStringInput(FIELD_NAME).setReadOnly(false) ;
getUIFormSelectBox(FIELD_SELECT_BOX).setOnChange(CHANGE_OPTION) ;
getUIFormSelectBox(FIELD_SELECT_BOX).setValue("sql") ;
getUIFormTextAreaInput(FIELD_QUERY).setValue(queryText) ;
} else {
String storedPath = query.getStoredQueryPath() ;
queryPath_ = storedPath ;
storedPath = storedPath.substring(storedPath.lastIndexOf("/") + 1, storedPath.length()) ;
getUIStringInput(FIELD_NAME).setValue(storedPath) ;
getUIStringInput(FIELD_NAME).setReadOnly(true);
getUIFormSelectBox(FIELD_SELECT_BOX).setOnChange(CHANGE_OPTION) ;
getUIFormSelectBox(FIELD_SELECT_BOX).setValue(query.getLanguage()) ;
getUIFormTextAreaInput(FIELD_QUERY).setValue(query.getStatement()) ;
}
}
public void setQuery(Query query) {
if (query != null) {
queryLanguage_ = query.getLanguage();
queryStatement_ = query.getStatement();
} else {
queryLanguage_ = null;
queryStatement_ = null;
}
}
public void setIsEdit(boolean isEdit) { isEdit_ = isEdit ; }
public boolean isEdit() { return isEdit_ ; }
public void activate() {}
public void deActivate() {}
static public class CancelActionListener extends EventListener<UIJCRAdvancedSearch> {
public void execute(Event<UIJCRAdvancedSearch> event) throws Exception {
UIJCRAdvancedSearch uiJAdvancedSearch = event.getSource() ;
if(uiJAdvancedSearch.isEdit_) {
UIPopupWindow uiPopup = uiJAdvancedSearch.getParent() ;
uiPopup.setShow(false) ;
uiPopup.setRendered(false) ;
event.getRequestContext().addUIComponentToUpdateByAjax(uiJAdvancedSearch.getParent()) ;
} else {
uiJAdvancedSearch.getAncestorOfType(UIPopupContainer.class).deActivate() ;
}
}
}
static public class SearchActionListener extends EventListener<UIJCRAdvancedSearch> {
public void execute(Event<UIJCRAdvancedSearch> event) throws Exception {
UIJCRAdvancedSearch uiForm = event.getSource() ;
UIJCRExplorer uiExplorer = uiForm.getAncestorOfType(UIJCRExplorer.class) ;
StringBuffer queryS = new StringBuffer();
queryS.append(uiForm.getUIFormTextAreaInput(FIELD_QUERY).getValue());
String searchType = uiForm.getUIFormSelectBox(FIELD_SELECT_BOX).getValue() ;
UIECMSearch uiSearch = uiForm.getParent() ;
long startTime = System.currentTimeMillis();
try {
if(queryS.toString().toLowerCase().indexOf("order by") < 0) {
if(searchType.equals("sql")) {
queryS.append(" order by exo:dateCreated DESC");
} else if(searchType.equals("xpath")) {
queryS.append(" order by @exo:dateCreated descending");
}
}
UISearchResult uiSearchResult = uiSearch.getChild(UISearchResult.class) ;
uiSearchResult.setQuery(queryS.toString(), uiExplorer.getTargetSession().getWorkspace().getName(), searchType,
IdentityConstants.SYSTEM.equals(WCMCoreUtils.getRemoteUser()), null);
uiSearchResult.updateGrid() ;
long time = System.currentTimeMillis() - startTime;
uiSearchResult.setSearchTime(time);
uiSearch.setSelectedTab(UIECMSearch.ADVANCED_RESULT) ;
} catch (Exception e){
UIApplication uiApp = uiForm.getAncestorOfType(UIApplication.class) ;
uiApp.addMessage(new ApplicationMessage("UIJCRAdvancedSearch.msg.invalid-queryStatement", null,
ApplicationMessage.WARNING)) ;
event.getRequestContext().addUIComponentToUpdateByAjax(uiForm);
return ;
}
}
}
static public class ChangeOptionActionListener extends EventListener<UIJCRAdvancedSearch> {
public void execute(Event<UIJCRAdvancedSearch> event) throws Exception {
UIJCRAdvancedSearch uiForm = event.getSource() ;
UIJCRExplorer uiExplorer = uiForm.getAncestorOfType(UIJCRExplorer.class) ;
String currentPath = uiExplorer.getCurrentNode().getPath() ;
String queryText = "" ;
String searchType = uiForm.getUIFormSelectBox(FIELD_SELECT_BOX).getValue() ;
if(searchType.equals(Query.SQL)){
if ("/".equals(currentPath)) queryText = ROOT_SQL_QUERY ;
else queryText = StringUtils.replace(SQL_QUERY, "$0", currentPath) ;
uiForm.getUIFormTextAreaInput(FIELD_QUERY).setValue(queryText) ;
} else {
if ("/".equals(currentPath)) queryText = ROOT_XPATH_QUERY ;
else queryText = StringUtils.replace(XPATH_QUERY, "$0", currentPath) ;
uiForm.getUIFormTextAreaInput(FIELD_QUERY).setValue(queryText) ;
}
if(uiForm.isEdit_ && uiForm.queryLanguage_ != null) {
if(searchType.equals(uiForm.queryLanguage_)) {
uiForm.getUIFormTextAreaInput(FIELD_QUERY).setValue(uiForm.queryStatement_) ;
}
}
event.getRequestContext().addUIComponentToUpdateByAjax(uiForm) ;
}
}
static public class SaveActionListener extends EventListener<UIJCRAdvancedSearch> {
public void execute(Event<UIJCRAdvancedSearch> event) throws Exception {
UIJCRAdvancedSearch uiForm = event.getSource() ;
String statement = uiForm.getUIFormTextAreaInput(FIELD_QUERY).getValue() ;
String queryLang = uiForm.getUIFormSelectBox(FIELD_SELECT_BOX).getValue() ;
UIApplication uiApp = uiForm.getAncestorOfType(UIApplication.class) ;
if(statement == null || statement.trim().length() ==0) {
uiApp.addMessage(new ApplicationMessage("UIJCRAdvancedSearch.msg.value-save-null", null,
ApplicationMessage.WARNING)) ;
event.getRequestContext().addUIComponentToUpdateByAjax(uiForm);
return ;
}
if(!uiForm.isEdit_) {
QueryService queryService = uiForm.getApplicationComponent(QueryService.class) ;
String name = uiForm.getUIStringInput(FIELD_NAME).getValue() ;
String userName = Util.getPortalRequestContext().getRemoteUser() ;
try {
queryService.addQuery(name, statement, queryLang, userName) ;
} catch(Exception e){
uiApp.addMessage(new ApplicationMessage("UIJCRAdvancedSearch.msg.save_unSuccessful", null,
ApplicationMessage.WARNING)) ;
event.getRequestContext().addUIComponentToUpdateByAjax(uiForm);
return ;
}
UIECMSearch uiSearch = uiForm.getParent() ;
uiSearch.getChild(UISavedQuery.class).updateGrid(1);
uiForm.update(null) ;
uiSearch.setSelectedTab(uiSearch.getChild(UISavedQuery.class).getId()) ;
event.getRequestContext().addUIComponentToUpdateByAjax(uiSearch) ;
} else {
UIJCRExplorer uiExplorer = uiForm.getAncestorOfType(UIJCRExplorer.class) ;
QueryManager queryManager = uiExplorer.getTargetSession().getWorkspace().getQueryManager() ;
try {
queryManager.createQuery(statement, queryLang) ;
} catch(Exception e) {
uiApp.addMessage(new ApplicationMessage("UIJCRAdvancedSearch.msg.save_unSuccessful", null,
ApplicationMessage.WARNING)) ;
event.getRequestContext().addUIComponentToUpdateByAjax(uiForm);
return ;
}
ManageableRepository repository =
uiForm.getApplicationComponent(RepositoryService.class).getRepository(uiExplorer.getRepositoryName()) ;
Session session = repository.getSystemSession(repository.getConfiguration().getDefaultWorkspaceName()) ;
Node queryNode = (Node) session.getItem(uiForm.queryPath_) ;
queryNode.setProperty("jcr:language", queryLang) ;
queryNode.setProperty("jcr:statement", statement) ;
queryNode.save() ;
session.save() ;
session.logout() ;
UISavedQuery uiSavedQuery = uiForm.getAncestorOfType(UISavedQuery.class) ;
uiSavedQuery.updateGrid(1);
uiSavedQuery.removeChildById(UISavedQuery.EDIT_FORM) ;
event.getRequestContext().addUIComponentToUpdateByAjax(uiSavedQuery.getParent()) ;
}
}
}
}