You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2008/08/15 11:54:48 UTC

svn commit: r686186 - in /incubator/sling/trunk/extensions/event/src/main/java/org/apache/sling/event: JobStatusProvider.java impl/AbstractRepositoryEventHandler.java impl/JobEventHandler.java

Author: cziegeler
Date: Fri Aug 15 02:54:47 2008
New Revision: 686186

URL: http://svn.apache.org/viewvc?rev=686186&view=rev
Log:
SLING-616: Improved search: filter properties.

Modified:
    incubator/sling/trunk/extensions/event/src/main/java/org/apache/sling/event/JobStatusProvider.java
    incubator/sling/trunk/extensions/event/src/main/java/org/apache/sling/event/impl/AbstractRepositoryEventHandler.java
    incubator/sling/trunk/extensions/event/src/main/java/org/apache/sling/event/impl/JobEventHandler.java

Modified: incubator/sling/trunk/extensions/event/src/main/java/org/apache/sling/event/JobStatusProvider.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/event/src/main/java/org/apache/sling/event/JobStatusProvider.java?rev=686186&r1=686185&r2=686186&view=diff
==============================================================================
--- incubator/sling/trunk/extensions/event/src/main/java/org/apache/sling/event/JobStatusProvider.java (original)
+++ incubator/sling/trunk/extensions/event/src/main/java/org/apache/sling/event/JobStatusProvider.java Fri Aug 15 02:54:47 2008
@@ -19,6 +19,7 @@
 package org.apache.sling.event;
 
 import java.util.Collection;
+import java.util.Map;
 
 import org.osgi.service.event.Event;
 
@@ -28,11 +29,17 @@
 public interface JobStatusProvider {
 
     /**
+     * @deprecated Use {@link #getScheduledJobs(String)} instead.
+     */
+    @Deprecated
+    Collection<Event> scheduledJobs(String topic);
+
+    /**
      * Return a list of currently schedulded jobs.
      * @param topic Topic can be used as a filter, if it is non-null, only jobs with this topic will be returned.
      * @return A non null collection.
      */
-    Collection<Event> scheduledJobs(String topic);
+    Collection<Event> getScheduledJobs(String topic);
 
     /**
      * Return the jobs which are currently in processing. If there are several application nodes
@@ -41,4 +48,21 @@
      * @return A non null collection.
      */
     Collection<Event> getCurrentJobs(String topic);
+
+    /**
+     * Return a list of currently schedulded jobs.
+     * @param topic Topic can be used as a filter, if it is non-null, only jobs with this topic will be returned.
+     * @param filterProps An optional map of filter props that act like a template.
+     * @return A non null collection.
+     */
+    Collection<Event> getScheduledJobs(String topic, Map<String, Object> filterProps);
+
+    /**
+     * Return the jobs which are currently in processing. If there are several application nodes
+     * in the cluster, there could be more than one job in processing
+     * @param topic Topic can be used as a filter, if it is non-null, only jobs with this topic will be returned.
+     * @param filterProps An optional map of filter props that act like a template.
+     * @return A non null collection.
+     */
+    Collection<Event> getCurrentJobs(String topic, Map<String, Object> filterProps);
 }

Modified: incubator/sling/trunk/extensions/event/src/main/java/org/apache/sling/event/impl/AbstractRepositoryEventHandler.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/event/src/main/java/org/apache/sling/event/impl/AbstractRepositoryEventHandler.java?rev=686186&r1=686185&r2=686186&view=diff
==============================================================================
--- incubator/sling/trunk/extensions/event/src/main/java/org/apache/sling/event/impl/AbstractRepositoryEventHandler.java (original)
+++ incubator/sling/trunk/extensions/event/src/main/java/org/apache/sling/event/impl/AbstractRepositoryEventHandler.java Fri Aug 15 02:54:47 2008
@@ -349,6 +349,43 @@
     }
 
     /**
+     * Return the converted repository property name
+     * @param name The OSGi event property name
+     * @return The converted name or null if not possible.
+     */
+    protected String getNodePropertyName(final String name) {
+        // if name contains a colon, we can't set it as a property
+        if ( name.indexOf(':') != -1 ) {
+            return null;
+        }
+        return ISO9075.encode(name);
+    }
+
+    /**
+     * Return the converted repository property value
+     * @param valueFactory The value factory
+     * @param eventValue The event value
+     * @return The converted value or null if not possible
+     */
+    protected Value getNodePropertyValue(final ValueFactory valueFactory, final Object eventValue) {
+        final Value val;
+        if (eventValue.getClass().isAssignableFrom(Calendar.class)) {
+            val = valueFactory.createValue((Calendar)eventValue);
+        } else if (eventValue.getClass().isAssignableFrom(Long.class)) {
+            val = valueFactory.createValue((Long)eventValue);
+        } else if (eventValue.getClass().isAssignableFrom(Double.class)) {
+            val = valueFactory.createValue(((Double)eventValue).doubleValue());
+        } else if (eventValue.getClass().isAssignableFrom(Boolean.class)) {
+            val = valueFactory.createValue((Boolean) eventValue);
+        } else if (eventValue instanceof String) {
+            val = valueFactory.createValue((String)eventValue);
+        } else {
+            val = null;
+        }
+        return val;
+    }
+
+    /**
      * Try to set the OSGi event property as a property of the node.
      * @param name
      * @param value
@@ -358,27 +395,14 @@
      */
     private boolean setProperty(String name, Object value, Node node)
     throws RepositoryException {
-        // if name contains a colon, we can't set it as a property
-        if ( name.indexOf(':') != -1 ) {
+        final String propName = this.getNodePropertyName(name);
+        if ( propName == null ) {
             return false;
         }
         final ValueFactory fac = node.getSession().getValueFactory();
-        final Value val;
-        if (value.getClass().isAssignableFrom(Calendar.class)) {
-            val = fac.createValue((Calendar)value);
-        } else if (value.getClass().isAssignableFrom(Long.class)) {
-            val = fac.createValue((Long)value);
-        } else if (value.getClass().isAssignableFrom(Double.class)) {
-            val = fac.createValue(((Double)value).doubleValue());
-        } else if (value.getClass().isAssignableFrom(Boolean.class)) {
-            val = fac.createValue((Boolean) value);
-        } else if (value instanceof String) {
-            val = fac.createValue((String)value);
-        } else {
-            val = null;
-        }
+        final Value val = this.getNodePropertyValue(fac, value);
         if ( val != null ) {
-            node.setProperty(ISO9075.encode(name), val);
+            node.setProperty(propName, val);
             return true;
         }
         return false;

Modified: incubator/sling/trunk/extensions/event/src/main/java/org/apache/sling/event/impl/JobEventHandler.java
URL: http://svn.apache.org/viewvc/incubator/sling/trunk/extensions/event/src/main/java/org/apache/sling/event/impl/JobEventHandler.java?rev=686186&r1=686185&r2=686186&view=diff
==============================================================================
--- incubator/sling/trunk/extensions/event/src/main/java/org/apache/sling/event/impl/JobEventHandler.java (original)
+++ incubator/sling/trunk/extensions/event/src/main/java/org/apache/sling/event/impl/JobEventHandler.java Fri Aug 15 02:54:47 2008
@@ -26,6 +26,7 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Hashtable;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -36,6 +37,7 @@
 import javax.jcr.NodeIterator;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
+import javax.jcr.Value;
 import javax.jcr.observation.EventIterator;
 import javax.jcr.query.Query;
 import javax.jcr.query.QueryManager;
@@ -933,12 +935,16 @@
     }
 
     /**
-     * Search for active nodes
-     * @param topic
+     * Search for job nodes
+     * @param topic The job topic
+     * @param filterProps optional filter props
+     * @param locked only active jobs?
      * @return
      * @throws RepositoryException
      */
-    protected Collection<Event> queryCurrentJobs(String topic, boolean locked)  {
+    private Collection<Event> queryCurrentJobs(final String topic,
+                                               final Map<String, Object> filterProps,
+                                               final boolean locked)  {
         // we create a new session
         Session s = null;
         final List<Event> jobs = new ArrayList<Event>();
@@ -949,9 +955,11 @@
             buffer.append(this.repositoryPath);
             buffer.append("//element(*, ");
             buffer.append(this.getEventNodeType());
+            buffer.append(") [not(@");
+            buffer.append(EventHelper.NODE_PROPERTY_FINISHED);
             buffer.append(")");
             if ( topic != null ) {
-                buffer.append(" [");
+                buffer.append(" @");
                 buffer.append(EventHelper.NODE_PROPERTY_TOPIC);
                 buffer.append(" = '");
                 buffer.append(topic);
@@ -959,10 +967,32 @@
             }
             if ( locked ) {
                 buffer.append(" and ");
-                buffer.append("jcr:lockOwner");
+                buffer.append("@jcr:lockOwner");
+            }
+            if ( filterProps != null ) {
+                final Iterator<Map.Entry<String, Object>> i = filterProps.entrySet().iterator();
+                while ( i.hasNext() ) {
+                    final Map.Entry<String, Object> current = i.next();
+                    // check prop name first
+                    final String propName = this.getNodePropertyName(current.getKey());
+                    if ( propName != null ) {
+                        // check value
+                        final Value value = this.getNodePropertyValue(s.getValueFactory(), current.getValue());
+                        if ( value != null ) {
+                            buffer.append(" and @");
+                            buffer.append(propName);
+                            buffer.append(" = '");
+                            buffer.append(current.getValue());
+                            buffer.append("'");
+                        }
+                    }
+                }
             }
             buffer.append("]");
-            final Query q = qManager.createQuery(buffer.toString(), Query.XPATH);
+            final String queryString = buffer.toString();
+            logger.debug("Executing job query {}.", queryString);
+
+            final Query q = qManager.createQuery(queryString, Query.XPATH);
             final NodeIterator iter = q.execute().getNodes();
             while ( iter.hasNext() ) {
                 final Node eventNode = iter.nextNode();
@@ -989,13 +1019,34 @@
      * @see org.apache.sling.event.JobStatusProvider#getCurrentJobs(java.lang.String)
      */
     public Collection<Event> getCurrentJobs(String topic) {
-        return this.queryCurrentJobs(topic, true);
+        return this.getCurrentJobs(topic, null);
     }
 
     /**
-     * @see org.apache.sling.event.JobStatusProvider#scheduledJobs(java.lang.String)
+     * This is deprecated.
      */
     public Collection<Event> scheduledJobs(String topic) {
-        return this.queryCurrentJobs(topic, false);
+        return this.getScheduledJobs(topic);
+    }
+
+    /**
+     * @see org.apache.sling.event.JobStatusProvider#getScheduledJobs(java.lang.String)
+     */
+    public Collection<Event> getScheduledJobs(String topic) {
+        return this.getScheduledJobs(topic, null);
+    }
+
+    /**
+     * @see org.apache.sling.event.JobStatusProvider#getCurrentJobs(java.lang.String, java.util.Map)
+     */
+    public Collection<Event> getCurrentJobs(String topic, Map<String, Object> filterProps) {
+        return this.queryCurrentJobs(topic, null, true);
+    }
+
+    /**
+     * @see org.apache.sling.event.JobStatusProvider#getScheduledJobs(java.lang.String, java.util.Map)
+     */
+    public Collection<Event> getScheduledJobs(String topic, Map<String, Object> filterProps) {
+        return this.queryCurrentJobs(topic, null, false);
     }
 }