package com.oreilly.springdata.integration.ip.syslog;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.springframework.integration.Message;
import org.springframework.integration.support.MessageBuilder;
/**
* @author Gary Russell
* @since 2.2
*
*/
public class SyslogTransformer {
public static final String FACILITY = "FACILITY";
public static final String SEVERITY = "SEVERITY";
public static final String TIMESAMP = "TIMESTAMP";
public static final String HOST = "HOST";
public static final String TAG = "TAG";
public static final String MESSAGE = "MESSAGE";
public static final String UNDECODED = "UNDECODED";
private final Pattern pattern = Pattern.compile("<([^>]+)>(.{15}) ([^ ]+) ([^:]+): (.*)");
private final SimpleDateFormat dateFormat = new SimpleDateFormat("MMM dd HH:mm:ss");
public Message<Map<String, Object>> transform(Message<byte[]> message) {
String payload;
try {
payload = new String(message.getPayload(), "UTF-8");
}
catch (UnsupportedEncodingException e) {
payload = new String(message.getPayload());
}
Map<String, Object> map = new HashMap<String, Object>();
Matcher matcher = pattern.matcher(payload);
if (matcher.matches()) {
String facilityString = matcher.group(1);
int facility = Integer.parseInt(facilityString);
int severity = facility & 0x7;
facility = facility >> 3;
map.put(FACILITY, facility);
map.put(SEVERITY, severity);
String timestamp = matcher.group(2);
Date date;
try {
date = this.dateFormat.parse(timestamp);
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
calendar.setTime(date);
calendar.set(Calendar.YEAR, year);
//TODO handle midnight on Dec 31
map.put(TIMESAMP, calendar.getTime());
}
catch (Exception e) {
map.put(TIMESAMP, timestamp);
}
map.put(HOST, matcher.group(3));
map.put(TAG, matcher.group(4));
map.put(MESSAGE, matcher.group(5));
}
else {
map.put(UNDECODED, payload);
}
return MessageBuilder.withPayload(map)
.copyHeaders(message.getHeaders())
.build();
}
}