src/org/sonews/util/Stats.java
author cli
Sun Sep 11 15:05:04 2011 +0200 (2011-09-11)
changeset 48 b78e77619152
parent 37 74139325d305
child 49 8df94bfd3e2f
permissions -rwxr-xr-x
Merge Channel and Group classes.
chris@1
     1
/*
chris@1
     2
 *   SONEWS News Server
chris@1
     3
 *   see AUTHORS for the list of contributors
chris@1
     4
 *
chris@1
     5
 *   This program is free software: you can redistribute it and/or modify
chris@1
     6
 *   it under the terms of the GNU General Public License as published by
chris@1
     7
 *   the Free Software Foundation, either version 3 of the License, or
chris@1
     8
 *   (at your option) any later version.
chris@1
     9
 *
chris@1
    10
 *   This program is distributed in the hope that it will be useful,
chris@1
    11
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
chris@1
    12
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
chris@1
    13
 *   GNU General Public License for more details.
chris@1
    14
 *
chris@1
    15
 *   You should have received a copy of the GNU General Public License
chris@1
    16
 *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
chris@1
    17
 */
chris@1
    18
package org.sonews.util;
chris@1
    19
chris@1
    20
import java.util.Calendar;
chris@3
    21
import org.sonews.config.Config;
cli@48
    22
import org.sonews.storage.Group;
chris@3
    23
import org.sonews.storage.StorageBackendException;
chris@3
    24
import org.sonews.storage.StorageManager;
chris@1
    25
chris@1
    26
/**
chris@1
    27
 * Class that capsulates statistical data gathering.
chris@1
    28
 * @author Christian Lins
chris@1
    29
 * @since sonews/0.5.0
chris@1
    30
 */
cli@48
    31
public final class Stats {
chris@1
    32
cli@37
    33
	public static final byte CONNECTIONS = 1;
cli@37
    34
	public static final byte POSTED_NEWS = 2;
cli@37
    35
	public static final byte GATEWAYED_NEWS = 3;
cli@37
    36
	public static final byte FEEDED_NEWS = 4;
cli@37
    37
	public static final byte MLGW_RUNSTART = 5;
cli@37
    38
	public static final byte MLGW_RUNEND = 6;
cli@37
    39
	private static Stats instance = new Stats();
chris@3
    40
cli@48
    41
	public static Stats getInstance() {
cli@37
    42
		return Stats.instance;
cli@37
    43
	}
cli@31
    44
cli@48
    45
	private volatile int connectedClients = 0;
cli@48
    46
cli@48
    47
	private Stats() {
cli@37
    48
	}
cli@37
    49
cli@37
    50
	/**
cli@37
    51
	 * A generic method that writes event data to the storage backend.
cli@37
    52
	 * If event logging is disabled with sonews.eventlog=false this method
cli@37
    53
	 * simply does nothing.
cli@37
    54
	 * @param type
cli@37
    55
	 * @param groupname
cli@37
    56
	 */
cli@48
    57
	private void addEvent(byte type, String groupname) {
cli@37
    58
		try {
cli@37
    59
			if (Config.inst().get(Config.EVENTLOG, true)) {
cli@48
    60
				Group group = StorageManager.current().getGroup(groupname);
cli@37
    61
				if (group != null) {
cli@37
    62
					StorageManager.current().addEvent(
cli@48
    63
							System.currentTimeMillis(), type, group.getInternalID());
cli@37
    64
				}
cli@37
    65
			} else {
cli@37
    66
				Log.get().info("Group " + groupname + " does not exist.");
cli@37
    67
			}
cli@37
    68
		} catch (StorageBackendException ex) {
cli@37
    69
			ex.printStackTrace();
cli@37
    70
		}
cli@37
    71
	}
cli@37
    72
cli@48
    73
	public void clientConnect() {
cli@37
    74
		this.connectedClients++;
cli@37
    75
	}
cli@37
    76
cli@48
    77
	public void clientDisconnect() {
cli@37
    78
		this.connectedClients--;
cli@37
    79
	}
cli@37
    80
cli@48
    81
	public int connectedClients() {
cli@37
    82
		return this.connectedClients;
cli@37
    83
	}
cli@37
    84
cli@48
    85
	public int getNumberOfGroups() {
cli@37
    86
		try {
cli@37
    87
			return StorageManager.current().countGroups();
cli@37
    88
		} catch (StorageBackendException ex) {
cli@37
    89
			ex.printStackTrace();
cli@37
    90
			return -1;
cli@37
    91
		}
cli@37
    92
	}
cli@37
    93
cli@48
    94
	public int getNumberOfNews() {
cli@37
    95
		try {
cli@37
    96
			return StorageManager.current().countArticles();
cli@37
    97
		} catch (StorageBackendException ex) {
cli@37
    98
			ex.printStackTrace();
cli@37
    99
			return -1;
cli@37
   100
		}
cli@37
   101
	}
cli@37
   102
cli@37
   103
	public int getYesterdaysEvents(final byte eventType, final int hour,
cli@48
   104
			final Group group) {
cli@37
   105
		// Determine the timestamp values for yesterday and the given hour
cli@37
   106
		Calendar cal = Calendar.getInstance();
cli@37
   107
		int year = cal.get(Calendar.YEAR);
cli@37
   108
		int month = cal.get(Calendar.MONTH);
cli@37
   109
		int dayom = cal.get(Calendar.DAY_OF_MONTH) - 1; // Yesterday
cli@37
   110
cli@37
   111
		cal.set(year, month, dayom, hour, 0, 0);
cli@37
   112
		long startTimestamp = cal.getTimeInMillis();
cli@37
   113
cli@37
   114
		cal.set(year, month, dayom, hour + 1, 0, 0);
cli@37
   115
		long endTimestamp = cal.getTimeInMillis();
cli@37
   116
cli@37
   117
		try {
cli@37
   118
			return StorageManager.current().getEventsCount(eventType, startTimestamp, endTimestamp, group);
cli@37
   119
		} catch (StorageBackendException ex) {
cli@37
   120
			ex.printStackTrace();
cli@37
   121
			return -1;
cli@37
   122
		}
cli@37
   123
	}
cli@37
   124
cli@48
   125
	public void mailPosted(String groupname) {
cli@37
   126
		addEvent(POSTED_NEWS, groupname);
cli@37
   127
	}
cli@37
   128
cli@48
   129
	public void mailGatewayed(String groupname) {
cli@37
   130
		addEvent(GATEWAYED_NEWS, groupname);
cli@37
   131
	}
cli@37
   132
cli@48
   133
	public void mailFeeded(String groupname) {
cli@37
   134
		addEvent(FEEDED_NEWS, groupname);
cli@37
   135
	}
cli@37
   136
cli@48
   137
	public void mlgwRunStart() {
cli@37
   138
		addEvent(MLGW_RUNSTART, "control");
cli@37
   139
	}
cli@37
   140
cli@48
   141
	public void mlgwRunEnd() {
cli@37
   142
		addEvent(MLGW_RUNEND, "control");
cli@37
   143
	}
cli@37
   144
cli@48
   145
	private double perHour(int key, long gid) {
cli@37
   146
		try {
cli@37
   147
			return StorageManager.current().getEventsPerHour(key, gid);
cli@37
   148
		} catch (StorageBackendException ex) {
cli@37
   149
			ex.printStackTrace();
cli@37
   150
			return -1;
cli@37
   151
		}
cli@37
   152
	}
cli@37
   153
cli@48
   154
	public double postedPerHour(long gid) {
cli@37
   155
		return perHour(POSTED_NEWS, gid);
cli@37
   156
	}
cli@37
   157
cli@48
   158
	public double gatewayedPerHour(long gid) {
cli@37
   159
		return perHour(GATEWAYED_NEWS, gid);
cli@37
   160
	}
cli@37
   161
cli@48
   162
	public double feededPerHour(long gid) {
cli@37
   163
		return perHour(FEEDED_NEWS, gid);
cli@37
   164
	}
chris@1
   165
}