diff -r 9f0b95aafaa3 -r ed84c8bdd87b org/sonews/util/Purger.java
--- a/org/sonews/util/Purger.java Sun Aug 29 17:04:25 2010 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,149 +0,0 @@
-/*
- * SONEWS News Server
- * see AUTHORS for the list of contributors
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU 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 .
- */
-
-package org.sonews.util;
-
-import org.sonews.daemon.AbstractDaemon;
-import org.sonews.config.Config;
-import org.sonews.storage.Article;
-import org.sonews.storage.Headers;
-import java.util.Date;
-import java.util.List;
-import org.sonews.storage.Channel;
-import org.sonews.storage.Group;
-import org.sonews.storage.StorageBackendException;
-import org.sonews.storage.StorageManager;
-
-/**
- * The purger is started in configurable intervals to search
- * for messages that can be purged. A message must be deleted if its lifetime
- * has exceeded, if it was marked as deleted or if the maximum number of
- * articles in the database is reached.
- * @author Christian Lins
- * @since sonews/0.5.0
- */
-public class Purger extends AbstractDaemon
-{
-
- /**
- * Loops through all messages and deletes them if their time
- * has come.
- */
- @Override
- public void run()
- {
- try
- {
- while(isRunning())
- {
- purgeDeleted();
- purgeOutdated();
-
- Thread.sleep(120000); // Sleep for two minutes
- }
- }
- catch(StorageBackendException ex)
- {
- ex.printStackTrace();
- }
- catch(InterruptedException ex)
- {
- Log.get().warning("Purger interrupted: " + ex);
- }
- }
-
- private void purgeDeleted()
- throws StorageBackendException
- {
- List groups = StorageManager.current().getGroups();
- for(Channel channel : groups)
- {
- if(!(channel instanceof Group))
- continue;
-
- Group group = (Group)channel;
- // Look for groups that are marked as deleted
- if(group.isDeleted())
- {
- List ids = StorageManager.current().getArticleNumbers(group.getInternalID());
- if(ids.size() == 0)
- {
- StorageManager.current().purgeGroup(group);
- Log.get().info("Group " + group.getName() + " purged.");
- }
-
- for(int n = 0; n < ids.size() && n < 10; n++)
- {
- Article art = StorageManager.current().getArticle(ids.get(n), group.getInternalID());
- StorageManager.current().delete(art.getMessageID());
- Log.get().info("Article " + art.getMessageID() + " purged.");
- }
- }
- }
- }
-
- private void purgeOutdated()
- throws InterruptedException, StorageBackendException
- {
- long articleMaximum =
- Config.inst().get("sonews.article.maxnum", Long.MAX_VALUE);
- long lifetime =
- Config.inst().get("sonews.article.lifetime", -1);
-
- if(lifetime > 0 || articleMaximum < Stats.getInstance().getNumberOfNews())
- {
- Log.get().info("Purging old messages...");
- String mid = StorageManager.current().getOldestArticle();
- if (mid == null) // No articles in the database
- {
- return;
- }
-
- Article art = StorageManager.current().getArticle(mid);
- long artDate = 0;
- String dateStr = art.getHeader(Headers.DATE)[0];
- try
- {
- artDate = Date.parse(dateStr) / 1000 / 60 / 60 / 24;
- }
- catch (IllegalArgumentException ex)
- {
- Log.get().warning("Could not parse date string: " + dateStr + " " + ex);
- }
-
- // Should we delete the message because of its age or because the
- // article maximum was reached?
- if (lifetime < 0 || artDate < (new Date().getTime() + lifetime))
- {
- StorageManager.current().delete(mid);
- System.out.println("Deleted: " + mid);
- }
- else
- {
- Thread.sleep(1000 * 60); // Wait 60 seconds
- return;
- }
- }
- else
- {
- Log.get().info("Lifetime purger is disabled");
- Thread.sleep(1000 * 60 * 30); // Wait 30 minutes
- }
- }
-
-}