/******************************************************************************* * Copyright (c) 2006 IBM Corporation. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - Jeff Briggs, Henry Hughes, Ryan Morse *******************************************************************************/ package org.eclipse.linuxtools.systemtap.graphing.core.datasets.table; import java.util.Arrays; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.linuxtools.systemtap.graphing.core.datasets.IDataEntry; import org.eclipse.linuxtools.systemtap.graphing.core.datasets.IDataSetParser; public class TableParser implements IDataSetParser { public TableParser(String[] regEx, String delimiter) { this.regEx = Arrays.copyOf(regEx, regEx.length); this.delimiter = delimiter; buildPattern(); } private void buildPattern() { StringBuilder wholeRegExpr = new StringBuilder(); for(int i=0; i<regEx.length; i++) { wholeRegExpr.append('(' + regEx[i] + ')'); } wholePattern = Pattern.compile(wholeRegExpr.toString()); delimPattern = Pattern.compile(delimiter); } @Override public IDataEntry parse(StringBuilder s) { if(null == s) { return null; } TableEntry e = null; Matcher wholeMatcher = wholePattern.matcher(s); Matcher delimMatcher = delimPattern.matcher(s); Object[] data; int end = 0; if(delimMatcher.find()) { e = new TableEntry(); end = delimMatcher.start(); int group, j; while(wholeMatcher.find() && wholeMatcher.end() < end) { group = 0; data = new Object[regEx.length>>1]; for(int i=0; i<regEx.length; i++) { group++; for(j=0; j<regEx[i].length(); j++) { if(regEx[i].charAt(j) == ')') { group++; } } if(0 == (i&1)) { data[i>>1] = wholeMatcher.group(group); } } e.add(data); } s.delete(0, delimMatcher.end()); } return e; } private String[] regEx; private String delimiter; private Pattern wholePattern; private Pattern delimPattern; }