metron-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ceste...@apache.org
Subject [60/89] [abbrv] incubator-metron git commit: Move all com/apache folders to org/apache
Date Tue, 26 Jan 2016 14:18:38 GMT
http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/3854e075/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/GrokAsaParser.java
----------------------------------------------------------------------
diff --git a/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/GrokAsaParser.java b/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/GrokAsaParser.java
deleted file mode 100644
index f91d4db..0000000
--- a/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/GrokAsaParser.java
+++ /dev/null
@@ -1,269 +0,0 @@
-package com.apache.metron.parsing.parsers;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Serializable;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-import java.util.TimeZone;
-
-import oi.thekraken.grok.api.Grok;
-import oi.thekraken.grok.api.Match;
-import oi.thekraken.grok.api.exception.GrokException;
-
-import org.apache.commons.io.IOUtils;
-import org.json.simple.JSONObject;
-
-public class GrokAsaParser extends AbstractParser implements Serializable {
-
-	private static final long serialVersionUID = 945353287115350798L;
-	private transient  Grok  grok;
-	Map<String, String> patternMap;
-	private transient  Map<String, Grok> grokMap;
-	private transient  InputStream pattern_url;
-
-	public static final String PREFIX = "stream2file";
-	public static final String SUFFIX = ".tmp";
-
-	public static File stream2file(InputStream in) throws IOException {
-		final File tempFile = File.createTempFile(PREFIX, SUFFIX);
-		tempFile.deleteOnExit();
-		try (FileOutputStream out = new FileOutputStream(tempFile)) {
-			IOUtils.copy(in, out);
-		}
-		return tempFile;
-	}
-
-	public GrokAsaParser() throws Exception {
-		// pattern_url = Resources.getResource("patterns/asa");
-
-		pattern_url = getClass().getClassLoader().getResourceAsStream(
-				"patterns/asa");
-
-		File file = stream2file(pattern_url);
-		grok = Grok.create(file.getPath());
-
-		patternMap = getPatternMap();
-		grokMap = getGrokMap();
-
-		grok.compile("%{CISCO_TAGGED_SYSLOG}");
-	}
-
-	public GrokAsaParser(String filepath) throws Exception {
-
-		grok = Grok.create(filepath);
-		// grok.getNamedRegexCollection().put("ciscotag","CISCOFW302013_302014_302015_302016");
-		grok.compile("%{CISCO_TAGGED_SYSLOG}");
-
-	}
-
-	public GrokAsaParser(String filepath, String pattern) throws Exception {
-
-		grok = Grok.create(filepath);
-		grok.compile("%{" + pattern + "}");
-	}
-
-	private Map<String, Object> getMap(String pattern, String text)
-			throws GrokException {
-
-		Grok g = grokMap.get(pattern);
-		if (g != null) {
-			Match gm = g.match(text);
-			gm.captures();
-			return gm.toMap();
-		} else {
-			return new HashMap<String, Object>();
-		}
-
-	}
-
-	private Map<String, Grok> getGrokMap() throws GrokException, IOException {
-		Map<String, Grok> map = new HashMap<String, Grok>();
-
-		for (Map.Entry<String, String> entry : patternMap.entrySet()) {
-			File file = stream2file(pattern_url);
-			Grok grok = Grok.create(file.getPath());
-			grok.compile("%{" + entry.getValue() + "}");
-
-			map.put(entry.getValue(), grok);
-
-		}
-
-		return map;
-	}
-
-	private Map<String, String> getPatternMap() {
-		Map<String, String> map = new HashMap<String, String>();
-
-		map.put("ASA-2-106001", "CISCOFW106001");
-		map.put("ASA-2-106006", "CISCOFW106006_106007_106010");
-		map.put("ASA-2-106007", "CISCOFW106006_106007_106010");
-		map.put("ASA-2-106010", "CISCOFW106006_106007_106010");
-		map.put("ASA-3-106014", "CISCOFW106014");
-		map.put("ASA-6-106015", "CISCOFW106015");
-		map.put("ASA-1-106021", "CISCOFW106021");
-		map.put("ASA-4-106023", "CISCOFW106023");
-		map.put("ASA-5-106100", "CISCOFW106100");
-		map.put("ASA-6-110002", "CISCOFW110002");
-		map.put("ASA-6-302010", "CISCOFW302010");
-		map.put("ASA-6-302013", "CISCOFW302013_302014_302015_302016");
-		map.put("ASA-6-302014", "CISCOFW302013_302014_302015_302016");
-		map.put("ASA-6-302015", "CISCOFW302013_302014_302015_302016");
-		map.put("ASA-6-302016", "CISCOFW302013_302014_302015_302016");
-		map.put("ASA-6-302020", "CISCOFW302020_302021");
-		map.put("ASA-6-302021", "CISCOFW302020_302021");
-		map.put("ASA-6-305011", "CISCOFW305011");
-		map.put("ASA-3-313001", "CISCOFW313001_313004_313008");
-		map.put("ASA-3-313004", "CISCOFW313001_313004_313008");
-		map.put("ASA-3-313008", "CISCOFW313001_313004_313008");
-		map.put("ASA-4-313005", "CISCOFW313005");
-		map.put("ASA-4-402117", "CISCOFW402117");
-		map.put("ASA-4-402119", "CISCOFW402119");
-		map.put("ASA-4-419001", "CISCOFW419001");
-		map.put("ASA-4-419002", "CISCOFW419002");
-		map.put("ASA-4-500004", "CISCOFW500004");
-		map.put("ASA-6-602303", "CISCOFW602303_602304");
-		map.put("ASA-6-602304", "CISCOFW602303_602304");
-		map.put("ASA-7-710001", "CISCOFW710001_710002_710003_710005_710006");
-		map.put("ASA-7-710002", "CISCOFW710001_710002_710003_710005_710006");
-		map.put("ASA-7-710003", "CISCOFW710001_710002_710003_710005_710006");
-		map.put("ASA-7-710005", "CISCOFW710001_710002_710003_710005_710006");
-		map.put("ASA-7-710006", "CISCOFW710001_710002_710003_710005_710006");
-		map.put("ASA-6-713172", "CISCOFW713172");
-		map.put("ASA-4-733100", "CISCOFW733100");
-		map.put("ASA-6-305012", "CISCOFW305012");
-		map.put("ASA-7-609001", "CISCOFW609001");
-		map.put("ASA-7-609002", "CISCOFW609002");
-
-		return map;
-	}
-
-	public static Long convertToEpoch(String m, String d, String ts,
-			boolean adjust_timezone) throws ParseException {
-		d = d.trim();
-
-		if (d.length() <= 2)
-			d = "0" + d;
-
-		Date date = new SimpleDateFormat("MMM", Locale.ENGLISH).parse(m);
-		Calendar cal = Calendar.getInstance();
-		cal.setTime(date);
-		String month = String.valueOf(cal.get(Calendar.MONTH));
-		int year = Calendar.getInstance().get(Calendar.YEAR);
-
-		if (month.length() <= 2)
-			month = "0" + month;
-
-		String coglomerated_ts = year + "-" + month + "-" + d + " " + ts;
-
-		System.out.println(coglomerated_ts);
-
-		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-
-		if (adjust_timezone)
-			sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
-
-		date = sdf.parse(coglomerated_ts);
-		long timeInMillisSinceEpoch = date.getTime();
-
-		return timeInMillisSinceEpoch;
-	}
-	
-	@Override
-	public void init() {
-		// pattern_url = Resources.getResource("patterns/asa");
-
-				pattern_url = getClass().getClassLoader().getResourceAsStream(
-						"patterns/asa");
-
-				File file = null;
-				try {
-					file = stream2file(pattern_url);
-				} catch (IOException e) {
-					// TODO Auto-generated catch block
-					e.printStackTrace();
-				}
-				try {
-					grok = Grok.create(file.getPath());
-				} catch (GrokException e) {
-					// TODO Auto-generated catch block
-					e.printStackTrace();
-				}
-
-				patternMap = getPatternMap();
-				try {
-					grokMap = getGrokMap();
-				} catch (GrokException | IOException e1) {
-					// TODO Auto-generated catch block
-					e1.printStackTrace();
-				}
-
-				try {
-					grok.compile("%{CISCO_TAGGED_SYSLOG}");
-				} catch (GrokException e) {
-					// TODO Auto-generated catch block
-					e.printStackTrace();
-				}
-	}
-
-	@Override
-	public JSONObject parse(byte[] raw_message) {
-
-		String toParse = "";
-		JSONObject toReturn;
-
-		try {
-
-			toParse = new String(raw_message, "UTF-8");
-
-			System.out.println("Received message: " + toParse);
-
-			Match gm = grok.match(toParse);
-			gm.captures();
-
-			toReturn = new JSONObject();
-
-			toReturn.putAll(gm.toMap());
-
-			String str = toReturn.get("ciscotag").toString();
-			String pattern = patternMap.get(str);
-
-			Map<String, Object> response = getMap(pattern, toParse);
-
-			toReturn.putAll(response);
-
-			//System.out.println("*******I MAPPED: " + toReturn);
-
-			toReturn.put("timestamp", convertToEpoch(toReturn.get("MONTH").toString(), toReturn
-					.get("MONTHDAY").toString(), 
-					toReturn.get("TIME").toString(),
-					true));
-			
-			toReturn.remove("MONTHDAY");
-			toReturn.remove("TIME");
-			toReturn.remove("MINUTE");
-			toReturn.remove("HOUR");
-			toReturn.remove("YEAR");
-			toReturn.remove("SECOND");
-			
-			toReturn.put("ip_src_addr", toReturn.remove("IPORHOST"));
-			toReturn.put("original_string", toParse);
-
-			return toReturn;
-
-		} catch (Exception e) {
-			e.printStackTrace();
-			return null;
-		}
-
-	}
-
-	
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/3854e075/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/GrokSourcefireParser.java
----------------------------------------------------------------------
diff --git a/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/GrokSourcefireParser.java b/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/GrokSourcefireParser.java
deleted file mode 100644
index 12c0b62..0000000
--- a/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/GrokSourcefireParser.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package com.apache.metron.parsing.parsers;
-
-import java.net.URL;
-
-import oi.thekraken.grok.api.Match;
-import oi.thekraken.grok.api.Grok;
-import oi.thekraken.grok.api.exception.GrokException;
-
-import org.json.simple.JSONObject;
-
-
-public class GrokSourcefireParser extends AbstractParser{
-	
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	Grok grok;
-	
-	public GrokSourcefireParser() throws GrokException
-	{
-		URL pattern_url = getClass().getClassLoader().getResource(
-				"pattarns/sourcefire");
-		grok = Grok.create(pattern_url.getFile());
-		grok.compile("%{SOURCEFIRE}");
-	}
-
-	public GrokSourcefireParser(String filepath) throws GrokException
-	{
-
-		grok = Grok.create(filepath);
-		grok.compile("%{SOURCEFIRE}");
-	}
-	
-	public GrokSourcefireParser(String filepath, String pattern) throws GrokException
-	{
-
-		grok = Grok.create(filepath);
-		grok.compile("%{"+pattern+"}");
-	}
-	
-	@Override
-	public JSONObject parse(byte[] raw_message) {
-		JSONObject payload = new JSONObject();
-		String toParse = "";
-		JSONObject toReturn;
-		
-
-		try {
-
-			toParse = new String(raw_message, "UTF-8");
-			Match gm = grok.match(toParse);
-			gm.captures();
-			
-			toReturn = new JSONObject();
-			
-			toReturn.putAll(gm.toMap());
-			toReturn.remove("SOURCEFIRE");
-			String proto = toReturn.get("protocol").toString();
-			proto = proto.replace("{", "");
-			proto = proto.replace("}", "");
-			toReturn.put("protocol", proto);
-			return toReturn;
-			
-		}
-		catch(Exception e)
-		{
-			e.printStackTrace();
-			return null;
-		}
-		
-	}
-
-	
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/3854e075/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/GrokUtils.java
----------------------------------------------------------------------
diff --git a/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/GrokUtils.java b/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/GrokUtils.java
deleted file mode 100644
index b712795..0000000
--- a/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/GrokUtils.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.apache.metron.parsing.parsers;
-import java.io.Serializable;
-
-import com.google.code.regexp.Pattern;
-
-public class GrokUtils implements Serializable {
-
-	private static final long serialVersionUID = 7465176887422419286L;
-	/**
-	   * Extract Grok patter like %{FOO} to FOO, Also Grok pattern with semantic.
-	   */
-	  public static final Pattern GROK_PATTERN = Pattern.compile(
-	      "%\\{" +
-	      "(?<name>" +
-	        "(?<pattern>[A-z0-9]+)" +
-	          "(?::(?<subname>[A-z0-9_:;\\/\\s\\.]+))?" +
-	          ")" +
-	          "(?:=(?<definition>" +
-	            "(?:" +
-	            "(?:[^{}]+|\\.+)+" +
-	            ")+" +
-	            ")" +
-	      ")?" +
-	      "\\}");
-
-	}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/3854e075/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/JSONCleaner.java
----------------------------------------------------------------------
diff --git a/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/JSONCleaner.java b/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/JSONCleaner.java
deleted file mode 100644
index 5de2ad7..0000000
--- a/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/JSONCleaner.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package com.apache.metron.parsing.parsers;
-
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
-import org.json.simple.parser.ParseException;
-
-/**
- * @author kiran
- *
- */
-public class JSONCleaner implements Serializable {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-
-
-	/**
-	 * @param jsonString
-	 * @return
-	 * @throws ParseException
-	 * Takes a json String as input and removes any Special Chars (^ a-z A-Z 0-9) in the keys
-	 */
-	@SuppressWarnings({"unchecked","rawtypes"})
-	public JSONObject Clean(String jsonString) throws ParseException
-	{
-		JSONParser parser = new JSONParser();
-		
-		
-		Map json = (Map) parser.parse(jsonString);
-		JSONObject output = new JSONObject();
-	    Iterator iter = json.entrySet().iterator();
-
-		 while(iter.hasNext()){
-		      Map.Entry entry = (Map.Entry)iter.next();
-		      
-		      String key = ((String)entry.getKey()).replaceAll("[^\\._a-zA-Z0-9]+","");
-		      output.put(key, entry.getValue());
-		    }
-
-		return output;
-	}
-	
-	
-	@SuppressWarnings({ "unchecked", "rawtypes", "unused" })
-	public static void main(String args[])
-	{
-		String jsonText = "{\"first_1\": 123, \"second\": [4, 5, 6], \"third\": 789}";
-		JSONCleaner cleaner = new JSONCleaner();
-		try {
-			//cleaner.Clean(jsonText);
-			Map obj=new HashMap();
-			  obj.put("name","foo");
-			  obj.put("num",new Integer(100));
-			  obj.put("balance",new Double(1000.21));
-			  obj.put("is_vip",new Boolean(true));
-			  obj.put("nickname",null);
-			Map obj1 = new HashMap();
-			obj1.put("sourcefile", obj);
-			
-			JSONObject json = new JSONObject(obj1);
-			System.out.println(json);
-			  
-			  
-			  
-			  System.out.print(jsonText);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-	
-}

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/3854e075/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/MetronConverter.java
----------------------------------------------------------------------
diff --git a/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/MetronConverter.java b/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/MetronConverter.java
deleted file mode 100644
index e81a299..0000000
--- a/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/MetronConverter.java
+++ /dev/null
@@ -1,183 +0,0 @@
-package com.apache.metron.parsing.parsers;
-
-import java.io.Serializable;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-public class MetronConverter implements Serializable {
-	
-	private static final long serialVersionUID = 4319897815285922962L;
-	public static Map<String, IConverter<?>> _converters = new HashMap<String, IConverter<?>>();
-
-	static {
-		_converters.put("byte", new ByteConverter());
-		_converters.put("boolean", new BooleanConverter());
-		_converters.put("short", new ShortConverter());
-		_converters.put("int", new IntegerConverter());
-		_converters.put("long", new LongConverter());
-		_converters.put("float", new FloatConverter());
-		_converters.put("double", new DoubleConverter());
-		_converters.put("date", new DateConverter());
-		_converters.put("datetime", new DateConverter());
-		_converters.put("string", new StringConverter());
-
-	}
-	
-	private static IConverter getConverter(String key) throws Exception {
-		IConverter converter = _converters.get(key);
-		if (converter == null) {
-			throw new Exception("Invalid data type :" + key);
-		}
-		return converter;
-	}
-	
-	public static KeyValue convert(String key, Object value) {
-		String[] spec = key.split(";");
-		try {
-			if (spec.length == 1) {
-				return new KeyValue(spec[0], value);
-			} else if (spec.length == 2) {
-				return new KeyValue(spec[0], getConverter(spec[1]).convert(String.valueOf(value)));
-			} else if (spec.length == 3) {
-				return new KeyValue(spec[0], getConverter(spec[1]).convert(String.valueOf(value), spec[2]));
-			} else {
-				return new KeyValue(spec[0], value, "Unsupported spec :" + key);
-			}
-		} catch (Exception e) {
-			return new KeyValue(spec[0], value, e.toString());
-		}
-	}
-}
-
-
-//
-// KeyValue
-//
-
-class KeyValue {
-
-	private String key = null;
-	private Object value = null;
-	private String grokFailure = null;
-	
-	public KeyValue(String key, Object value) {
-		this.key = key;
-		this.value = value;
-	}
-	
-	public KeyValue(String key, Object value, String grokFailure) {
-		this.key = key;
-		this.value = value;
-		this.grokFailure = grokFailure;
-	}
-
-	public boolean hasGrokFailure() {
-		return grokFailure != null;
-	}
-
-	public String getGrokFailure() {
-		return this.grokFailure;
-	}
-
-	public String getKey() {
-		return key;
-	}
-
-	public void setKey(String key) {
-		this.key = key;
-	}
-
-	public Object getValue() {
-		return value;
-	}
-
-	public void setValue(Object value) {
-		this.value = value;
-	}
-}
-
-
-//
-// Converters
-//
-abstract class IConverter<T> {
-	
-	public T convert(String value, String informat) throws Exception {
-		return null;
-	}
-	
-	public abstract T convert(String value) throws Exception;
-}
-
-class ByteConverter extends IConverter<Byte> {
-	@Override
-	public Byte convert(String value) throws Exception {
-		return Byte.parseByte(value);
-	}
-}
-
-class BooleanConverter extends IConverter<Boolean> {
-	@Override
-	public Boolean convert(String value) throws Exception {
-		return Boolean.parseBoolean(value);
-	}
-}
-
-class ShortConverter extends IConverter<Short> {
-	@Override
-	public Short convert(String value) throws Exception {
-		return Short.parseShort(value);
-	}
-}
-
-class IntegerConverter extends IConverter<Integer> {
-	@Override
-	public Integer convert(String value) throws Exception {
-		return Integer.parseInt(value);
-	}
-}
-
-class LongConverter extends IConverter<Long> {
-	@Override
-	public Long convert(String value) throws Exception {
-		return Long.parseLong(value);
-	}
-}
-
-class FloatConverter extends IConverter<Float> {
-	@Override
-	public Float convert(String value) throws Exception {
-		return Float.parseFloat(value);
-	}
-}
-
-class DoubleConverter extends IConverter<Double> {
-	@Override
-	public Double convert(String value) throws Exception {
-		return Double.parseDouble(value);
-	}
-}
-
-class StringConverter extends IConverter<String> {
-	@Override
-	public String convert(String value) throws Exception {
-		return value;
-	}
-}
-
-class DateConverter extends IConverter<Date> {
-	@Override
-	public Date convert(String value) throws Exception {
-		return DateFormat.getInstance().parse(value);
-	}
-	
-	@Override
-	public Date convert(String value, String informat) throws Exception {
-		SimpleDateFormat formatter =  new SimpleDateFormat(informat);
-		return formatter.parse(value);
-	}
-	
-}

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/3854e075/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/MetronGarbage.java
----------------------------------------------------------------------
diff --git a/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/MetronGarbage.java b/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/MetronGarbage.java
deleted file mode 100644
index f05a128..0000000
--- a/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/MetronGarbage.java
+++ /dev/null
@@ -1,130 +0,0 @@
-package com.apache.metron.parsing.parsers;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-public class MetronGarbage implements Serializable {
-
-	private static final long serialVersionUID = -7158895945268018603L;
-	private List<String> toRemove;
-	  private Map<String, Object> toRename;
-
-	  /**
-	   * Create a new {@code Garbage} object.
-	   */
-	  public MetronGarbage() {
-
-	    toRemove = new ArrayList<String>();
-	    toRename = new TreeMap<String, Object>();
-	    /** this is a default value to remove */
-	    toRemove.add("UNWANTED");
-	  }
-
-	  /**
-	   * Set a new name to be change when exporting the final output.
-	   *
-	   * @param origin : original field name
-	   * @param value : New field name to apply
-	   */
-	  public void addToRename(String origin, Object value) {
-	    if (origin == null || value == null) {
-	      return;
-	    }
-
-	    if (!origin.isEmpty() && !value.toString().isEmpty()) {
-	      toRename.put(origin, value);
-	    }
-	  }
-
-	  /**
-	   * Set a field to be remove when exporting the final output.
-	   *
-	   * @param name of the field to remove
-	   */
-	  public void addToRemove(String name) {
-	    if (name == null) {
-	      return;
-	    }
-
-	    if (!name.isEmpty()) {
-	      toRemove.add(name);
-	    }
-	  }
-
-	  /**
-	   * Set a list of field name to be remove when exporting the final output.
-	   *
-	   * @param lst
-	   */
-	  public void addToRemove(List<String> lst) {
-	    if (lst == null) {
-	      return;
-	    }
-
-	    if (!lst.isEmpty()) {
-	      toRemove.addAll(lst);
-	    }
-	  }
-
-	  /**
-	   * Remove from the map the unwilling items.
-	   *
-	   * @param map to clean
-	   * @return nb of deleted item
-	   */
-	  public int remove(Map<String, Object> map) {
-	    int item = 0;
-
-	    if (map == null) {
-	      return item;
-	    }
-
-	    if (map.isEmpty()) {
-	      return item;
-	    }
-
-	    for (Iterator<Map.Entry<String, Object>> it = map.entrySet().iterator(); it.hasNext();) {
-	      Map.Entry<String, Object> entry = it.next();
-	      for (int i = 0; i < toRemove.size(); i++) {
-	        if (entry.getKey().equals(toRemove.get(i))) {
-	          it.remove();
-	          item++;
-	        }
-	      }
-	    }
-	    return item;
-	  }
-
-	  /**
-	   * Rename the item from the map.
-	   *
-	   * @param map
-	   * @return nb of renamed items
-	   */
-	  public int rename(Map<String, Object> map) {
-	    int item = 0;
-
-	    if (map == null) {
-	      return item;
-	    }
-
-	    if (map.isEmpty() || toRename.isEmpty()) {
-	      return item;
-	    }
-
-	    for (Iterator<Map.Entry<String, Object>> it = toRename.entrySet().iterator(); it.hasNext();) {
-	      Map.Entry<String, Object> entry = it.next();
-	      if (map.containsKey(entry.getKey())) {
-	        Object obj = map.remove(entry.getKey());
-	        map.put(entry.getValue().toString(), obj);
-	        item++;
-	      }
-	    }
-	    return item;
-	  }
-
-	}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/3854e075/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/MetronGrok.java
----------------------------------------------------------------------
diff --git a/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/MetronGrok.java b/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/MetronGrok.java
deleted file mode 100644
index 3830e6b..0000000
--- a/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/MetronGrok.java
+++ /dev/null
@@ -1,367 +0,0 @@
-package com.apache.metron.parsing.parsers;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.Reader;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.google.code.regexp.Matcher;
-import com.google.code.regexp.Pattern;
-
-public class MetronGrok implements Serializable {
-
-	private static final long serialVersionUID = 2002441320075020721L;
-	private static final Logger LOG = LoggerFactory.getLogger(MetronGrok.class);
-	  /**
-	   * Named regex of the originalGrokPattern.
-	   */
-	  private String namedRegex;
-	  /**
-	   * Map of the named regex of the originalGrokPattern
-	   * with id = namedregexid and value = namedregex.
-	   */
-	  private Map<String, String> namedRegexCollection;
-	  /**
-	   * Original {@code Grok} pattern (expl: %{IP}).
-	   */
-	  private String originalGrokPattern;
-	  /**
-	   * Pattern of the namedRegex.
-	   */
-	  private Pattern compiledNamedRegex;
-	  /**
-	   * {@code Grok} discovery.
-	   */
-	  private Map<String, String> grokPatternDefinition;
-
-	  /** only use in grok discovery. */
-	  private String savedPattern;
-
-	  /**
-	   * Create Empty {@code Grok}.
-	   */
-	  public static final MetronGrok EMPTY = new MetronGrok();
-
-	  /**
-	   * Create a new <i>empty</i>{@code Grok} object.
-	   */
-	  public MetronGrok() {
-	    originalGrokPattern = StringUtils.EMPTY;
-	    namedRegex = StringUtils.EMPTY;
-	    compiledNamedRegex = null;
-	    grokPatternDefinition = new TreeMap<String, String>();
-	    namedRegexCollection = new TreeMap<String, String>();
-	    savedPattern = StringUtils.EMPTY;
-	  }
-
-	  public String getSaved_pattern() {
-	    return savedPattern;
-	  }
-
-	  public void setSaved_pattern(String savedpattern) {
-	    this.savedPattern = savedpattern;
-	  }
-
-	  /**
-	   * Create a {@code Grok} instance with the given patterns file and
-	   * a {@code Grok} pattern.
-	   *
-	   * @param grokPatternPath Path to the pattern file
-	   * @param grokExpression  - <b>OPTIONAL</b> - Grok pattern to compile ex: %{APACHELOG}
-	   * @return {@code Grok} instance
-	   * @throws Exception
-	   */
-	  public static MetronGrok create(String grokPatternPath, String grokExpression)
-	      throws Exception {
-	    if (StringUtils.isBlank(grokPatternPath)) {
-	      throw new Exception("{grokPatternPath} should not be empty or null");
-	    }
-	    MetronGrok g = new MetronGrok();
-	    g.addPatternFromFile(grokPatternPath);
-	    if (StringUtils.isNotBlank(grokExpression)) {
-	      g.compile(grokExpression);
-	    }
-	    return g;
-	  }
-
-	  /**
-	   * Create a {@code Grok} instance with the given grok patterns file.
-	   *
-	   * @param  grokPatternPath : Path to the pattern file
-	   * @return Grok
-	   * @throws Exception
-	   */
-	  public static MetronGrok create(String grokPatternPath) throws Exception {
-	    return create(grokPatternPath, null);
-	  }
-
-	  /**
-	   * Add custom pattern to grok in the runtime.
-	   *
-	   * @param name : Pattern Name
-	   * @param pattern : Regular expression Or {@code Grok} pattern
-	   * @throws Exception
-	   **/
-	  public void addPattern(String name, String pattern) throws Exception {
-	    if (StringUtils.isBlank(name)) {
-	      throw new Exception("Invalid Pattern name");
-	    }
-	    if (StringUtils.isBlank(name)) {
-	      throw new Exception("Invalid Pattern");
-	    }
-	    grokPatternDefinition.put(name, pattern);
-	  }
-
-	  /**
-	   * Copy the given Map of patterns (pattern name, regular expression) to {@code Grok},
-	   * duplicate element will be override.
-	   *
-	   * @param cpy : Map to copy
-	   * @throws Exception
-	   **/
-	  public void copyPatterns(Map<String, String> cpy) throws Exception {
-	    if (cpy == null) {
-	      throw new Exception("Invalid Patterns");
-	    }
-
-	    if (cpy.isEmpty()) {
-	      throw new Exception("Invalid Patterns");
-	    }
-	    for (Map.Entry<String, String> entry : cpy.entrySet()) {
-	      grokPatternDefinition.put(entry.getKey().toString(), entry.getValue().toString());
-	    }
-	  }
-
-	  /**
-	   * Get the current map of {@code Grok} pattern.
-	   *
-	   * @return Patterns (name, regular expression)
-	   */
-	  public Map<String, String> getPatterns() {
-	    return grokPatternDefinition;
-	  }
-
-	  /**
-	   * Get the named regex from the {@code Grok} pattern. <p></p>
-	   * See {@link #compile(String)} for more detail.
-	   * @return named regex
-	   */
-	  public String getNamedRegex() {
-	    return namedRegex;
-	  }
-
-	  /**
-	   * Add patterns to {@code Grok} from the given file.
-	   *
-	   * @param file : Path of the grok pattern
-	   * @throws Exception
-	   */
-	  public void addPatternFromFile(String file) throws Exception {
-
-	    File f = new File(file);
-	    if (!f.exists()) {
-	      throw new Exception("Pattern not found");
-	    }
-
-	    if (!f.canRead()) {
-	      throw new Exception("Pattern cannot be read");
-	    }
-
-	    FileReader r = null;
-	    try {
-	      r = new FileReader(f);
-	      addPatternFromReader(r);
-	    } catch (FileNotFoundException e) {
-	      throw new Exception(e.getMessage());
-	    } catch (@SuppressWarnings("hiding") IOException e) {
-	      throw new Exception(e.getMessage());
-	    } finally {
-	      try {
-	        if (r != null) {
-	          r.close();
-	        }
-	      } catch (IOException io) {
-	        // TODO(anthony) : log the error
-	      }
-	    }
-	  }
-
-	  /**
-	   * Add patterns to {@code Grok} from a Reader.
-	   *
-	   * @param r : Reader with {@code Grok} patterns
-	   * @throws Exception
-	   */
-	  public void addPatternFromReader(Reader r) throws Exception {
-	    BufferedReader br = new BufferedReader(r);
-	    String line;
-	    // We dont want \n and commented line
-	    Pattern pattern = Pattern.compile("^([A-z0-9_]+)\\s+(.*)$");
-	    try {
-	      while ((line = br.readLine()) != null) {
-	        Matcher m = pattern.matcher(line);
-	        if (m.matches()) {
-	          this.addPattern(m.group(1), m.group(2));
-	        }
-	      }
-	      br.close();
-	    } catch (IOException e) {
-	      throw new Exception(e.getMessage());
-	    } catch (Exception e) {
-	      throw new Exception(e.getMessage());
-	    }
-
-	  }
-
-	  /**
-	   * Match the given <tt>log</tt> with the named regex.
-	   * And return the json representation of the matched element
-	   *
-	   * @param log : log to match
-	   * @return json representation og the log
-	   */
-	  public String capture(String log){
-		  MetronMatch match = match(log);
-	    match.captures();
-	    return match.toJson();
-	  }
-
-	  /**
-	   * Match the given list of <tt>log</tt> with the named regex
-	   * and return the list of json representation of the matched elements.
-	   *
-	   * @param logs : list of log
-	   * @return list of json representation of the log
-	   */
-	  public List<String> captures(List<String> logs){
-	    List<String> matched = new ArrayList<String>();
-	    for (String log : logs) {
-	    	MetronMatch match = match(log);
-	      match.captures();
-	      matched.add(match.toJson());
-	    }
-	    return matched;
-	  }
-
-	  /**
-	   * Match the given <tt>text</tt> with the named regex
-	   * {@code Grok} will extract data from the string and get an extence of {@link Match}.
-	   *
-	   * @param text : Single line of log
-	   * @return Grok Match
-	   */
-	  public MetronMatch match(String text) {
-	    if (compiledNamedRegex == null || StringUtils.isBlank(text)) {
-	      return MetronMatch.EMPTY;
-	    }
-
-	    Matcher m = compiledNamedRegex.matcher(text);
-	    MetronMatch match = new MetronMatch();
-	    if (m.find()) {
-	      match.setSubject(text);
-	      match.setGrok(this);
-	      match.setMatch(m);
-	      match.setStart(m.start(0));
-	      match.setEnd(m.end(0));
-	    }
-	    return match;
-	  }
-
-	  /**
-	   * Compile the {@code Grok} pattern to named regex pattern.
-	   *
-	   * @param pattern : Grok pattern (ex: %{IP})
-	   * @throws Exception
-	   */
-	  public void compile(String pattern) throws Exception {
-
-	    if (StringUtils.isBlank(pattern)) {
-	      throw new Exception("{pattern} should not be empty or null");
-	    }
-
-	    namedRegex = pattern;
-	    originalGrokPattern = pattern;
-	    int index = 0;
-	    /** flag for infinite recurtion */
-	    int iterationLeft = 1000;
-	    Boolean continueIteration = true;
-
-	    // Replace %{foo} with the regex (mostly groupname regex)
-	    // and then compile the regex
-	    while (continueIteration) {
-	      continueIteration = false;
-	      if (iterationLeft <= 0) {
-	        throw new Exception("Deep recursion pattern compilation of " + originalGrokPattern);
-	      }
-	      iterationLeft--;
-
-	      Matcher m = GrokUtils.GROK_PATTERN.matcher(namedRegex);
-	      // Match %{Foo:bar} -> pattern name and subname
-	      // Match %{Foo=regex} -> add new regex definition
-	      if (m.find()) {
-	        continueIteration = true;
-	        Map<String, String> group = m.namedGroups();
-	        if (group.get("definition") != null) {
-	          try {
-	            addPattern(group.get("pattern"), group.get("definition"));
-	            group.put("name", group.get("name") + "=" + group.get("definition"));
-	          } catch (Exception e) {
-	            // Log the exeception
-	          }
-	        }
-	        namedRegexCollection.put("name" + index,
-	            (group.get("subname") != null ? group.get("subname") : group.get("name")));
-	        namedRegex =
-	            StringUtils.replace(namedRegex, "%{" + group.get("name") + "}", "(?<name" + index + ">"
-	                + grokPatternDefinition.get(group.get("pattern")) + ")");
-	        // System.out.println(_expanded_pattern);
-	        index++;
-	      }
-	    }
-
-	    if (namedRegex.isEmpty()) {
-	      throw new Exception("Pattern not fount");
-	    }
-	    // Compile the regex
-	    compiledNamedRegex = Pattern.compile(namedRegex);
-	  }
-
-	 	  /**
-	   * Original grok pattern used to compile to the named regex.
-	   *
-	   * @return String Original Grok pattern
-	   */
-	  public String getOriginalGrokPattern(){
-	    return originalGrokPattern;
-	  }
-
-	  /**
-	   * Get the named regex from the given id.
-	   *
-	   * @param id : named regex id
-	   * @return String of the named regex
-	   */
-	  public String getNamedRegexCollectionById(String id) {
-	    return namedRegexCollection.get(id);
-	  }
-
-	  /**
-	   * Get the full collection of the named regex.
-	   *
-	   * @return named RegexCollection
-	   */
-	  public Map<String, String> getNamedRegexCollection() {
-	    return namedRegexCollection;
-	  }
-	}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/3854e075/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/MetronMatch.java
----------------------------------------------------------------------
diff --git a/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/MetronMatch.java b/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/MetronMatch.java
deleted file mode 100644
index 0360f8a..0000000
--- a/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/MetronMatch.java
+++ /dev/null
@@ -1,280 +0,0 @@
-package com.apache.metron.parsing.parsers;
-
-import java.io.Serializable;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.TreeMap;
-
-import com.google.code.regexp.Matcher;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-
-public class MetronMatch implements Serializable {
-
-	private static final long serialVersionUID = -1129245286587945311L;
-	private String subject; // texte
-	  private Map<String, Object> capture;
-	  private MetronGarbage garbage;
-	  private MetronGrok grok;
-	  private Matcher match;
-	  private int start;
-	  private int end;
-
-	  /**
-	   * For thread safety
-	   */
-	  private static ThreadLocal<MetronMatch> matchHolder = new ThreadLocal<MetronMatch>() {
-		  @Override
-		  protected MetronMatch initialValue() {
-			  return new MetronMatch();
-		  }
-	  };
-
-	  /**
-	   *Create a new {@code Match} object.
-	   */
-	  public MetronMatch() {
-	    subject = "Nothing";
-	    grok = null;
-	    match = null;
-	    capture = new TreeMap<String, Object>();
-	    garbage = new MetronGarbage();
-	    start = 0;
-	    end = 0;
-	  }
-
-	  /**
-	   * Create Empty grok matcher
-	   */
-	  public static final MetronMatch EMPTY = new MetronMatch();
-
-	  public void setGrok(MetronGrok grok){
-	    if (grok != null) {
-	      this.grok = grok;
-	    }
-	  }
-
-	  public Matcher getMatch() {
-	    return match;
-	  }
-
-	  public void setMatch(Matcher match) {
-	    this.match = match;
-	  }
-
-	  public int getStart() {
-	    return start;
-	  }
-
-	  public void setStart(int start) {
-	    this.start = start;
-	  }
-
-	  public int getEnd() {
-	    return end;
-	  }
-
-	  public void setEnd(int end) {
-	    this.end = end;
-	  }
-
-	  /**
-	   * Singleton.
-	   *
-	   * @return instance of Match
-	   */
-	  public static MetronMatch getInstance() {
-		 return matchHolder.get();
-	  }
-
-	  /**
-	   *  Set the single line of log to parse.
-	   *
-	   * @param text : single line of log
-	   */
-	  public void setSubject(String text) {
-	    if (text == null) {
-	      return;
-	    }
-	    if (text.isEmpty()) {
-	      return;
-	    }
-	    subject = text;
-	  }
-
-	  /**
-	   * Retrurn the single line of log.
-	   *
-	   * @return the single line of log
-	   */
-	  public String getSubject() {
-	    return subject;
-	  }
-
-	  /**
-	   * Match to the <tt>subject</tt> the <tt>regex</tt> and save the matched element into a map.
-	   *
-	   */
-	  public void captures() {
-	    if (match == null) {
-	      return;
-	    }
-	    capture.clear();
-
-	    // _capture.put("LINE", this.line);
-	    // _capture.put("LENGTH", this.line.length() +"");
-
-	    Map<String, String> mappedw = this.match.namedGroups();
-	    Iterator<Entry<String, String>> it = mappedw.entrySet().iterator();
-	    while (it.hasNext()) {
-
-	      @SuppressWarnings("rawtypes")
-	      Map.Entry pairs = (Map.Entry) it.next();
-	      String key = null;
-	      Object value = null;
-	      if (this.grok.getNamedRegexCollectionById(pairs.getKey().toString()) == null) {
-	        key = pairs.getKey().toString();
-	      } else if (!this.grok.getNamedRegexCollectionById(pairs.getKey().toString()).isEmpty()) {
-	        key = this.grok.getNamedRegexCollectionById(pairs.getKey().toString());
-	      }
-	      if (pairs.getValue() != null) {
-	        value = pairs.getValue().toString();
-	        
-	        KeyValue keyValue = MetronConverter.convert(key, value);
-	        
-	        //get validated key
-	        key = keyValue.getKey();
-	        
-	        //resolve value
-	        if (keyValue.getValue() instanceof String) {
-	        	 value = cleanString((String)keyValue.getValue());
-	        } else {
-	        	value = keyValue.getValue();
-	        }
-	        
-	        //set if grok failure
-	        if (keyValue.hasGrokFailure()) {
-	        	capture.put(key + "_grokfailure", keyValue.getGrokFailure());
-	        }
-	      }
-
-	      capture.put(key, value);
-	      it.remove(); // avoids a ConcurrentModificationException
-	    }
-	  }
-
-
-	  /**
-	   * remove from the string the quote and double quote.
-	   *
-	   * @param string to pure: "my/text"
-	   * @return unquoted string: my/text
-	   */
-	  private String cleanString(String value) {
-	    if (value == null) {
-	      return value;
-	    }
-	    if (value.isEmpty()) {
-	      return value;
-	    }
-	    char[] tmp = value.toCharArray();
-	    if ((tmp[0] == '"' && tmp[value.length() - 1] == '"')
-	        || (tmp[0] == '\'' && tmp[value.length() - 1] == '\'')) {
-	      value = value.substring(1, value.length() - 1);
-	    }
-	    return value;
-	  }
-
-
-	  /**
-	   * Get the json representation of the matched element.
-	   * <p>
-	   * example:
-	   * map [ {IP: 127.0.0.1}, {status:200}]
-	   * will return
-	   * {"IP":"127.0.0.1", "status":200}
-	   * </p>
-	   * If pretty is set to true, json will return prettyprint json string.
-	   *
-	   * @return Json of the matched element in the text
-	   */
-	  public String toJson(Boolean pretty) {
-	    if (capture == null) {
-	      return "{}";
-	    }
-	    if (capture.isEmpty()) {
-	      return "{}";
-	    }
-
-	    this.cleanMap();
-	    Gson gs;
-	    if (pretty) {
-	     gs = new GsonBuilder().setPrettyPrinting().create();
-	    } else {
-	      gs = new Gson();
-	    }
-	    return gs.toJson(/* cleanMap( */capture/* ) */);
-	  }
-
-	  /**
-	   * Get the json representation of the matched element.
-	   * <p>
-	   * example:
-	   * map [ {IP: 127.0.0.1}, {status:200}]
-	   * will return
-	   * {"IP":"127.0.0.1", "status":200}
-	   * </p>
-	   *
-	   * @return Json of the matched element in the text
-	   */
-	  public String toJson() {
-	    return toJson(false);
-	  }
-
-	  /**
-	   * Get the map representation of the matched element in the text.
-	   *
-	   * @return map object from the matched element in the text
-	   */
-	  public Map<String, Object> toMap() {
-	    this.cleanMap();
-	    return capture;
-	  }
-
-	  /**
-	   * Remove and rename the unwanted elelents in the matched map.
-	   */
-	  private void cleanMap() {
-	    garbage.rename(capture);
-	    garbage.remove(capture);
-	  }
-
-	  /**
-	   * Util fct.
-	   *
-	   * @return boolean
-	   */
-	  public Boolean isNull() {
-	    if (this.match == null) {
-	      return true;
-	    }
-	    return false;
-	  }
-
-	  /**
-	   * Util fct.
-	   *
-	   * @param s
-	   * @return boolean
-	   */
-	  private boolean isInteger(String s) {
-	    try {
-	      Integer.parseInt(s);
-	    } catch (NumberFormatException e) {
-	      return false;
-	    }
-	    return true;
-	  }
-	  
-	}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/3854e075/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/ParserUtils.java
----------------------------------------------------------------------
diff --git a/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/ParserUtils.java b/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/ParserUtils.java
deleted file mode 100644
index e2d9780..0000000
--- a/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/ParserUtils.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.apache.metron.parsing.parsers;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-import org.apache.commons.io.IOUtils;
-
-public class ParserUtils {
-	
-	public static final String PREFIX = "stream2file";
-	public static final String SUFFIX = ".tmp";
-
-	public static File stream2file(InputStream in) throws IOException {
-		final File tempFile = File.createTempFile(PREFIX, SUFFIX);
-		tempFile.deleteOnExit();
-		try (FileOutputStream out = new FileOutputStream(tempFile)) {
-			IOUtils.copy(in, out);
-		}
-		return tempFile;
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/3854e075/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/PcapParser.java
----------------------------------------------------------------------
diff --git a/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/PcapParser.java b/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/PcapParser.java
deleted file mode 100644
index a3cdbda..0000000
--- a/metron-streaming/Metron-MessageParsers/src/main/java/com/apache/metron/parsing/parsers/PcapParser.java
+++ /dev/null
@@ -1,185 +0,0 @@
-package com.apache.metron.parsing.parsers;
-
-import java.io.EOFException;
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.log4j.Logger;
-import org.krakenapps.pcap.decoder.ethernet.EthernetDecoder;
-import org.krakenapps.pcap.decoder.ethernet.EthernetType;
-import org.krakenapps.pcap.decoder.ip.IpDecoder;
-import org.krakenapps.pcap.decoder.ip.Ipv4Packet;
-import org.krakenapps.pcap.decoder.tcp.TcpPacket;
-import org.krakenapps.pcap.decoder.udp.UdpPacket;
-import org.krakenapps.pcap.file.GlobalHeader;
-import org.krakenapps.pcap.packet.PacketHeader;
-import org.krakenapps.pcap.packet.PcapPacket;
-import org.krakenapps.pcap.util.Buffer;
-
-import com.apache.metron.pcap.Constants;
-import com.apache.metron.pcap.MetronEthernetDecoder;
-import com.apache.metron.pcap.PacketInfo;
-import com.apache.metron.pcap.PcapByteInputStream;
-
-/**
- * The Class PcapParser.
- * 
- * @author sheetal
- * @version $Revision: 1.0 $
- */
-public final class PcapParser {
-
-  /** The Constant LOG. */
-  private static final Logger LOG = Logger.getLogger(PcapParser.class);
-
-  /** The ETHERNET_DECODER. */
-  private static final EthernetDecoder ETHERNET_DECODER = new MetronEthernetDecoder();
-
-  /** The ip decoder. */
-  private static final IpDecoder IP_DECODER = new IpDecoder();
-
-  // /** The tcp decoder. */
-  // private static final TcpDecoder TCP_DECODER = new TcpDecoder(new
-  // TcpPortProtocolMapper());
-  //
-  // /** The udp decoder. */
-  // private static final UdpDecoder UDP_DECODER = new UdpDecoder(new
-  // UdpPortProtocolMapper());
-
-  static {
-    // IP_DECODER.register(InternetProtocol.TCP, TCP_DECODER);
-    // IP_DECODER.register(InternetProtocol.UDP, UDP_DECODER);
-    ETHERNET_DECODER.register(EthernetType.IPV4, IP_DECODER);
-  }
-
-  /**
-   * Instantiates a new pcap parser.
-   */
-  private PcapParser() { // $codepro.audit.disable emptyMethod
-
-  }
-
-  /**
-   * Parses the.
-   * 
-   * @param pcap
-   *          the pcap
-   * @return the list * @throws IOException Signals that an I/O exception has
-   *         occurred. * @throws IOException * @throws IOException * @throws
-   *         IOException
-   * @throws IOException
-   *           Signals that an I/O exception has occurred.
-   */
-  public static List<PacketInfo> parse(byte[] pcap) throws IOException {
-    List<PacketInfo> packetInfoList = new ArrayList<PacketInfo>();
-
-    PcapByteInputStream pcapByteInputStream = new PcapByteInputStream(pcap);
-
-    GlobalHeader globalHeader = pcapByteInputStream.getGlobalHeader();
-    while (true) {
-      try
-
-      {
-        PcapPacket packet = pcapByteInputStream.getPacket();
-        // int packetCounter = 0;
-        // PacketHeader packetHeader = null;
-        // Ipv4Packet ipv4Packet = null;
-        TcpPacket tcpPacket = null;
-        UdpPacket udpPacket = null;
-        // Buffer packetDataBuffer = null;
-        int sourcePort = 0;
-        int destinationPort = 0;
-
-        // LOG.trace("Got packet # " + ++packetCounter);
-
-        // LOG.trace(packet.getPacketData());
-        ETHERNET_DECODER.decode(packet);
-
-        PacketHeader packetHeader = packet.getPacketHeader();
-        Ipv4Packet ipv4Packet = Ipv4Packet.parse(packet.getPacketData());
-
-        if (ipv4Packet.getProtocol() == Constants.PROTOCOL_TCP) {
-          tcpPacket = TcpPacket.parse(ipv4Packet);
-
-        }
-
-        if (ipv4Packet.getProtocol() == Constants.PROTOCOL_UDP) {
-
-          Buffer packetDataBuffer = ipv4Packet.getData();
-          sourcePort = packetDataBuffer.getUnsignedShort();
-          destinationPort = packetDataBuffer.getUnsignedShort();
-
-          udpPacket = new UdpPacket(ipv4Packet, sourcePort, destinationPort);
-
-          udpPacket.setLength(packetDataBuffer.getUnsignedShort());
-          udpPacket.setChecksum(packetDataBuffer.getUnsignedShort());
-          packetDataBuffer.discardReadBytes();
-          udpPacket.setData(packetDataBuffer);
-        }
-
-        packetInfoList.add(new PacketInfo(globalHeader, packetHeader, packet,
-            ipv4Packet, tcpPacket, udpPacket));
-      } catch (NegativeArraySizeException ignored) {
-        LOG.debug("Ignorable exception while parsing packet.", ignored);
-      } catch (EOFException eof) { // $codepro.audit.disable logExceptions
-        // Ignore exception and break
-        break;
-      }
-    }
-    return packetInfoList;
-  }
-
-  /**
-   * The main method.
-   * 
-   * @param args
-   *          the arguments
-   * @throws IOException
-   *           Signals that an I/O exception has occurred.
-   * @throws InterruptedException
-   *           the interrupted exception
-   */
-  public static void main(String[] args) throws IOException,
-      InterruptedException {
-
-    double totalIterations = 1000000;
-    double parallelism = 64;
-    double targetEvents = 1000000;
-
-    File fin = new File("/Users/sheetal/Downloads/bad_packets/bad_packet_1405988125427.pcap");
-    File fout = new File(fin.getAbsolutePath() + ".parsed");
-    byte[] pcapBytes = FileUtils.readFileToByteArray(fin);
-    long startTime = System.currentTimeMillis();
-    for (int i = 0; i < totalIterations; i++) {
-      List<PacketInfo> list = parse(pcapBytes);
-
-      for (PacketInfo packetInfo : list) {
-        System.out.println(packetInfo.getJsonIndexDoc());
-      }
-    }
-    long endTime = System.currentTimeMillis();
-
-    System.out.println("Time taken to process " + totalIterations + " events :"
-        + (endTime - startTime) + " milliseconds");
-
-    System.out
-        .println("With parallelism of "
-            + parallelism
-            + " estimated time to process "
-            + targetEvents
-            + " events: "
-            + (((((endTime - startTime) / totalIterations) * targetEvents) / parallelism) / 1000)
-            + " seconds");
-    System.out.println("With parallelism of " + parallelism
-        + " estimated # of events per second: "
-        + ((parallelism * 1000 * totalIterations) / (endTime - startTime))
-        + " events");
-    System.out.println("Expected Parallelism to process " + targetEvents
-        + " events in a second: "
-        + (targetEvents / ((1000 * totalIterations) / (endTime - startTime))));
-  }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/3854e075/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/filters/BroMessageFilter.java
----------------------------------------------------------------------
diff --git a/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/filters/BroMessageFilter.java b/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/filters/BroMessageFilter.java
new file mode 100644
index 0000000..9022291
--- /dev/null
+++ b/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/filters/BroMessageFilter.java
@@ -0,0 +1,44 @@
+package com.apache.metron.filters;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.configuration.Configuration;
+import org.json.simple.JSONObject;
+
+import com.apache.metron.parser.interfaces.MessageFilter;
+
+public class BroMessageFilter implements MessageFilter,Serializable {
+
+	/**
+	 * Filter protocols based on whitelists and blacklists
+	 */
+	
+	private static final long serialVersionUID = -3824683649114625033L;
+	private String _key;
+	private final Set<String> _known_protocols;
+
+	 /**
+	 * @param  filter  Commons configuration for reading properties files
+	 * @param  key Key in a JSON mesage where the protocol field is located
+	 */
+	
+	@SuppressWarnings({ "unchecked", "rawtypes" })
+	public BroMessageFilter(Configuration conf, String key) {
+		_key = key;
+		_known_protocols = new HashSet<String>();
+		List known_protocols = conf.getList("source.known.protocols");
+		_known_protocols.addAll(known_protocols);
+	}
+
+	 /**
+	 * @param  message  JSON representation of a message with a protocol field
+	 * @return      False if message if filtered and True if message is not filtered
+	 */
+	
+	public boolean emitTuple(JSONObject message) {
+		return _known_protocols.contains(message.get(_key));
+	}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/3854e075/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/filters/GenericMessageFilter.java
----------------------------------------------------------------------
diff --git a/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/filters/GenericMessageFilter.java b/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/filters/GenericMessageFilter.java
new file mode 100644
index 0000000..19c7b62
--- /dev/null
+++ b/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/filters/GenericMessageFilter.java
@@ -0,0 +1,19 @@
+package com.apache.metron.filters;
+import java.io.Serializable;
+
+import org.json.simple.JSONObject;
+
+import com.apache.metron.parser.interfaces.MessageFilter;
+
+public class GenericMessageFilter implements MessageFilter,Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 3626397212398318852L;
+
+	public boolean emitTuple(JSONObject message) {
+		return true;
+	}
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/3854e075/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/parsing/AbstractParserBolt.java
----------------------------------------------------------------------
diff --git a/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/parsing/AbstractParserBolt.java b/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/parsing/AbstractParserBolt.java
new file mode 100644
index 0000000..ccda8cf
--- /dev/null
+++ b/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/parsing/AbstractParserBolt.java
@@ -0,0 +1,144 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.apache.metron.parsing;
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.json.simple.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import backtype.storm.task.OutputCollector;
+import backtype.storm.task.TopologyContext;
+import backtype.storm.topology.base.BaseRichBolt;
+
+import com.codahale.metrics.Counter;
+import com.apache.metron.metrics.MetricReporter;
+import com.apache.metron.parser.interfaces.MessageFilter;
+import com.apache.metron.parser.interfaces.MessageParser;
+
+@SuppressWarnings("rawtypes")
+public abstract class AbstractParserBolt extends BaseRichBolt {
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -6710596708304282838L;
+
+	protected static final Logger LOG = LoggerFactory
+			.getLogger(AbstractParserBolt.class);
+
+	protected OutputCollector _collector;
+	protected MessageParser _parser;
+
+	protected String OutputFieldName;
+	protected MetricReporter _reporter;
+	protected MessageFilter _filter;
+
+	protected Counter ackCounter, emitCounter, failCounter;
+
+	/**
+	 * Register counters to be reported to graphite
+	 * */
+
+	protected void registerCounters() {
+
+		String ackString = _parser.getClass().getSimpleName() + ".ack";
+
+		String emitString = _parser.getClass().getSimpleName() + ".emit";
+
+		String failString = _parser.getClass().getSimpleName() + ".fail";
+
+		ackCounter = _reporter.registerCounter(ackString);
+		emitCounter = _reporter.registerCounter(emitString);
+		failCounter = _reporter.registerCounter(failString);
+
+	}
+
+	/**
+	 * Check to make sure all required variables have been initialized
+	 * */
+
+	public final void prepare(Map conf, TopologyContext topologyContext,
+			OutputCollector collector) {
+		_collector = collector;
+		if (this._parser == null)
+			throw new IllegalStateException("MessageParser must be specified");
+		if (this.OutputFieldName == null)
+			throw new IllegalStateException("OutputFieldName must be specified");
+
+		if (this._filter == null)
+			throw new IllegalStateException("MessageFilter must be specified");
+
+		try {
+			doPrepare(conf, topologyContext, collector);
+		} catch (IOException e) {
+			LOG.error("Counld not initialize...");
+			e.printStackTrace();
+		}
+	}
+
+	/**
+	 * @param parser
+	 *            The parser class for parsing the incoming raw message byte
+	 *            stream
+	 * @return Instance of this class
+	 */
+
+	public boolean checkForSchemaCorrectness(JSONObject message) {
+		int correct = 0;
+
+		
+		if (!(message.containsKey("original_string"))) {
+			LOG.trace("[Metron] Message does not have original_string: " + message);
+			return false;
+		} else if (!(message.containsKey("timestamp"))) { 
+			LOG.trace("[Metron] Message does not have timestamp: " + message);
+			return false;
+		} else {
+			LOG.trace("[Metron] Message conforms to schema: "
+					+ message);
+			return true;
+		}
+	}
+
+	abstract void doPrepare(Map conf, TopologyContext topologyContext,
+			OutputCollector collector) throws IOException;
+
+	protected String generateTopologyKey(String src_ip, String dst_ip)
+			throws Exception {
+		try {
+			if (dst_ip == null && src_ip == null)
+				return "0";
+
+			if (src_ip == null || src_ip.length() == 0)
+				return dst_ip;
+
+			if (dst_ip == null || dst_ip.length() == 0)
+				return src_ip;
+
+			double ip1 = Double.parseDouble(src_ip.replace(".", ""));
+			double ip2 = Double.parseDouble(dst_ip.replace(".", ""));
+
+			return String.valueOf(ip1 + ip2);
+		} catch (Exception e) {
+			return "0";
+		}
+	}
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/3854e075/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/parsing/PcapParserBolt.java
----------------------------------------------------------------------
diff --git a/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/parsing/PcapParserBolt.java b/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/parsing/PcapParserBolt.java
new file mode 100644
index 0000000..ba274eb
--- /dev/null
+++ b/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/parsing/PcapParserBolt.java
@@ -0,0 +1,227 @@
+package com.apache.metron.parsing;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+import org.json.simple.JSONObject;
+import org.json.simple.JSONValue;
+
+import com.apache.metron.helpers.topology.ErrorGenerator;
+import com.apache.metron.parsing.parsers.PcapParser;
+import com.apache.metron.pcap.PacketInfo;
+
+import backtype.storm.generated.Grouping;
+import backtype.storm.task.OutputCollector;
+import backtype.storm.task.TopologyContext;
+import backtype.storm.topology.IRichBolt;
+import backtype.storm.topology.OutputFieldsDeclarer;
+import backtype.storm.tuple.Fields;
+import backtype.storm.tuple.Tuple;
+import backtype.storm.tuple.Values;
+
+
+
+/**
+ * The Class PcapParserBolt parses each input tuple and emits a new tuple which
+ * contains the information (header_json,group_key,pcap_id, timestamp, pcap) as
+ * defined in the output schema.
+ * 
+ * @author sheetal
+ * @version $Revision: 1.0 $
+ */
+public class PcapParserBolt implements IRichBolt {
+
+  /** The Constant serialVersionUID. */
+  private static final long serialVersionUID = -1449830233777209255L;
+
+  /** The Constant LOG. */
+  private static final Logger LOG = Logger.getLogger(PcapParserBolt.class);
+
+  /** The collector. */
+  private OutputCollector collector = null;
+
+  /** The conf. */
+  @SuppressWarnings("rawtypes")
+private Map conf;
+
+  /** The number of chars to use for shuffle grouping. */
+  @SuppressWarnings("unused")
+private int numberOfCharsToUseForShuffleGrouping = 4;
+
+  /** The divisor to convert nanos to expected time precision. */
+  private long timePrecisionDivisor = 1L;
+
+
+  // HBaseStreamPartitioner hBaseStreamPartitioner = null ;
+
+  /**
+   * The Constructor.
+   */
+  public PcapParserBolt() {
+
+  }
+
+  public PcapParserBolt withTsPrecision(String tsPrecision) {
+	if (tsPrecision.equalsIgnoreCase("MILLI")) {
+	  //Convert nanos to millis
+	  LOG.info("Configured for MILLI, setting timePrecisionDivisor to 1000000L" );
+	  timePrecisionDivisor = 1000000L;
+	} else if (tsPrecision.equalsIgnoreCase("MICRO")) {
+	  //Convert nanos to micro
+	  LOG.info("Configured for MICRO, setting timePrecisionDivisor to 1000L" );
+	  timePrecisionDivisor = 1000L;
+	} else if (tsPrecision.equalsIgnoreCase("NANO")) {
+	  //Keep nano as is.
+	  LOG.info("Configured for NANO, setting timePrecisionDivisor to 1L" );
+	  timePrecisionDivisor = 1L;
+	} else {
+	  LOG.info("bolt.parser.ts.precision not set. Default to NANO");
+	  timePrecisionDivisor = 1L;
+	}
+	return this;
+  }
+  
+  /*
+   * (non-Javadoc)
+   * 
+   * @see backtype.storm.topology.IComponent#declareOutputFields(backtype.storm
+   * .topology.OutputFieldsDeclarer)
+   */
+  public void declareOutputFields(OutputFieldsDeclarer declarer) {
+	  declarer.declareStream("message", new Fields("key", "message")); 
+    //declarer.declareStream("pcap_index_stream", new Fields("index_json", "pcap_id"));
+    declarer.declareStream("pcap_header_stream", new Fields("header_json", "pcap_id"));
+    declarer.declareStream("pcap_data_stream", new Fields("pcap_id", "timestamp", "pcap"));
+    declarer.declareStream("error", new Fields("error"));
+
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see backtype.storm.topology.IComponent#getComponentConfiguration()
+   */
+  /**
+   * Method getComponentConfiguration.
+   * 
+   * 
+   * 
+   * @return Map<String,Object> * @see
+   *         backtype.storm.topology.IComponent#getComponentConfiguration() * @see
+   *         backtype.storm.topology.IComponent#getComponentConfiguration() * @see
+   *         backtype.storm.topology.IComponent#getComponentConfiguration()
+   */
+
+  public Map<String, Object> getComponentConfiguration() {
+    return null;
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see backtype.storm.task.IBolt#prepare(java.util.Map,
+   * backtype.storm.task.TopologyContext, backtype.storm.task.OutputCollector)
+   */
+
+  public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
+    this.collector = collector;
+    this.conf = stormConf;
+    if (conf.containsKey("bolt.parser.num.of.key.chars.to.use.for.shuffle.grouping")) {
+      this.numberOfCharsToUseForShuffleGrouping = Integer.valueOf(conf.get(
+          "bolt.parser.num.of.key.chars.to.use.for.shuffle.grouping").toString());
+    }
+    
+    Grouping._Fields a;
+
+
+    // hBaseStreamPartitioner = new HBaseStreamPartitioner(
+    // conf.get("bolt.hbase.table.name").toString(),
+    // 0,
+    // Integer.parseInt(conf.get("bolt.hbase.partitioner.region.info.refresh.interval.mins").toString()))
+    // ;
+    // hBaseStreamPartitioner.prepare();
+
+  }
+
+  /**
+   * Processes each input tuple and emits tuple which holds the following
+   * information about a network packet : group_key : first 3 digits of the
+   * pcap_id pcap_id : generated from network packet srcIp, dstIp, protocol,
+   * srcPort, dstPort header_json : contains global header, ipv4 header, tcp
+   * header(if the n/w protocol is tcp), udp header (if the n/w protocol is udp)
+   * timestamp : the n/w packet capture timestamp pcap : tuple in binary array.
+   * 
+   * @param input
+   *          Tuple
+   * @see backtype.storm.task.IBolt#execute(Tuple)
+   */
+
+  @SuppressWarnings("unchecked")
+public void execute(Tuple input) {
+
+    // LOG.debug("In PcapParserBolt bolt: Got tuple " + input);
+    // LOG.debug("Got this pcap : " + new String(input.getBinary(0)));
+
+    List<PacketInfo> packetInfoList = null;
+    try {
+      packetInfoList = PcapParser.parse(input.getBinary(0));
+
+      if (packetInfoList != null) {
+
+        for (PacketInfo packetInfo : packetInfoList) {
+        	
+        	
+        	String string_pcap = packetInfo.getJsonIndexDoc();
+        	Object obj=JSONValue.parse(string_pcap);
+        	  JSONObject header=(JSONObject)obj;
+        	
+        	JSONObject message = new JSONObject();
+        	//message.put("key", packetInfo.getKey());
+        	
+        	message.put("message", header);
+        	
+        	collector.emit("message", new Values(packetInfo.getKey(), message));
+        	
+        	//collector.emit("pcap_index_stream", new Values(packetInfo.getJsonIndexDoc(), packetInfo.getKey()));
+        	
+          collector.emit("pcap_header_stream", new Values(packetInfo.getJsonDoc(), packetInfo.getKey()));
+          collector.emit("pcap_data_stream", new Values(packetInfo.getKey(),
+             packetInfo.getPacketTimeInNanos() / timePrecisionDivisor,
+              input.getBinary(0)));
+
+          // collector.emit(new Values(packetInfo.getJsonDoc(), packetInfo
+          // .getKey().substring(0, numberOfCharsToUseForShuffleGrouping),
+          // packetInfo.getKey(), (packetInfo.getPacketHeader().getTsSec()
+          // * secMultiplier + packetInfo.getPacketHeader().getTsUsec()
+          // * microSecMultiplier), input.getBinary(0)));
+        }
+      }
+
+    } catch (Exception e) {
+      collector.fail(input);
+      e.printStackTrace();
+      LOG.error("Exception while processing tuple", e);
+      
+
+		JSONObject error = ErrorGenerator.generateErrorMessage(
+				"Alerts problem: " + input.getBinary(0), e);
+		collector.emit("error", new Values(error));
+		
+      return;
+    }
+    collector.ack(input);
+
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see backtype.storm.task.IBolt#cleanup()
+   */
+
+  public void cleanup() {
+    // TODO Auto-generated method stub
+
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/3854e075/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/parsing/TelemetryParserBolt.java
----------------------------------------------------------------------
diff --git a/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/parsing/TelemetryParserBolt.java b/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/parsing/TelemetryParserBolt.java
new file mode 100644
index 0000000..0a73c59
--- /dev/null
+++ b/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/parsing/TelemetryParserBolt.java
@@ -0,0 +1,222 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.apache.metron.parsing;
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.apache.commons.configuration.Configuration;
+import org.json.simple.JSONObject;
+
+import backtype.storm.task.OutputCollector;
+import backtype.storm.task.TopologyContext;
+import backtype.storm.topology.OutputFieldsDeclarer;
+import backtype.storm.tuple.Fields;
+import backtype.storm.tuple.Tuple;
+import backtype.storm.tuple.Values;
+
+import com.apache.metron.helpers.topology.ErrorGenerator;
+import com.apache.metron.json.serialization.JSONEncoderHelper;
+import com.apache.metron.metrics.MetricReporter;
+import com.apache.metron.parser.interfaces.MessageFilter;
+import com.apache.metron.parser.interfaces.MessageParser;
+
+/**
+ * Uses an adapter to parse a telemetry message from its native format into a
+ * standard JSON. For a list of available adapter please check
+ * com.apache.metron.parser.parsers. The input is a raw byte array and the output is a
+ * JSONObject
+ * <p>
+ * The parsing conventions are as follows:
+ * <p>
+ * <ul>
+ * 
+ * <li>ip_src_addr = source ip of a message
+ * <li>ip_dst_addr = destination ip of a message
+ * <li>ip_src_port = source port of a message
+ * <li>ip_dst_port = destination port of a message
+ * <li>protocol = protocol of a message
+ * <ul>
+ * <p>
+ * <p>
+ * If a message does not contain at least one of these variables it will be
+ * failed
+ **/
+
+@SuppressWarnings("rawtypes")
+public class TelemetryParserBolt extends AbstractParserBolt {
+
+	private static final long serialVersionUID = -2647123143398352020L;
+	private JSONObject metricConfiguration;
+
+	/**
+	 * @param parser
+	 *            The parser class for parsing the incoming raw message byte
+	 *            stream
+	 * @return Instance of this class
+	 */
+
+	public TelemetryParserBolt withMessageParser(MessageParser parser) {
+		_parser = parser;
+		return this;
+	}
+
+	/**
+	 * @param OutputFieldName
+	 *            Field name of the output tuple
+	 * @return Instance of this class
+	 */
+
+	public TelemetryParserBolt withOutputFieldName(String OutputFieldName) {
+		this.OutputFieldName = OutputFieldName;
+		return this;
+	}
+
+	/**
+	 * @param filter
+	 *            A class for filtering/dropping incomming telemetry messages
+	 * @return Instance of this class
+	 */
+
+	public TelemetryParserBolt withMessageFilter(MessageFilter filter) {
+		this._filter = filter;
+		return this;
+	}
+
+	/**
+	 * @param config
+	 *            A class for generating custom metrics into graphite
+	 * @return Instance of this class
+	 */
+
+	public TelemetryParserBolt withMetricConfig(Configuration config) {
+		this.metricConfiguration = JSONEncoderHelper.getJSON(config
+				.subset("com.apache.metron.metrics"));
+		return this;
+	}
+
+	@Override
+	void doPrepare(Map conf, TopologyContext topologyContext,
+			OutputCollector collector) throws IOException {
+
+		LOG.info("[Metron] Preparing TelemetryParser Bolt...");
+
+		if (metricConfiguration != null) {
+			_reporter = new MetricReporter();
+			_reporter
+					.initialize(metricConfiguration, TelemetryParserBolt.class);
+			LOG.info("[Metron] Metric reporter is initialized");
+		} else {
+			LOG.info("[Metron] Metric reporter is not initialized");
+		}
+		this.registerCounters();
+		
+		if(_parser != null)
+		_parser.init();
+		
+		
+	}
+
+	@SuppressWarnings("unchecked")
+	public void execute(Tuple tuple) {
+
+		LOG.trace("[Metron] Starting to process a new incoming tuple");
+
+		byte[] original_message = null;
+
+		try {
+
+			original_message = tuple.getBinary(0);
+
+			LOG.trace("[Metron] Starting the parsing process");
+
+			if (original_message == null || original_message.length == 0) {
+				LOG.error("Incomming tuple is null");
+				throw new Exception("Invalid message length");
+			}
+
+			LOG.trace("[Metron] Attempting to transofrm binary message to JSON");
+			JSONObject transformed_message = _parser.parse(original_message);
+			LOG.debug("[Metron] Transformed Telemetry message: "
+					+ transformed_message);
+
+			if (transformed_message == null || transformed_message.isEmpty())
+				throw new Exception("Unable to turn binary message into a JSON");
+
+			LOG.trace("[Metron] Checking if the transformed JSON conforms to the right schema");
+
+			if (!checkForSchemaCorrectness(transformed_message)) {
+				throw new Exception("Incorrect formatting on message: "
+						+ transformed_message);
+			}
+
+			else {
+				LOG.trace("[Metron] JSON message has the right schema");
+				boolean filtered = false;
+
+				if (_filter != null) {
+					if (!_filter.emitTuple(transformed_message)) {
+						filtered = true;
+					}
+				}
+
+				if (!filtered) {
+					String ip1 = null;
+
+					if (transformed_message.containsKey("ip_src_addr"))
+						ip1 = transformed_message.get("ip_src_addr").toString();
+
+					String ip2 = null;
+
+					if (transformed_message.containsKey("ip_dst_addr"))
+						ip2 = transformed_message.get("ip_dst_addr").toString();
+
+					String key = generateTopologyKey(ip1, ip2);
+
+					JSONObject new_message = new JSONObject();
+					new_message.put("message", transformed_message);
+					_collector.emit("message", new Values(key, new_message));
+				}
+
+				_collector.ack(tuple);
+				if (metricConfiguration != null)
+					ackCounter.inc();
+			}
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			LOG.error("Failed to parse telemetry message :" + original_message);
+			_collector.fail(tuple);
+
+			if (metricConfiguration != null)
+				failCounter.inc();
+
+			JSONObject error = ErrorGenerator.generateErrorMessage(
+					"Parsing problem: " + new String(original_message),
+					e);
+			_collector.emit("error", new Values(error));
+		}
+	}
+
+	public void declareOutputFields(OutputFieldsDeclarer declearer) {
+		declearer.declareStream("message", new Fields("key", "message"));
+		declearer.declareStream("error", new Fields("message"));
+
+	}
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/3854e075/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/parsing/parsers/AbstractParser.java
----------------------------------------------------------------------
diff --git a/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/parsing/parsers/AbstractParser.java b/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/parsing/parsers/AbstractParser.java
new file mode 100644
index 0000000..0716b01
--- /dev/null
+++ b/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/parsing/parsers/AbstractParser.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.apache.metron.parsing.parsers;
+
+import java.io.Serializable;
+
+import org.json.simple.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.apache.metron.parser.interfaces.MessageParser;
+import com.apache.metron.parsing.AbstractParserBolt;
+
+@SuppressWarnings("serial")
+public abstract class AbstractParser implements MessageParser, Serializable {
+
+	protected static final Logger _LOG = LoggerFactory
+			.getLogger(AbstractParserBolt.class);
+
+	public void initializeParser() {
+		_LOG.debug("Initializing adapter...");
+		
+
+	}
+	
+	public void init() {
+		
+	}
+	
+	
+	abstract public JSONObject parse(byte[] raw_message);
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/3854e075/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/parsing/parsers/BasicBroParser.java
----------------------------------------------------------------------
diff --git a/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/parsing/parsers/BasicBroParser.java b/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/parsing/parsers/BasicBroParser.java
new file mode 100644
index 0000000..207c0ba
--- /dev/null
+++ b/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/parsing/parsers/BasicBroParser.java
@@ -0,0 +1,151 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.apache.metron.parsing.parsers;
+
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.apache.metron.tldextractor.BasicTldExtractor;
+
+@SuppressWarnings("serial")
+public class BasicBroParser extends AbstractParser {
+
+	protected static final Logger _LOG = LoggerFactory
+			.getLogger(BasicBroParser.class);
+	private JSONCleaner cleaner = new JSONCleaner();
+	private BasicTldExtractor tldex = new BasicTldExtractor();
+
+	@SuppressWarnings("unchecked")
+	public JSONObject parse(byte[] msg) {
+
+		_LOG.trace("[Metron] Starting to parse incoming message");
+
+		String raw_message = null;
+
+		try {
+
+			raw_message = new String(msg, "UTF-8");
+			_LOG.trace("[Metron] Received message: " + raw_message);
+
+			JSONObject cleaned_message = cleaner.Clean(raw_message);
+			_LOG.debug("[Metron] Cleaned message: " + raw_message);
+
+			if (cleaned_message == null || cleaned_message.isEmpty())
+				throw new Exception("Unable to clean message: " + raw_message);
+
+			String key = cleaned_message.keySet().iterator().next().toString();
+
+			if (key == null)
+				throw new Exception("Unable to retrieve key for message: "
+						+ raw_message);
+
+			JSONObject payload = (JSONObject) cleaned_message.get(key);
+
+			String originalString = " |";
+			for (Object k : payload.keySet()) {
+				originalString = originalString + " " + k.toString() + ":"
+						+ payload.get(k).toString();
+			}
+			originalString = key.toUpperCase() + originalString;
+			payload.put("original_string", originalString);
+
+			if (payload == null)
+				throw new Exception("Unable to retrieve payload for message: "
+						+ raw_message);
+
+			if (payload.containsKey("ts")) {
+				String ts = payload.remove("ts").toString();
+				payload.put("timestamp", ts);
+				_LOG.trace("[Metron] Added ts to: " + payload);
+			}
+
+			if (payload.containsKey("id.orig_h")) {
+				String source_ip = payload.remove("id.orig_h").toString();
+				payload.put("ip_src_addr", source_ip);
+				_LOG.trace("[Metron] Added ip_src_addr to: " + payload);
+			} else if (payload.containsKey("tx_hosts")) {
+				JSONArray txHosts = (JSONArray) payload.remove("tx_hosts");
+				if (txHosts != null && !txHosts.isEmpty()) {
+					payload.put("ip_src_addr", txHosts.get(0));
+					_LOG.trace("[Metron] Added ip_src_addr to: " + payload);
+				}
+			}
+			
+			if (payload.containsKey("id.resp_h")) {
+				String source_ip = payload.remove("id.resp_h").toString();
+				payload.put("ip_dst_addr", source_ip);
+				_LOG.trace("[Metron] Added ip_dst_addr to: " + payload);
+			} else if (payload.containsKey("rx_hosts")) {
+				JSONArray rxHosts = (JSONArray) payload.remove("rx_hosts");
+				if (rxHosts != null && !rxHosts.isEmpty()) {
+					payload.put("ip_dst_addr", rxHosts.get(0));
+					_LOG.trace("[Metron] Added ip_dst_addr to: " + payload);
+				}
+			}
+			
+			if (payload.containsKey("id.orig_p")) {
+				String source_port = payload.remove("id.orig_p").toString();
+				payload.put("ip_src_port", source_port);
+				_LOG.trace("[Metron] Added ip_src_port to: " + payload);
+			}
+			if (payload.containsKey("id.resp_p")) {
+				String dest_port = payload.remove("id.resp_p").toString();
+				payload.put("ip_dst_port", dest_port);
+				_LOG.trace("[Metron] Added ip_dst_port to: " + payload);
+			}
+			
+//			if (payload.containsKey("host")) {
+//
+//				String host = payload.get("host").toString().trim();
+//				String tld = tldex.extractTLD(host);
+//
+//				payload.put("tld", tld);
+//				_LOG.trace("[Metron] Added tld to: " + payload);
+//
+//			}
+//			if (payload.containsKey("query")) {
+//				String host = payload.get("query").toString();
+//				String[] parts = host.split("\\.");
+//				int length = parts.length;
+//				if (length >= 2) {
+//					payload.put("tld", parts[length - 2] + "."
+//							+ parts[length - 1]);
+//					_LOG.trace("[Metron] Added tld to: " + payload);
+//				}
+//			}
+
+			_LOG.trace("[Metron] Inner message: " + payload);
+
+			payload.put("protocol", key);
+			_LOG.debug("[Metron] Returning parsed message: " + payload);
+
+			return payload;
+
+		} catch (Exception e) {
+
+			_LOG.error("Unable to Parse Message: " + raw_message);
+			e.printStackTrace();
+			return null;
+		}
+
+	}
+
+	
+}

http://git-wip-us.apache.org/repos/asf/incubator-metron/blob/3854e075/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/parsing/parsers/BasicFireEyeParser.java
----------------------------------------------------------------------
diff --git a/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/parsing/parsers/BasicFireEyeParser.java b/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/parsing/parsers/BasicFireEyeParser.java
new file mode 100644
index 0000000..bdd93ac
--- /dev/null
+++ b/metron-streaming/Metron-MessageParsers/src/main/java/org/apache/metron/parsing/parsers/BasicFireEyeParser.java
@@ -0,0 +1,234 @@
+package com.apache.metron.parsing.parsers;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.TimeZone;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.commons.lang3.StringUtils;
+import org.json.simple.JSONObject;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.Multimap;
+
+import oi.thekraken.grok.api.Grok;
+import oi.thekraken.grok.api.Match;
+import oi.thekraken.grok.api.exception.GrokException;
+
+public class BasicFireEyeParser extends AbstractParser implements Serializable {
+
+	private static final long serialVersionUID = 6328907550159134550L;
+	//String tsRegex = "(.*)([a-z][A-Z]+)\\s+(\\d+)\\s+(\\d+\\:\\d+\\:\\d+)\\s+(\\d+\\.\\d+\\.\\d+\\.\\d+)(.*)$";
+	String tsRegex ="([a-zA-Z]{3})\\s+(\\d+)\\s+(\\d+\\:\\d+\\:\\d+)\\s+(\\d+\\.\\d+\\.\\d+\\.\\d+)";
+	
+	
+	Pattern tsPattern = Pattern.compile(tsRegex);
+	// private transient static MetronGrok grok;
+	// private transient static InputStream pattern_url;
+
+	public BasicFireEyeParser() throws Exception {
+		// pattern_url = getClass().getClassLoader().getResourceAsStream(
+		// "patterns/fireeye");
+		//
+		// File file = ParserUtils.stream2file(pattern_url);
+		// grok = MetronGrok.create(file.getPath());
+		//
+		// grok.compile("%{FIREEYE_BASE}");
+	}
+
+	@Override
+	public JSONObject parse(byte[] raw_message) {
+		String toParse = "";
+
+		try {
+
+			toParse = new String(raw_message, "UTF-8");
+
+			// String[] mTokens = toParse.split(" ");
+
+			String positveIntPattern = "<[1-9][0-9]*>";
+			Pattern p = Pattern.compile(positveIntPattern);
+			Matcher m = p.matcher(toParse);
+
+			String delimiter = "";
+
+			while (m.find()) {
+				delimiter = m.group();
+
+			}
+
+			if (!StringUtils.isBlank(delimiter)) {
+				String[] tokens = toParse.split(delimiter);
+
+				if (tokens.length > 1)
+					toParse = delimiter + tokens[1];
+
+			}
+
+			JSONObject toReturn = parseMessage(toParse);
+
+			toReturn.put("timestamp", getTimeStamp(toParse,delimiter));
+
+			return toReturn;
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			return null;
+		}
+
+	}
+
+	public static Long convertToEpoch(String m, String d, String ts,
+			boolean adjust_timezone) throws ParseException {
+		d = d.trim();
+
+		if (d.length() <= 2)
+			d = "0" + d;
+
+		Date date = new SimpleDateFormat("MMM", Locale.ENGLISH).parse(m);
+		Calendar cal = Calendar.getInstance();
+		cal.setTime(date);
+		String month = String.valueOf(cal.get(Calendar.MONTH));
+		int year = Calendar.getInstance().get(Calendar.YEAR);
+
+		if (month.length() <= 2)
+			month = "0" + month;
+
+		String coglomerated_ts = year + "-" + month + "-" + d + " " + ts;
+
+		System.out.println(coglomerated_ts);
+
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+		if (adjust_timezone)
+			sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
+
+		date = sdf.parse(coglomerated_ts);
+		long timeInMillisSinceEpoch = date.getTime();
+
+		return timeInMillisSinceEpoch;
+	}
+
+	private long getTimeStamp(String toParse,String delimiter) throws ParseException {
+		
+		long ts = 0;
+		String month = null;
+		String day = null;
+		String time = null;
+		Matcher tsMatcher = tsPattern.matcher(toParse);
+		if (tsMatcher.find()) {
+			month = tsMatcher.group(1);
+			day = tsMatcher.group(2);
+			time = tsMatcher.group(3);
+	
+				} else {
+			_LOG.warn("Unable to find timestamp in message: " + toParse);
+			ts = convertToEpoch(month, day, time, true);
+		}
+
+			return ts;
+	
+	}
+
+	private JSONObject parseMessage(String toParse) {
+
+		// System.out.println("Received message: " + toParse);
+
+		// MetronMatch gm = grok.match(toParse);
+		// gm.captures();
+
+		JSONObject toReturn = new JSONObject();
+		//toParse = toParse.replaceAll("  ", " ");
+		String[] mTokens = toParse.split("\\s+");
+	 //mTokens = toParse.split(" ");
+
+		// toReturn.putAll(gm.toMap());
+
+		String id = mTokens[4];
+
+		// We are not parsing the fedata for multi part message as we cannot
+		// determine how we can split the message and how many multi part
+		// messages can there be.
+		// The message itself will be stored in the response.
+
+		String[] tokens = id.split("\\.");
+		if (tokens.length == 2) {
+
+			String[] array = Arrays.copyOfRange(mTokens, 1, mTokens.length - 1);
+			String syslog = Joiner.on(" ").join(array);
+
+			Multimap<String, String> multiMap = formatMain(syslog);
+
+			for (String key : multiMap.keySet()) {
+
+				String value = Joiner.on(",").join(multiMap.get(key));
+				toReturn.put(key, value.trim());
+			}
+
+		}
+
+		toReturn.put("original_string", toParse);
+
+		String ip_src_addr = (String) toReturn.get("dvc");
+		String ip_src_port = (String) toReturn.get("src_port");
+		String ip_dst_addr = (String) toReturn.get("dst_ip");
+		String ip_dst_port = (String) toReturn.get("dst_port");
+
+		if (ip_src_addr != null)
+			toReturn.put("ip_src_addr", ip_src_addr);
+		if (ip_src_port != null)
+			toReturn.put("ip_src_port", ip_src_port);
+		if (ip_dst_addr != null)
+			toReturn.put("ip_dst_addr", ip_dst_addr);
+		if (ip_dst_port != null)
+			toReturn.put("ip_dst_port", ip_dst_port);
+
+		System.out.println(toReturn);
+
+		return toReturn;
+	}
+
+	private Multimap<String, String> formatMain(String in) {
+		Multimap<String, String> multiMap = ArrayListMultimap.create();
+		String input = in.replaceAll("cn3", "dst_port")
+				.replaceAll("cs5", "cncHost").replaceAll("proto", "protocol")
+				.replaceAll("rt=", "timestamp=").replaceAll("cs1", "malware")
+				.replaceAll("dst=", "dst_ip=")
+				.replaceAll("shost", "src_hostname")
+				.replaceAll("dmac", "dst_mac").replaceAll("smac", "src_mac")
+				.replaceAll("spt", "src_port")
+				.replaceAll("\\bsrc\\b", "src_ip");
+		String[] tokens = input.split("\\|");
+
+		if (tokens.length > 0) {
+			String message = tokens[tokens.length - 1];
+
+			String pattern = "([\\w\\d]+)=([^=]*)(?=\\s*\\w+=|\\s*$) ";
+			Pattern p = Pattern.compile(pattern);
+			Matcher m = p.matcher(message);
+
+			while (m.find()) {
+				String[] str = m.group().split("=");
+				multiMap.put(str[0], str[1]);
+
+			}
+
+		}
+		return multiMap;
+	}
+
+	
+
+}
\ No newline at end of file



Mime
View raw message