Files
G4G0-1/Semester 1/Programming 1/Java/examples/projects/chapter07/weblog-analyzer/LogEntry.java
2024-01-15 20:14:10 +00:00

140 lines
4.1 KiB
Java
Executable File

import java.util.Calendar;
/**
* Store the data from a single line of a
* web-server log file.
* Individual fields are made available via
* accessors such as getHour() and getMinute().
*
* @author David J. Barnes and Michael Kölling.
* @version 2016.02.29
*/
public class LogEntry implements Comparable<LogEntry>
{
// Where the data values extracted from a single
// log line are stored.
private int[] dataValues;
// The equivalent Calendar object for the log time.
private Calendar when;
// At which index in dataValues the different fields
// from a log line are stored.
private static final int YEAR = 0, MONTH = 1, DAY = 2,
HOUR = 3, MINUTE = 4;
// The number of fields. If more fields are added, e.g. for
// seconds or a status code, then this value must be increased
// to match.
private static final int NUMBER_OF_FIELDS = 5;
/**
* Decompose a log line so that the individual fields
* are available.
* @param logline A single line from the log.
* This should be in the format:
* year month day hour minute etc.
*/
public LogEntry(String logline)
{
// The array to store the data for a single line.
dataValues = new int[NUMBER_OF_FIELDS];
// Break up the log line.
LoglineTokenizer tokenizer = new LoglineTokenizer();
tokenizer.tokenize(logline,dataValues);
setWhen();
}
/**
* Create a LogEntry from the individual components.
* @param year The year
* @param month The month (1-12)
* @param day The day (1-31)
* @param hour The hour (0-23)
* @param minute The minute (0-59)
*/
public LogEntry(int year, int month, int day, int hour, int minute)
{
// The array to store the data for a single line.
dataValues = new int[NUMBER_OF_FIELDS];
dataValues[YEAR] = year;
dataValues[MONTH] = month;
dataValues[DAY] = day;
dataValues[HOUR] = hour;
dataValues[MINUTE] = minute;
setWhen();
}
/**
* Return the hour.
* @return The hour field from the log line.
*/
public int getHour()
{
return dataValues[HOUR];
}
/**
* Return the minute.
* @return The minute field from the log line.
*/
public int getMinute()
{
return dataValues[MINUTE];
}
/**
* Create a string representation of the data.
* This is not necessarily identical with the
* text of the original log line.
* @return A string representing the data of this entry.
*/
public String toString()
{
StringBuffer buffer = new StringBuffer();
for(int value : dataValues) {
// Prefix a leading zero on single digit numbers.
if(value < 10) {
buffer.append('0');
}
buffer.append(value);
buffer.append(' ');
}
// Drop any trailing space.
return buffer.toString().trim();
}
/**
* Compare the date/time combination of this log entry
* with another.
* @param otherEntry The other entry to compare against.
* @return A negative value if this entry comes before the other.
* A positive value if this entry comes after the other.
* Zero if the entries are the same.
*/
public int compareTo(LogEntry otherEntry)
{
// Use the equivalent Calendars comparison method.
return when.compareTo(otherEntry.getWhen());
}
/**
* Return the Calendar object representing this event.
* @return The Calendar for this event.
*/
private Calendar getWhen()
{
return when;
}
/**
* Create an equivalent Calendar object from the data values.
*/
private void setWhen()
{
when = Calendar.getInstance();
// Adjust from 1-based month and day to 0-based.
when.set(dataValues[YEAR],
dataValues[MONTH] - 1, dataValues[DAY] - 1,
dataValues[HOUR], dataValues[MINUTE]);
}
}