# HG changeset patch
# User cli
# Date 1315746304 -7200
# Node ID b78e7761915246923ab36c027531325cc069d4a0
# Parent  e118b4d60029c6065d5def39bd7d0eb47cde1e2c
Merge Channel and Group classes.

diff -r e118b4d60029 -r b78e77619152 src/org/sonews/daemon/NNTPConnection.java
--- a/src/org/sonews/daemon/NNTPConnection.java	Sun Sep 11 14:19:19 2011 +0200
+++ b/src/org/sonews/daemon/NNTPConnection.java	Sun Sep 11 15:05:04 2011 +0200
@@ -32,7 +32,7 @@
 import java.util.TimerTask;
 import org.sonews.daemon.command.Command;
 import org.sonews.storage.Article;
-import org.sonews.storage.Channel;
+import org.sonews.storage.Group;
 import org.sonews.storage.StorageBackendException;
 import org.sonews.util.Log;
 import org.sonews.util.Stats;
@@ -54,7 +54,7 @@
 	private Charset charset = Charset.forName("UTF-8");
 	private Command command = null;
 	private Article currentArticle = null;
-	private Channel currentGroup = null;
+	private Group currentGroup = null;
 	private volatile long lastActivity = System.currentTimeMillis();
 	private ChannelLineBuffers lineBuffers = new ChannelLineBuffers();
 	private int readLock = 0;
@@ -196,7 +196,7 @@
 	/**
 	 * @return The currently selected communication channel (not SocketChannel)
 	 */
-	public Channel getCurrentChannel()
+	public Group getCurrentChannel()
 	{
 		return this.currentGroup;
 	}
@@ -206,7 +206,7 @@
 		this.currentArticle = article;
 	}
 
-	public void setCurrentGroup(final Channel group)
+	public void setCurrentGroup(final Group group)
 	{
 		this.currentGroup = group;
 	}
diff -r e118b4d60029 -r b78e77619152 src/org/sonews/daemon/command/ArticleCommand.java
--- a/src/org/sonews/daemon/command/ArticleCommand.java	Sun Sep 11 14:19:19 2011 +0200
+++ b/src/org/sonews/daemon/command/ArticleCommand.java	Sun Sep 11 15:05:04 2011 +0200
@@ -15,13 +15,12 @@
  *   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.sonews.daemon.command;
 
 import java.io.IOException;
 import org.sonews.storage.Article;
 import org.sonews.daemon.NNTPConnection;
-import org.sonews.storage.Channel;
+import org.sonews.storage.Group;
 import org.sonews.storage.StorageBackendException;
 
 /**
@@ -30,38 +29,32 @@
  * @author Dennis Schwerdel
  * @since n3tpd/0.1
  */
-public class ArticleCommand implements Command
-{
+public class ArticleCommand implements Command {
 
 	@Override
-	public String[] getSupportedCommandStrings()
-	{
-		return new String[] {"ARTICLE", "BODY", "HEAD"};
+	public String[] getSupportedCommandStrings() {
+		return new String[]{"ARTICLE", "BODY", "HEAD"};
 	}
 
 	@Override
-	public boolean hasFinished()
-	{
+	public boolean hasFinished() {
 		return true;
 	}
 
 	@Override
-	public String impliedCapability()
-	{
+	public String impliedCapability() {
 		return null;
 	}
 
 	@Override
-	public boolean isStateful()
-	{
+	public boolean isStateful() {
 		return false;
 	}
 
 	// TODO: Refactor this method to reduce its complexity!
 	@Override
 	public void processLine(NNTPConnection conn, final String line, byte[] raw)
-		throws IOException
-	{
+			throws IOException {
 		final String[] command = line.split(" ");
 
 		Article article = null;
@@ -82,7 +75,7 @@
 		} else {
 			// Message Number
 			try {
-				Channel currentGroup = conn.getCurrentChannel();
+				Group currentGroup = conn.getCurrentChannel();
 				if (currentGroup == null) {
 					conn.println("400 no group selected");
 					return;
@@ -105,7 +98,7 @@
 
 		if (command[0].equalsIgnoreCase("ARTICLE")) {
 			conn.println("220 " + artIndex + " " + article.getMessageID()
-				+ " article retrieved - head and body follow");
+					+ " article retrieved - head and body follow");
 			conn.println(article.getHeaderSource());
 			conn.println("");
 			conn.println(article.getBody());
@@ -144,7 +137,7 @@
 		 *  message-id    Article message-id
 		 */ else if (command[0].equalsIgnoreCase("HEAD")) {
 			conn.println("221 " + artIndex + " " + article.getMessageID()
-				+ " Headers follow (multi-line)");
+					+ " Headers follow (multi-line)");
 			conn.println(article.getHeaderSource());
 			conn.println(".");
 		}
diff -r e118b4d60029 -r b78e77619152 src/org/sonews/daemon/command/GroupCommand.java
--- a/src/org/sonews/daemon/command/GroupCommand.java	Sun Sep 11 14:19:19 2011 +0200
+++ b/src/org/sonews/daemon/command/GroupCommand.java	Sun Sep 11 15:05:04 2011 +0200
@@ -20,8 +20,9 @@
 
 import java.io.IOException;
 import org.sonews.daemon.NNTPConnection;
-import org.sonews.storage.Channel;
+import org.sonews.storage.Group;
 import org.sonews.storage.StorageBackendException;
+import org.sonews.storage.StorageManager;
 
 /**
  * Class handling the GROUP command.
@@ -78,9 +79,9 @@
 	{
 		final String[] command = line.split(" ");
 
-		Channel group;
+		Group group;
 		if (command.length >= 2) {
-			group = Channel.getByName(command[1]);
+			group = StorageManager.current().getGroup(command[1]);
 			if (group == null || group.isDeleted()) {
 				conn.println("411 no such news group");
 			} else {
diff -r e118b4d60029 -r b78e77619152 src/org/sonews/daemon/command/ListCommand.java
--- a/src/org/sonews/daemon/command/ListCommand.java	Sun Sep 11 14:19:19 2011 +0200
+++ b/src/org/sonews/daemon/command/ListCommand.java	Sun Sep 11 15:05:04 2011 +0200
@@ -24,7 +24,7 @@
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
 import org.sonews.daemon.NNTPConnection;
-import org.sonews.storage.Channel;
+import org.sonews.storage.Group;
 import org.sonews.storage.StorageBackendException;
 import org.sonews.util.Log;
 
@@ -74,8 +74,8 @@
 				conn.println(".");
 			} else if (command[1].equalsIgnoreCase("NEWSGROUPS")) {
 				conn.println("215 information follows");
-				final List<Channel> list = Channel.getAll();
-				for (Channel g : list) {
+				final List<Group> list = Group.getAll();
+				for (Group g : list) {
 					conn.println(g.getName() + "\t" + "-");
 				}
 				conn.println(".");
@@ -103,10 +103,10 @@
 	private void printGroupInfo(NNTPConnection conn, String pattern)
 		throws IOException, StorageBackendException
 	{
-		final List<Channel> groups = Channel.getAll();
+		final List<Group> groups = Group.getAll();
 		if (groups != null) {
 			conn.println("215 list of newsgroups follows");
-			for (Channel g : groups) {
+			for (Group g : groups) {
 				try {
 					Matcher matcher = pattern == null
 						? null : Pattern.compile(pattern).matcher(g.getName());
diff -r e118b4d60029 -r b78e77619152 src/org/sonews/daemon/command/ListGroupCommand.java
--- a/src/org/sonews/daemon/command/ListGroupCommand.java	Sun Sep 11 14:19:19 2011 +0200
+++ b/src/org/sonews/daemon/command/ListGroupCommand.java	Sun Sep 11 15:05:04 2011 +0200
@@ -15,14 +15,14 @@
  *   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.sonews.daemon.command;
 
 import java.io.IOException;
 import java.util.List;
 import org.sonews.daemon.NNTPConnection;
-import org.sonews.storage.Channel;
+import org.sonews.storage.Group;
 import org.sonews.storage.StorageBackendException;
+import org.sonews.storage.StorageManager;
 
 /**
  * Class handling the LISTGROUP command.
@@ -30,42 +30,36 @@
  * @author Dennis Schwerdel
  * @since n3tpd/0.1
  */
-public class ListGroupCommand implements Command
-{
+public class ListGroupCommand implements Command {
 
 	@Override
-	public String[] getSupportedCommandStrings()
-	{
-		return new String[] {"LISTGROUP"};
+	public String[] getSupportedCommandStrings() {
+		return new String[]{"LISTGROUP"};
 	}
 
 	@Override
-	public boolean hasFinished()
-	{
+	public boolean hasFinished() {
 		return true;
 	}
 
 	@Override
-	public String impliedCapability()
-	{
+	public String impliedCapability() {
 		return null;
 	}
 
 	@Override
-	public boolean isStateful()
-	{
+	public boolean isStateful() {
 		return false;
 	}
 
 	@Override
 	public void processLine(NNTPConnection conn, final String commandName, byte[] raw)
-		throws IOException, StorageBackendException
-	{
+			throws IOException, StorageBackendException {
 		final String[] command = commandName.split(" ");
 
-		Channel group;
+		Group group;
 		if (command.length >= 2) {
-			group = Channel.getByName(command[1]);
+			group = StorageManager.current().getGroup(command[1]);
 		} else {
 			group = conn.getCurrentChannel();
 		}
@@ -77,8 +71,8 @@
 
 		List<Long> ids = group.getArticleNumbers();
 		conn.println("211 " + ids.size() + " "
-			+ group.getFirstArticleNumber() + " "
-			+ group.getLastArticleNumber() + " list of article numbers follow");
+				+ group.getFirstArticleNumber() + " "
+				+ group.getLastArticleNumber() + " list of article numbers follow");
 		for (long id : ids) {
 			// One index number per line
 			conn.println(Long.toString(id));
diff -r e118b4d60029 -r b78e77619152 src/org/sonews/daemon/command/NextPrevCommand.java
--- a/src/org/sonews/daemon/command/NextPrevCommand.java	Sun Sep 11 14:19:19 2011 +0200
+++ b/src/org/sonews/daemon/command/NextPrevCommand.java	Sun Sep 11 15:05:04 2011 +0200
@@ -15,13 +15,12 @@
  *   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.sonews.daemon.command;
 
 import java.io.IOException;
 import org.sonews.daemon.NNTPConnection;
 import org.sonews.storage.Article;
-import org.sonews.storage.Channel;
+import org.sonews.storage.Group;
 import org.sonews.storage.StorageBackendException;
 
 /**
@@ -30,39 +29,33 @@
  * @author Dennis Schwerdel
  * @since n3tpd/0.1
  */
-public class NextPrevCommand implements Command
-{
+public class NextPrevCommand implements Command {
 
 	@Override
-	public String[] getSupportedCommandStrings()
-	{
-		return new String[] {"NEXT", "PREV"};
+	public String[] getSupportedCommandStrings() {
+		return new String[]{"NEXT", "PREV"};
 	}
 
 	@Override
-	public boolean hasFinished()
-	{
+	public boolean hasFinished() {
 		return true;
 	}
 
 	@Override
-	public String impliedCapability()
-	{
+	public String impliedCapability() {
 		return null;
 	}
 
 	@Override
-	public boolean isStateful()
-	{
+	public boolean isStateful() {
 		return false;
 	}
 
 	@Override
 	public void processLine(NNTPConnection conn, final String line, byte[] raw)
-		throws IOException, StorageBackendException
-	{
+			throws IOException, StorageBackendException {
 		final Article currA = conn.getCurrentArticle();
-		final Channel currG = conn.getCurrentChannel();
+		final Group currG = conn.getCurrentChannel();
 
 		if (currA == null) {
 			conn.println("420 no current article has been selected");
@@ -85,10 +78,9 @@
 		}
 	}
 
-	private void selectNewArticle(NNTPConnection conn, Article article, Channel grp,
-		final int delta)
-		throws IOException, StorageBackendException
-	{
+	private void selectNewArticle(NNTPConnection conn, Article article, Group grp,
+			final int delta)
+			throws IOException, StorageBackendException {
 		assert article != null;
 
 		article = grp.getArticle(grp.getIndexOf(article) + delta);
@@ -98,8 +90,8 @@
 		} else {
 			conn.setCurrentArticle(article);
 			conn.println("223 " + conn.getCurrentChannel().getIndexOf(article)
-				+ " " + article.getMessageID()
-				+ " article retrieved - request text separately");
+					+ " " + article.getMessageID()
+					+ " article retrieved - request text separately");
 		}
 	}
 }
diff -r e118b4d60029 -r b78e77619152 src/org/sonews/daemon/command/StatCommand.java
--- a/src/org/sonews/daemon/command/StatCommand.java	Sun Sep 11 14:19:19 2011 +0200
+++ b/src/org/sonews/daemon/command/StatCommand.java	Sun Sep 11 15:05:04 2011 +0200
@@ -15,7 +15,6 @@
  *   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.sonews.daemon.command;
 
 import java.io.IOException;
@@ -28,38 +27,32 @@
  * @author Christian Lins
  * @since sonews/0.5.0
  */
-public class StatCommand implements Command
-{
+public class StatCommand implements Command {
 
 	@Override
-	public String[] getSupportedCommandStrings()
-	{
-		return new String[] {"STAT"};
+	public String[] getSupportedCommandStrings() {
+		return new String[]{"STAT"};
 	}
 
 	@Override
-	public boolean hasFinished()
-	{
+	public boolean hasFinished() {
 		return true;
 	}
 
 	@Override
-	public String impliedCapability()
-	{
+	public String impliedCapability() {
 		return null;
 	}
 
 	@Override
-	public boolean isStateful()
-	{
+	public boolean isStateful() {
 		return false;
 	}
 
 	// TODO: Method has various exit points => Refactor!
 	@Override
 	public void processLine(NNTPConnection conn, final String line, byte[] raw)
-		throws IOException, StorageBackendException
-	{
+			throws IOException, StorageBackendException {
 		final String[] command = line.split(" ");
 
 		Article article = null;
@@ -94,7 +87,7 @@
 		}
 
 		conn.println("223 " + conn.getCurrentChannel().getIndexOf(article) + " "
-			+ article.getMessageID()
-			+ " article retrieved - request text separately");
+				+ article.getMessageID()
+				+ " article retrieved - request text separately");
 	}
 }
diff -r e118b4d60029 -r b78e77619152 src/org/sonews/daemon/command/XDaemonCommand.java
--- a/src/org/sonews/daemon/command/XDaemonCommand.java	Sun Sep 11 14:19:19 2011 +0200
+++ b/src/org/sonews/daemon/command/XDaemonCommand.java	Sun Sep 11 15:05:04 2011 +0200
@@ -27,7 +27,6 @@
 import org.sonews.storage.StorageManager;
 import org.sonews.feed.FeedManager;
 import org.sonews.feed.Subscription;
-import org.sonews.storage.Channel;
 import org.sonews.storage.Group;
 import org.sonews.util.Stats;
 
@@ -132,19 +131,19 @@
 				String flagName = commands[4];
 				if(commands[3].equalsIgnoreCase("SET")) {
 					if(flagName.equals("MAILINGLIST")) {
-						group.setFlag(Channel.MAILINGLIST);
+						group.setFlag(Group.MAILINGLIST);
 					} else if(flagName.equals("DELETED")) {
-						group.setFlag(Channel.DELETED);
+						group.setFlag(Group.DELETED);
 					} else if(flagName.equals("READONLY")) {
-						group.setFlag(Channel.READONLY);
+						group.setFlag(Group.READONLY);
 					}
 				} else if(commands[3].equalsIgnoreCase("UNSET")) {
 					if(flagName.equals("MAILINGLIST")) {
-						group.unsetFlag(Channel.MAILINGLIST);
+						group.unsetFlag(Group.MAILINGLIST);
 					} else if(flagName.equals("DELETED")) {
-						group.unsetFlag(Channel.DELETED);
+						group.unsetFlag(Group.DELETED);
 					} else if(flagName.equals("READONLY")) {
-						group.unsetFlag(Channel.READONLY);
+						group.unsetFlag(Group.READONLY);
 					}
 				} else {
 					conn.println("500 invalid command usage");
@@ -168,7 +167,7 @@
 			} else if (commands.length >= 3 && commands[1].equalsIgnoreCase("LOG")) {
 				Group group = null;
 				if (commands.length > 3) {
-					group = (Group) Channel.getByName(commands[3]);
+					group = StorageManager.current().getGroup(commands[3]);
 				}
 
 				if (commands[2].equalsIgnoreCase("CONNECTED_CLIENTS")) {
diff -r e118b4d60029 -r b78e77619152 src/org/sonews/storage/Channel.java
--- a/src/org/sonews/storage/Channel.java	Sun Sep 11 14:19:19 2011 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,103 +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 <http://www.gnu.org/licenses/>.
- */
-package org.sonews.storage;
-
-import java.util.ArrayList;
-import java.util.List;
-import org.sonews.util.Pair;
-
-/**
- * A logical communication Channel is the a generic structural element for sets
- * of messages; e.g. a Newsgroup for a set of Articles.
- * A Channel can either be a real set of messages or an aggregated set of
- * several subsets.
- * @author Christian Lins
- * @since sonews/1.0
- */
-public abstract class Channel {
-
-	/**
-	 * If this flag is set the Group is no real newsgroup but a mailing list
-	 * mirror. In that case every posting and receiving mails must go through
-	 * the mailing list gateway.
-	 */
-	public static final int MAILINGLIST = 0x1;
-	/**
-	 * If this flag is set the Group is marked as readonly and the posting
-	 * is prohibited. This can be useful for groups that are synced only in
-	 * one direction.
-	 */
-	public static final int READONLY = 0x2;
-	/**
-	 * If this flag is set the Group is marked as deleted and must not occur
-	 * in any output. The deletion is done lazily by a low priority daemon.
-	 */
-	public static final int DELETED = 0x80;
-
-	public static List<Channel> getAll() {
-		List<Channel> all = new ArrayList<Channel>();
-
-		/*List<Channel> agroups = AggregatedGroup.getAll();
-		if(agroups != null)
-		{
-		all.addAll(agroups);
-		}*/
-
-		List<Channel> groups = Group.getAll();
-		if (groups != null) {
-			all.addAll(groups);
-		}
-
-		return all;
-	}
-
-	public static Channel getByName(String name)
-			throws StorageBackendException {
-		return StorageManager.current().getGroup(name);
-	}
-
-	public abstract Article getArticle(long idx)
-			throws StorageBackendException;
-
-	public abstract List<Pair<Long, ArticleHead>> getArticleHeads(
-			final long first, final long last)
-			throws StorageBackendException;
-
-	public abstract List<Long> getArticleNumbers()
-			throws StorageBackendException;
-
-	public abstract long getFirstArticleNumber()
-			throws StorageBackendException;
-
-	public abstract long getIndexOf(Article art)
-			throws StorageBackendException;
-
-	public abstract long getInternalID();
-
-	public abstract long getLastArticleNumber()
-			throws StorageBackendException;
-
-	public abstract String getName();
-
-	public abstract long getPostingsCount()
-			throws StorageBackendException;
-
-	public abstract boolean isDeleted();
-
-	public abstract boolean isWriteable();
-}
diff -r e118b4d60029 -r b78e77619152 src/org/sonews/storage/Group.java
--- a/src/org/sonews/storage/Group.java	Sun Sep 11 14:19:19 2011 +0200
+++ b/src/org/sonews/storage/Group.java	Sun Sep 11 15:05:04 2011 +0200
@@ -27,7 +27,7 @@
  * @author Christian Lins
  * @since sonews/0.5.0
  */
-public class Group extends Channel {
+public class Group {
 
 	/**
 	 * If this flag is set the Group is no real newsgroup but a mailing list
@@ -56,7 +56,7 @@
 	/**
 	 * @return List of all groups this server handles.
 	 */
-	public static List<Channel> getAll() {
+	public static List<Group> getAll() {
 		try {
 			return StorageManager.current().getGroups();
 		} catch (StorageBackendException ex) {
diff -r e118b4d60029 -r b78e77619152 src/org/sonews/storage/Storage.java
--- a/src/org/sonews/storage/Storage.java	Sun Sep 11 14:19:19 2011 +0200
+++ b/src/org/sonews/storage/Storage.java	Sun Sep 11 15:05:04 2011 +0200
@@ -60,7 +60,7 @@
 	List<Pair<Long, ArticleHead>> getArticleHeads(Group group, long first, long last)
 			throws StorageBackendException;
 
-	List<Pair<Long, String>> getArticleHeaders(Channel channel, long start, long end,
+	List<Pair<Long, String>> getArticleHeaders(Group group, long start, long end,
 			String header, String pattern)
 			throws StorageBackendException;
 
@@ -74,7 +74,7 @@
 			throws StorageBackendException;
 
 	int getEventsCount(int eventType, long startTimestamp, long endTimestamp,
-			Channel channel)
+			Group group)
 			throws StorageBackendException;
 
 	double getEventsPerHour(int key, long gid)
@@ -86,7 +86,7 @@
 	Group getGroup(String name)
 			throws StorageBackendException;
 
-	List<Channel> getGroups()
+	List<Group> getGroups()
 			throws StorageBackendException;
 
 	/**
diff -r e118b4d60029 -r b78e77619152 src/org/sonews/storage/impl/HSQLDB.java
--- a/src/org/sonews/storage/impl/HSQLDB.java	Sun Sep 11 14:19:19 2011 +0200
+++ b/src/org/sonews/storage/impl/HSQLDB.java	Sun Sep 11 15:05:04 2011 +0200
@@ -18,9 +18,8 @@
 package org.sonews.storage.impl;
 
 import java.sql.SQLException;
-import org.sonews.storage.Channel;
+import org.sonews.storage.Group;
 import org.sonews.storage.Storage;
-import org.sonews.storage.StorageBackendException;
 
 /**
  * A specialized JDBCDatabase supporting HSQLDB.
@@ -39,7 +38,7 @@
 	protected void prepareCountGroupsStatement() throws SQLException {
 		this.pstmtCountGroups = conn.prepareStatement(
 				"SELECT Count(group_id) FROM groups WHERE "
-				+ "BITAND(flags, " + Channel.DELETED + ") = 0");
+				+ "BITAND(flags, " + Group.DELETED + ") = 0");
 	}
 
 	@Override
diff -r e118b4d60029 -r b78e77619152 src/org/sonews/storage/impl/JDBCDatabase.java
--- a/src/org/sonews/storage/impl/JDBCDatabase.java	Sun Sep 11 14:19:19 2011 +0200
+++ b/src/org/sonews/storage/impl/JDBCDatabase.java	Sun Sep 11 15:05:04 2011 +0200
@@ -38,7 +38,6 @@
 import org.sonews.feed.Subscription;
 import org.sonews.storage.Article;
 import org.sonews.storage.ArticleHead;
-import org.sonews.storage.Channel;
 import org.sonews.storage.Group;
 import org.sonews.storage.Storage;
 import org.sonews.storage.StorageBackendException;
@@ -106,7 +105,7 @@
 	protected void prepareCountGroupsStatement() throws SQLException {
 		this.pstmtCountGroups = conn.prepareStatement(
 				"SELECT Count(group_id) FROM groups WHERE "
-				+ "flags & " + Channel.DELETED + " = 0");
+				+ "flags & " + Group.DELETED + " = 0");
 	}
 
 	protected void prepareGetPostingsCountStatement() throws SQLException {
@@ -610,7 +609,7 @@
 	 * @throws StorageBackendException
 	 */
 	@Override
-	public List<Pair<Long, String>> getArticleHeaders(Channel group, long start,
+	public List<Pair<Long, String>> getArticleHeaders(Group group, long start,
 		long end, String headerKey, String patStr)
 		throws StorageBackendException, PatternSyntaxException
 	{
@@ -824,7 +823,7 @@
 	}
 
 	@Override
-	public int getEventsCount(int type, long start, long end, Channel channel)
+	public int getEventsCount(int type, long start, long end, Group channel)
 		throws StorageBackendException
 	{
 		ResultSet rs = null;
@@ -868,11 +867,11 @@
 	 * @throws StorageBackendException
 	 */
 	@Override
-	public List<Channel> getGroups()
+	public List<Group> getGroups()
 		throws StorageBackendException
 	{
 		ResultSet rs;
-		List<Channel> buffer = new ArrayList<Channel>();
+		List<Group> buffer = new ArrayList<Group>();
 		Statement stmt = null;
 
 		try {
diff -r e118b4d60029 -r b78e77619152 src/org/sonews/util/Purger.java
--- a/src/org/sonews/util/Purger.java	Sun Sep 11 14:19:19 2011 +0200
+++ b/src/org/sonews/util/Purger.java	Sun Sep 11 15:05:04 2011 +0200
@@ -15,7 +15,6 @@
  *   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.sonews.util;
 
 import java.util.Date;
@@ -24,7 +23,6 @@
 import org.sonews.config.Config;
 import org.sonews.storage.Article;
 import org.sonews.storage.Headers;
-import org.sonews.storage.Channel;
 import org.sonews.storage.Group;
 import org.sonews.storage.StorageBackendException;
 import org.sonews.storage.StorageManager;
@@ -37,16 +35,14 @@
  * @author Christian Lins
  * @since sonews/0.5.0
  */
-public class Purger extends AbstractDaemon
-{
+public class Purger extends AbstractDaemon {
 
 	/**
 	 * Loops through all messages and deletes them if their time
 	 * has come.
 	 */
 	@Override
-	public void run()
-	{
+	public void run() {
 		try {
 			while (isRunning()) {
 				purgeDeleted();
@@ -62,10 +58,9 @@
 	}
 
 	private void purgeDeleted()
-		throws StorageBackendException
-	{
-		List<Channel> groups = StorageManager.current().getGroups();
-		for (Channel channel : groups) {
+			throws StorageBackendException {
+		List<Group> groups = StorageManager.current().getGroups();
+		for (Group channel : groups) {
 			if (!(channel instanceof Group)) {
 				continue;
 			}
@@ -89,12 +84,11 @@
 	}
 
 	private void purgeOutdated()
-		throws InterruptedException, StorageBackendException
-	{
+			throws InterruptedException, StorageBackendException {
 		long articleMaximum =
-			Config.inst().get("sonews.article.maxnum", Long.MAX_VALUE);
+				Config.inst().get("sonews.article.maxnum", Long.MAX_VALUE);
 		long lifetime =
-			Config.inst().get("sonews.article.lifetime", -1);
+				Config.inst().get("sonews.article.lifetime", -1);
 
 		if (lifetime > 0 || articleMaximum < Stats.getInstance().getNumberOfNews()) {
 			Log.get().info("Purging old messages...");
diff -r e118b4d60029 -r b78e77619152 src/org/sonews/util/Stats.java
--- a/src/org/sonews/util/Stats.java	Sun Sep 11 14:19:19 2011 +0200
+++ b/src/org/sonews/util/Stats.java	Sun Sep 11 15:05:04 2011 +0200
@@ -15,12 +15,11 @@
  *   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.sonews.util;
 
 import java.util.Calendar;
 import org.sonews.config.Config;
-import org.sonews.storage.Channel;
+import org.sonews.storage.Group;
 import org.sonews.storage.StorageBackendException;
 import org.sonews.storage.StorageManager;
 
@@ -29,8 +28,7 @@
  * @author Christian Lins
  * @since sonews/0.5.0
  */
-public final class Stats
-{
+public final class Stats {
 
 	public static final byte CONNECTIONS = 1;
 	public static final byte POSTED_NEWS = 2;
@@ -40,15 +38,14 @@
 	public static final byte MLGW_RUNEND = 6;
 	private static Stats instance = new Stats();
 
-	public static Stats getInstance()
-	{
+	public static Stats getInstance() {
 		return Stats.instance;
 	}
 
-	private Stats()
-	{
+	private volatile int connectedClients = 0;
+
+	private Stats() {
 	}
-	private volatile int connectedClients = 0;
 
 	/**
 	 * A generic method that writes event data to the storage backend.
@@ -57,15 +54,13 @@
 	 * @param type
 	 * @param groupname
 	 */
-	private void addEvent(byte type, String groupname)
-	{
+	private void addEvent(byte type, String groupname) {
 		try {
 			if (Config.inst().get(Config.EVENTLOG, true)) {
-
-				Channel group = Channel.getByName(groupname);
+				Group group = StorageManager.current().getGroup(groupname);
 				if (group != null) {
 					StorageManager.current().addEvent(
-						System.currentTimeMillis(), type, group.getInternalID());
+							System.currentTimeMillis(), type, group.getInternalID());
 				}
 			} else {
 				Log.get().info("Group " + groupname + " does not exist.");
@@ -75,23 +70,19 @@
 		}
 	}
 
-	public void clientConnect()
-	{
+	public void clientConnect() {
 		this.connectedClients++;
 	}
 
-	public void clientDisconnect()
-	{
+	public void clientDisconnect() {
 		this.connectedClients--;
 	}
 
-	public int connectedClients()
-	{
+	public int connectedClients() {
 		return this.connectedClients;
 	}
 
-	public int getNumberOfGroups()
-	{
+	public int getNumberOfGroups() {
 		try {
 			return StorageManager.current().countGroups();
 		} catch (StorageBackendException ex) {
@@ -100,8 +91,7 @@
 		}
 	}
 
-	public int getNumberOfNews()
-	{
+	public int getNumberOfNews() {
 		try {
 			return StorageManager.current().countArticles();
 		} catch (StorageBackendException ex) {
@@ -111,8 +101,7 @@
 	}
 
 	public int getYesterdaysEvents(final byte eventType, final int hour,
-		final Channel group)
-	{
+			final Group group) {
 		// Determine the timestamp values for yesterday and the given hour
 		Calendar cal = Calendar.getInstance();
 		int year = cal.get(Calendar.YEAR);
@@ -133,33 +122,27 @@
 		}
 	}
 
-	public void mailPosted(String groupname)
-	{
+	public void mailPosted(String groupname) {
 		addEvent(POSTED_NEWS, groupname);
 	}
 
-	public void mailGatewayed(String groupname)
-	{
+	public void mailGatewayed(String groupname) {
 		addEvent(GATEWAYED_NEWS, groupname);
 	}
 
-	public void mailFeeded(String groupname)
-	{
+	public void mailFeeded(String groupname) {
 		addEvent(FEEDED_NEWS, groupname);
 	}
 
-	public void mlgwRunStart()
-	{
+	public void mlgwRunStart() {
 		addEvent(MLGW_RUNSTART, "control");
 	}
 
-	public void mlgwRunEnd()
-	{
+	public void mlgwRunEnd() {
 		addEvent(MLGW_RUNEND, "control");
 	}
 
-	private double perHour(int key, long gid)
-	{
+	private double perHour(int key, long gid) {
 		try {
 			return StorageManager.current().getEventsPerHour(key, gid);
 		} catch (StorageBackendException ex) {
@@ -168,18 +151,15 @@
 		}
 	}
 
-	public double postedPerHour(long gid)
-	{
+	public double postedPerHour(long gid) {
 		return perHour(POSTED_NEWS, gid);
 	}
 
-	public double gatewayedPerHour(long gid)
-	{
+	public double gatewayedPerHour(long gid) {
 		return perHour(GATEWAYED_NEWS, gid);
 	}
 
-	public double feededPerHour(long gid)
-	{
+	public double feededPerHour(long gid) {
 		return perHour(FEEDED_NEWS, gid);
 	}
 }