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 2013/10/17 10:10:22 UTC

svn commit: r1533001 - in /sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/tasks: ./ HistoryCleanUpTask.java

Author: cziegeler
Date: Thu Oct 17 08:10:22 2013
New Revision: 1533001

URL: http://svn.apache.org/r1533001
Log:
SLiNG-3184 : Create a job consumer to clean up the history

Added:
    sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/tasks/
    sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/tasks/HistoryCleanUpTask.java   (with props)

Added: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/tasks/HistoryCleanUpTask.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/tasks/HistoryCleanUpTask.java?rev=1533001&view=auto
==============================================================================
--- sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/tasks/HistoryCleanUpTask.java (added)
+++ sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/tasks/HistoryCleanUpTask.java Thu Oct 17 08:10:22 2013
@@ -0,0 +1,174 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.event.impl.jobs.tasks;
+
+import java.util.Calendar;
+import java.util.Iterator;
+
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Property;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.sling.api.resource.LoginException;
+import org.apache.sling.api.resource.PersistenceException;
+import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ResourceResolverFactory;
+import org.apache.sling.event.impl.support.BatchResourceRemover;
+import org.apache.sling.event.jobs.Job;
+import org.apache.sling.event.jobs.consumer.JobExecutionContext;
+import org.apache.sling.event.jobs.consumer.JobExecutionResult;
+import org.apache.sling.event.jobs.consumer.JobExecutor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Task to clean up the history
+ */
+@Component
+@Service(value = JobExecutor.class)
+@Property(name = JobExecutor.PROPERTY_TOPICS, value = "org/apache/sling/event/impl/jobs/tasks/HistoryCleanUpTask")
+public class HistoryCleanUpTask implements JobExecutor {
+
+    private static final String PROPERTY_AGE = "age";
+
+    private static final int DEFAULT_AGE = 60 * 24 * 2; // older than two days
+
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    @Reference
+    private ResourceResolverFactory resourceResolverFactory;
+
+    @Override
+    public JobExecutionResult process(final Job job, final JobExecutionContext context) {
+        int age = job.getProperty(PROPERTY_AGE, DEFAULT_AGE);
+        if ( age < 1 ) {
+            age = DEFAULT_AGE;
+        }
+        final Calendar now = Calendar.getInstance();
+        now.add(Calendar.MINUTE, -age);
+
+        context.log("Cleaning up job history. Removing all jobs older than {0}", now);
+        ResourceResolver resolver = null;
+        try {
+            resolver = this.resourceResolverFactory.getAdministrativeResourceResolver(null);
+
+            String basePath = "";
+            final Resource baseResource = resolver.getResource(basePath);
+            // sanity check - should never be null
+            if ( baseResource != null ) {
+                final Iterator<Resource> topicIter = baseResource.listChildren();
+                while ( !context.isStopped() && topicIter.hasNext() ) {
+                    final Resource topicResource = topicIter.next();
+
+                    // now years
+                    final Iterator<Resource> yearIter = topicResource.listChildren();
+                    while ( !context.isStopped() && yearIter.hasNext() ) {
+                        final Resource yearResource = yearIter.next();
+                        final int year = Integer.valueOf(yearResource.getName());
+                        final boolean oldYear = year < now.get(Calendar.YEAR);
+
+                        // months
+                        final Iterator<Resource> monthIter = yearResource.listChildren();
+                        while ( !context.isStopped() && monthIter.hasNext() ) {
+                            final Resource monthResource = monthIter.next();
+                            final int month = Integer.valueOf(monthResource.getName());
+                            final boolean oldMonth = oldYear || month < (now.get(Calendar.MONTH) + 1);
+
+                            // days
+                            final Iterator<Resource> dayIter = monthResource.listChildren();
+                            while ( !context.isStopped() && dayIter.hasNext() ) {
+                                final Resource dayResource = dayIter.next();
+                                final int day = Integer.valueOf(dayResource.getName());
+                                final boolean oldDay = oldMonth || day < now.get(Calendar.DAY_OF_MONTH);
+
+                                // hours
+                                final Iterator<Resource> hourIter = dayResource.listChildren();
+                                while ( !context.isStopped() && hourIter.hasNext() ) {
+                                    final Resource hourResource = hourIter.next();
+                                    final int hour = Integer.valueOf(hourResource.getName());
+                                    final boolean oldHour = oldDay || hour < now.get(Calendar.HOUR_OF_DAY);
+
+                                    // minutes
+                                    final Iterator<Resource> minuteIter = hourResource.listChildren();
+                                    while ( !context.isStopped() && minuteIter.hasNext() ) {
+                                        final Resource minuteResource = minuteIter.next();
+
+                                        // check if we can delete the minute
+                                        final int minute = Integer.valueOf(minuteResource.getName());
+                                        final boolean oldMinute = oldHour || minute <= now.get(Calendar.MINUTE);
+                                        if ( oldMinute ) {
+                                            BatchResourceRemover remover = new BatchResourceRemover();
+                                            remover.delete(minuteResource);
+                                            resolver.commit();
+                                        }
+                                    }
+
+                                    // check if we can delete the hour
+                                    if ( !context.isStopped() && oldHour && !hourResource.listChildren().hasNext()) {
+                                        resolver.delete(hourResource);
+                                        resolver.commit();
+                                    }
+                                }
+                                // check if we can delete the day
+                                if ( !context.isStopped() && oldDay && !dayResource.listChildren().hasNext()) {
+                                    resolver.delete(dayResource);
+                                    resolver.commit();
+                                }
+                            }
+
+                            // check if we can delete the month
+                            if ( !context.isStopped() && oldMonth && !monthResource.listChildren().hasNext() ) {
+                                resolver.delete(monthResource);
+                                resolver.commit();
+                            }
+                        }
+
+                        // check if we can delete the year
+                        if ( !context.isStopped() && oldYear && !yearResource.listChildren().hasNext() ) {
+                            resolver.delete(yearResource);
+                            resolver.commit();
+                        }
+                    }
+                }
+            }
+
+        } catch (final PersistenceException pe) {
+            // in the case of an error, we just log this as a warning
+            this.logger.warn("Exception during job resource tree cleanup.", pe);
+        } catch (final LoginException ignore) {
+            this.ignoreException(ignore);
+        } finally {
+            if ( resolver != null ) {
+                resolver.close();
+            }
+        }
+        return context.result().succeeded();
+    }
+
+    /**
+     * Helper method which just logs the exception in debug mode.
+     * @param e
+     */
+    private void ignoreException(final Exception e) {
+        if ( this.logger.isDebugEnabled() ) {
+            this.logger.debug("Ignored exception " + e.getMessage(), e);
+        }
+    }
+}

Propchange: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/tasks/HistoryCleanUpTask.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/tasks/HistoryCleanUpTask.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Propchange: sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/tasks/HistoryCleanUpTask.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain