/* * 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.control ; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.jcr.AccessDeniedException; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.query.InvalidQueryException; import javax.jcr.query.Query; import org.apache.commons.lang.StringUtils; import org.exoplatform.ecm.jcr.SimpleSearchValidator; import org.exoplatform.ecm.utils.text.Text; import org.exoplatform.ecm.webui.component.explorer.UIDocumentContainer; import org.exoplatform.ecm.webui.component.explorer.UIDocumentInfo; 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.UIJCRExplorer.HistoryEntry; import org.exoplatform.ecm.webui.component.explorer.UIWorkingArea; import org.exoplatform.ecm.webui.component.explorer.search.UISearchResult; import org.exoplatform.ecm.webui.component.explorer.sidebar.UISideBar; import org.exoplatform.services.cms.link.LinkUtils; import org.exoplatform.services.jcr.core.ManageableRepository; import org.exoplatform.services.jcr.ext.common.SessionProvider; import org.exoplatform.services.security.ConversationState; import org.exoplatform.services.security.IdentityConstants; 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.lifecycle.UIFormLifecycle; 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.UIFormHiddenInput; import org.exoplatform.webui.form.UIFormStringInput; /** * Created by The eXo Platform SARL * Author : Tran The Trong * trongtt@exoplatform.com * Aug 2, 2006 */ @ComponentConfig( lifecycle = UIFormLifecycle.class, template = "app:/groovy/webui/component/explorer/control/UIAddressBar.gtmpl", events = { @EventConfig(listeners = UIAddressBar.ChangeNodeActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIAddressBar.BackActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIAddressBar.HistoryActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIAddressBar.ChangeViewActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIAddressBar.SimpleSearchActionListener.class), @EventConfig(listeners = UIAddressBar.RefreshSessionActionListener.class, phase = Phase.DECODE) } ) public class UIAddressBar extends UIForm { public static final Pattern FILE_EXPLORER_URL_SYNTAX = Pattern.compile("([^:/]+):(.*)"); public final static String WS_NAME = "workspaceName"; public final static String FIELD_ADDRESS = "address"; public final static String FIELD_ADDRESS_HIDDEN = "address_hidden"; 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 selectedViewName_; private String[] arrView_ = {}; /** The Constant MESSAGE_NOT_SUPPORT_KEYWORD. */ private final static String MESSAGE_NOT_SUPPORT_KEYWORD = "UIAddressBar.msg.keyword-not-support"; final static private String FIELD_SIMPLE_SEARCH = "simpleSearch"; final static private String ROOT_SQL_QUERY = "select * from nt:base where (not jcr:primaryType like 'nt:resource') AND" + "((jcr:primaryType like 'exo:symlink' or jcr:primaryType like 'exo:taxonomyLink')" + " OR ( contains(*, '$1') or lower(exo:name) like '%$2%' or lower(exo:summary) like '%$3%' or lower(exo:commentContent) like '%$4%')) order by exo:title ASC"; final static private String SQL_QUERY = "select * from nt:base where (not jcr:primaryType like 'nt:resource') AND jcr:path like '$0/%' AND " + "( (jcr:primaryType like 'exo:symlink' or jcr:primaryType like 'exo:taxonomyLink')" + " OR ( contains(*, '$1') or lower(exo:name) like '%$2%' or lower(exo:summary) like '%$3%' or lower(exo:commentContent) like '%$4%')) order by exo:title ASC"; public UIAddressBar() throws Exception { addUIFormInput(new UIFormStringInput(FIELD_ADDRESS, FIELD_ADDRESS, null)); addUIFormInput(new UIFormStringInput(FIELD_SIMPLE_SEARCH, FIELD_SIMPLE_SEARCH, null).addValidator(SimpleSearchValidator.class)); addUIFormInput(new UIFormHiddenInput(FIELD_ADDRESS_HIDDEN, FIELD_ADDRESS_HIDDEN, null)); } public void setViewList(List<String> viewList) { Collections.sort(viewList); arrView_ = viewList.toArray(new String[viewList.size()]); } public String[] getViewList() { return arrView_; } public void setSelectedViewName(String viewName) { selectedViewName_ = viewName; } public boolean isSelectedView(String viewName) { if(selectedViewName_ != null && selectedViewName_.equals(viewName)) return true; return false; } public String getSelectedViewName() { return selectedViewName_; } public Collection<HistoryEntry> getFullHistory() { UIJCRExplorer uiJCRExplorer = getAncestorOfType(UIJCRExplorer.class) ; return uiJCRExplorer.getHistory() ; } static public class BackActionListener extends EventListener<UIAddressBar> { public void execute(Event<UIAddressBar> event) throws Exception { UIAddressBar uiAddressBar = event.getSource() ; UIJCRExplorer uiExplorer = uiAddressBar.getAncestorOfType(UIJCRExplorer.class) ; UIApplication uiApp = uiExplorer.getAncestorOfType(UIApplication.class) ; try { 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); uiDocumentWorkspace.setRenderedChild(UIDocumentContainer.class) ; } if(uiExplorer.isViewTag() && !uiExplorer.getCurrentNode().equals(uiExplorer.getRootNode())) { uiExplorer.setSelectRootNode() ; uiExplorer.setIsViewTag(true) ; } else if(uiExplorer.isViewTag() && uiExplorer.getCurrentStateNode() != null) { uiExplorer.setIsViewTag(false) ; uiExplorer.setSelectNode(uiExplorer.getCurrentStatePath()) ; } else { String previousNodePath = uiExplorer.rewind() ; String previousWs = uiExplorer.previousWsName(); uiExplorer.setBackNodePath(previousWs, previousNodePath); if (uiExplorer.hasPaginator(previousNodePath, previousWs)) { event.getRequestContext().addUIComponentToUpdateByAjax(uiExplorer); return; } } uiExplorer.updateAjax(event) ; } catch (AccessDeniedException ade) { uiApp.addMessage(new ApplicationMessage("UIAddressBar.msg.access-denied", null, ApplicationMessage.WARNING)) ; return ; } catch (Exception e) { uiApp.addMessage(new ApplicationMessage("UIJCRExplorer.msg.no-node-history", null, ApplicationMessage.WARNING)) ; return ; } } } static public class ChangeNodeActionListener extends EventListener<UIAddressBar> { public void execute(Event<UIAddressBar> event) throws Exception { UIAddressBar uiAddress = event.getSource() ; String path = Text.escapeIllegalJcrChars(uiAddress.getUIStringInput(FIELD_ADDRESS).getValue()); ((UIFormHiddenInput)uiAddress.getChildById(FIELD_ADDRESS_HIDDEN)).setValue(path); if (path == null || path.trim().length() == 0) path = "/"; UIJCRExplorer uiExplorer = uiAddress.getAncestorOfType(UIJCRExplorer.class) ; uiExplorer.setIsViewTag(false) ; try { String prefix = uiExplorer.getRootPath(); String nodePath = LinkUtils.evaluatePath(LinkUtils.createPath(prefix, path)); if (!nodePath.startsWith(prefix)) { nodePath = prefix; } uiExplorer.setSelectNode(nodePath) ; uiExplorer.setCurrentStatePath(nodePath) ; UIWorkingArea uiWorkingArea = uiExplorer.getChild(UIWorkingArea.class); UIDocumentWorkspace uiDocumentWorkspace = uiWorkingArea.getChild(UIDocumentWorkspace.class); if(!uiDocumentWorkspace.isRendered()) { uiDocumentWorkspace.setRendered(true); } else { uiDocumentWorkspace.setRenderedChild(UIDocumentContainer.class); } } catch(Exception e) { UIApplication uiApp = uiAddress.getAncestorOfType(UIApplication.class) ; uiApp.addMessage(new ApplicationMessage("UIAddressBar.msg.path-not-found", null, ApplicationMessage.WARNING)) ; return ; } uiExplorer.updateAjax(event) ; } } static public class HistoryActionListener extends EventListener<UIAddressBar> { public void execute(Event<UIAddressBar> event) throws Exception { UIAddressBar uiAddressBar = event.getSource() ; String fullPath = event.getRequestContext().getRequestParameter(OBJECTID) ; UIJCRExplorer uiExplorer = uiAddressBar.getAncestorOfType(UIJCRExplorer.class) ; String workspace = null; String path = null; try{ Matcher matcher = FILE_EXPLORER_URL_SYNTAX.matcher(fullPath); if (matcher.find()) { workspace = matcher.group(1); path = matcher.group(2); } uiExplorer.setSelectNode(workspace, path) ; uiExplorer.refreshExplorer() ; } catch (AccessDeniedException ade) { UIApplication uiApp = uiAddressBar.getAncestorOfType(UIApplication.class) ; uiApp.addMessage(new ApplicationMessage("UIAddressBar.msg.access-denied", null, ApplicationMessage.WARNING)) ; return ; } } } static public class ChangeViewActionListener extends EventListener<UIAddressBar> { public void execute(Event<UIAddressBar> event) throws Exception { UIAddressBar uiAddressBar = event.getSource() ; UIJCRExplorer uiExplorer = uiAddressBar.getAncestorOfType(UIJCRExplorer.class); 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); } String viewName = event.getRequestContext().getRequestParameter(OBJECTID); uiAddressBar.setSelectedViewName(viewName); UIActionBar uiActionBar = uiWorkingArea.getChild(UIActionBar.class); uiActionBar.setTabOptions(viewName) ; uiWorkingArea.getChild(UISideBar.class).initComponents(); uiExplorer.findFirstComponentOfType(UIDocumentInfo.class).getExpandedFolders().clear(); uiExplorer.updateAjax(event); } } static public class SimpleSearchActionListener extends EventListener<UIAddressBar> { public void execute(Event<UIAddressBar> event) throws Exception { UIAddressBar uiAddressBar = event.getSource(); UIApplication uiApp = uiAddressBar.getAncestorOfType(UIApplication.class); UIJCRExplorer uiExplorer = uiAddressBar.getAncestorOfType(UIJCRExplorer.class); String text = uiAddressBar.getUIStringInput(FIELD_SIMPLE_SEARCH).getValue(); Node currentNode = uiExplorer.getCurrentNode(); String queryStatement = null; if("/".equals(currentNode.getPath())) { queryStatement = ROOT_SQL_QUERY; }else { queryStatement = StringUtils.replace(SQL_QUERY,"$0",currentNode.getPath()); } String escapedText = org.exoplatform.services.cms.impl.Utils.escapeIllegalCharacterInQuery(text); queryStatement = StringUtils.replace(queryStatement,"$1", escapedText); queryStatement = StringUtils.replace(queryStatement,"$2", escapedText.toLowerCase()); queryStatement = StringUtils.replace(queryStatement,"$3", escapedText.toLowerCase()); queryStatement = StringUtils.replace(queryStatement,"$4", escapedText.toLowerCase()); uiExplorer.removeChildById("ViewSearch"); 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); } SessionProvider sessionProvider = new SessionProvider(ConversationState.getCurrent()); Session session = sessionProvider.getSession(currentNode.getSession().getWorkspace().getName(), (ManageableRepository)currentNode.getSession().getRepository()); UISearchResult uiSearchResult = uiDocumentWorkspace.getChildById(UIDocumentWorkspace.SIMPLE_SEARCH_RESULT); long startTime = System.currentTimeMillis(); uiSearchResult.setQuery(queryStatement, session.getWorkspace().getName(), Query.SQL, IdentityConstants.SYSTEM.equals(session.getUserID()), text); try { uiSearchResult.updateGrid(); } catch (InvalidQueryException invalidEx) { uiApp.addMessage(new ApplicationMessage(MESSAGE_NOT_SUPPORT_KEYWORD, null, ApplicationMessage.WARNING)); return; } catch (RepositoryException reEx) { uiApp.addMessage(new ApplicationMessage(MESSAGE_NOT_SUPPORT_KEYWORD, null, ApplicationMessage.WARNING)); return; } long time = System.currentTimeMillis() - startTime; uiSearchResult.setSearchTime(time); uiDocumentWorkspace.setRenderedChild(UISearchResult.class); if(!uiDocumentWorkspace.isRendered()) { event.getRequestContext().addUIComponentToUpdateByAjax(uiDocumentWorkspace); } } } static public class RefreshSessionActionListener extends EventListener<UIAddressBar> { public void execute(Event<UIAddressBar> event) throws Exception { UIJCRExplorer uiJCRExplorer = event.getSource().getAncestorOfType(UIJCRExplorer.class) ; uiJCRExplorer.getSession().refresh(false) ; uiJCRExplorer.refreshExplorer() ; UIWorkingArea uiWorkingArea = uiJCRExplorer.getChild(UIWorkingArea.class); UIActionBar uiActionBar = uiWorkingArea.getChild(UIActionBar.class); uiActionBar.setTabOptions(event.getSource().getSelectedViewName()) ; UIApplication uiApp = uiJCRExplorer.getAncestorOfType(UIApplication.class) ; String mess = "UIJCRExplorer.msg.refresh-session-success" ; uiApp.addMessage(new ApplicationMessage(mess, null, ApplicationMessage.INFO)) ; } } public static String UppercaseFirstLetters(String str) { boolean prevWasWhiteSp = true; char[] chars = str.toCharArray(); for (int i = 0; i < chars.length; i++) { if (Character.isLetter(chars[i])) { if (prevWasWhiteSp) { chars[i] = Character.toUpperCase(chars[i]); } prevWasWhiteSp = false; } else { prevWasWhiteSp = Character.isWhitespace(chars[i]); } } return new String(chars); } }