package org.atomnuke.collectd.command; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Sample: PUTVAL collect-n01.virt.xlocal/memory-fat/memory-cached interval=10 * 1351213958:23736320.000000 * * Regex: * PUTVAL\s([^/]+)/([^/-]+)(?:-([^\s]+))?/([^\-\s]+)(?:-([^\s]+))?\sinterval=([\d.]+)\s([\d.]+):([\d.]+).* * PUTVAL\s([^/]+)/([^/-]+)(?:-([^\s]+))?/([^\-\s]+)(?:-([^\s]+))?\sinterval=([\d.]+)\s([\d.]+)(?::(.+)) * * Result: $1 [collect-n01.virt.xlocal] $2 [memory] $3 [fat] $4 [memory] $5 * [cached] $6 [10] $7 [1351213958] $8 [23736320.000000] * * @author zinic */ public class PutValParser { private static final Pattern PUTVAL_COMMAND_PATTERN = Pattern.compile("PUTVAL\\s([^/]+)/([^/-]+)(?:-([^\\s]+))?/([^\\-\\s]+)(?:-([^\\s]+))?\\sinterval=([\\d.]+)\\s([\\d.]+):([\\d.]+).*"); private static final int HOST = 1, PLUGIN = 2, PLUGIN_INSTANCE = 3, TYPE = 4, TYPE_INSTANCE = 5, INTERVAL = 6, TIMESTAMP = 7, VALUE = 8; private static final PutValParser INSTANCE = new PutValParser(); public static PutValParser instance() { return INSTANCE; } private PutValParser() { } public PutValCommand parse(String line) { final Matcher matcher = PUTVAL_COMMAND_PATTERN.matcher(line); if (!matcher.matches()) { return null; } return new PutValCommand(matcher.group(HOST), matcher.group(PLUGIN), matcher.group(PLUGIN_INSTANCE), matcher.group(TYPE), matcher.group(TYPE_INSTANCE), matcher.group(INTERVAL), matcher.group(TIMESTAMP), matcher.group(VALUE)); } }