/* * Copyright (C) 2009 eXo Platform SAS. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.services.jcr.impl.ext.action; import org.exoplatform.services.command.action.ActionMatcher; import org.exoplatform.services.command.action.Condition; import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager; import org.exoplatform.services.jcr.datamodel.InternalQName; import org.exoplatform.services.jcr.datamodel.QPath; /** * Created by The eXo Platform SAS. * * @author Gennady Azarenkov * @version $Id: SessionEventMatcher.java 11907 2008-03-13 15:36:21Z ksm $ */ public class SessionEventMatcher implements ActionMatcher { /** * Key describe an Event name to be listened to. */ public static final String EVENTTYPE_KEY = "types"; /** * Key describe a workspace */ public static final String WORKSPACE_KEY = "workspaces"; /** * Key describe an Item absolute paths */ public static final String PATH_KEY = "paths"; /** * Key describe an InternalQName[] array of current node NodeType names. */ public static final String NODETYPES_KEY = "nodeTypes"; private final int eventTypes; private final String[] workspaces; private final QPath[] paths; private boolean isDeep; private final InternalQName[] nodeTypeNames; private final NodeTypeDataManager typeDataManager; public SessionEventMatcher(int eventTypes, QPath[] paths, boolean isDeep, String[] workspaces, InternalQName[] nodeTypeNames, NodeTypeDataManager typeDataManager) { super(); this.eventTypes = eventTypes; this.paths = paths; this.isDeep = isDeep; this.nodeTypeNames = nodeTypeNames; this.workspaces = workspaces; this.typeDataManager = typeDataManager; } public String dump() { StringBuilder str = new StringBuilder("SessionEventMatcher: ").append(eventTypes).append("\n"); if (paths != null) { str.append("Paths (isDeep=").append(isDeep).append("):\n"); for (QPath p : paths) { str.append(p.getAsString()).append("\n"); } } if (nodeTypeNames != null) { str.append("Node Types:\n"); for (InternalQName n : nodeTypeNames) { str.append(n.getAsString()).append("\n"); } } return str.toString(); } public final boolean match(Condition conditions) { if (conditions.get(EVENTTYPE_KEY) == null || !isEventTypeMatch((Integer)conditions.get(EVENTTYPE_KEY))) { return false; } if (!isPathMatch((QPath)conditions.get(PATH_KEY))) { return false; } if (nodeTypeNames != null) { if (!isNodeTypesMatch((InternalQName[])conditions.get(NODETYPES_KEY))) { return false; } } if (!isWorkspaceMatch((String)conditions.get(WORKSPACE_KEY))) { return false; } return internalMatch(conditions); } private boolean isEventTypeMatch(int type) { return (eventTypes & type) > 0; } private boolean isNodeTypesMatch(InternalQName[] nodeTypes) { if (this.nodeTypeNames == null || nodeTypes == null) return true; for (InternalQName nt : nodeTypeNames) { if (typeDataManager.isNodeType(nt, nodeTypes)) return true; // for (InternalQName searchNt : nodeTypes) { // if (nt.equals(searchNt)) // return true; // } } return false; } private boolean isPathMatch(QPath itemPath) { if (this.paths == null || itemPath == null) return true; for (QPath p : paths) { if (itemPath.equals(p) || itemPath.isDescendantOf(p, !isDeep)) return true; } return false; } private boolean isWorkspaceMatch(String workspace) { if (this.workspaces == null || workspace == null) return true; for (String ws : workspaces) { if (ws.equals(workspace)) return true; } return false; } protected boolean internalMatch(Condition conditions) { return true; } }