blob: e8ed29c39b196865a99394a6aeed2af8d3753705 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2008 IBM Corporation and Others
* 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:
* Kentarou FUKUDA - initial API and implementation
*******************************************************************************/
package org.eclipse.actf.visualization.eval.guideline;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Set;
import java.util.Stack;
import java.util.TreeSet;
import java.util.Vector;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.eclipse.actf.visualization.eval.IEvaluationItem;
import org.eclipse.actf.visualization.eval.IGuidelineItem;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
public class CheckItemReader extends DefaultHandler {
private static final String CHECKER_CONFIG = "checker-config";
private static final String CHECK_ITEM = "checkitem";
private static final String GUIDELINE = "guideline";
private static final String GITEM = "gItem";
private static final String MITEM = "mItem";
private static final String DESC = "desc";
private static final String ID = "id";
private static final String NAME = "name";
private static final String TYPE = "type";
private static final String METRICS = "metrics";
private static final String SCORE = "score";
private static final String DESCRIPTION = "description";
// private static final String LANG = "lang";
private static final short IN_DEFAULT = 0;
private static final short IN_GUIDELINE = 1;
private static final short IN_METRICS = 2;
private static final short IN_DESCRIPTION = 3;
public static CheckItemReader parse(InputStream is, GuidelineHolder gh) {
CheckItemReader cir = new CheckItemReader(gh);
try {
SAXParserFactory spfactory = SAXParserFactory.newInstance();
SAXParser parser = spfactory.newSAXParser();
parser.parse(is, cir);
} catch (Exception e) {
}
return (cir);
}
private HashMap<String, IEvaluationItem> checkItemMap = new HashMap<String, IEvaluationItem>();
private Stack<Short> statusStack = new Stack<Short>();
private String curValue = "";
private EvaluationItem curItem = new EvaluationItem("", "");
private short status = -1;
private boolean succeed = false;
private GuidelineHolder guidelineHolder;
private Vector<IGuidelineItem> guidelineV = new Vector<IGuidelineItem>();
private Set<String> metricsSet = new TreeSet<String>(new MetricsNameComparator());
// comparator
// &
// metrics.xml
private Vector<MetricsItem> metricsV = new Vector<MetricsItem>();
/**
*
*/
public CheckItemReader(GuidelineHolder guidelineHolder) {
this.guidelineHolder = guidelineHolder;
}
/**
*
*/
public void characters(char[] ch, int offset, int length) {
if (length > 0) {
curValue += (new String(ch, offset, length));
}
}
/**
*
*/
public void endDocument() {
// need validation
succeed = true;
}
/**
*
*/
public void endElement(String uri, String localName, String qName) {
if (qName.equals(GITEM)) {
} else if (qName.equals(MITEM)) {
} else if (qName.equals(DESC)) {
} else if (qName.equals(CHECK_ITEM)) {
checkItemMap.put(curItem.getId(), curItem);
if (!statusStack.isEmpty()) {
status = ((Short) statusStack.pop()).shortValue();
}
} else if (qName.equals(GUIDELINE)) {
GuidelineItem[] gis = new GuidelineItem[guidelineV.size()];
guidelineV.toArray(gis);
curItem.setGuidelines(gis);
if (!statusStack.isEmpty()) {
status = ((Short) statusStack.pop()).shortValue();
}
} else if (qName.equals(METRICS)) {
MetricsItem[] mis = new MetricsItem[metricsV.size()];
metricsV.toArray(mis);
curItem.setMetrics(mis);
if (!statusStack.isEmpty()) {
status = ((Short) statusStack.pop()).shortValue();
}
} else if (qName.equals(DESCRIPTION)) {
// TODO
if (!statusStack.isEmpty()) {
status = ((Short) statusStack.pop()).shortValue();
}
} else if (qName.equals(CHECKER_CONFIG)) {
} else {
// in metrics
System.out.println("unknown element(end): " + qName);
}
}
/**
*
*/
public void startDocument() {
}
/**
*
*/
public void startElement(String uri, String localName, String qName, Attributes attributes) {
curValue = "";
if (qName.equals(GITEM)) {
IGuidelineItem gi = guidelineHolder.getGuidelineItem(getValue(NAME, attributes, true), getValue(ID, attributes, true));
// System.out.println(getValue(NAME,attributes)+"
// "+getValue(ID,attributes)+" : "+gi);
if (gi != null) {
guidelineV.add(gi);
}
} else if (qName.equals(MITEM)) {
String metrics = getValue(NAME, attributes, true);
String scoreS = getValue(SCORE, attributes, true);
if (metrics.length() > 0) {
metricsSet.add(metrics);
metricsV.add(new MetricsItem(metrics, scoreS));
}
} else if (qName.equals(CHECK_ITEM)) {
curItem = new EvaluationItem(getValue(ID, attributes), getValue(TYPE, attributes));
statusStack.push(new Short(status));
status = IN_DEFAULT;
} else if (qName.equals(GUIDELINE)) {
guidelineV = new Vector<IGuidelineItem>();
statusStack.push(new Short(status));
status = IN_GUIDELINE;
} else if (qName.equals(METRICS)) {
metricsV = new Vector<MetricsItem>();
statusStack.push(new Short(status));
status = IN_METRICS;
} else if (qName.equals(DESCRIPTION)) {
statusStack.push(new Short(status));
status = IN_DESCRIPTION;
} else if (qName.equals(CHECKER_CONFIG)) {
} else {
}
}
private String getValue(String target, Attributes attrs) {
return (getValue(target, attrs, false));
}
private String getValue(String target, Attributes attrs, boolean trim) {
String result = attrs.getValue(target);
if (result == null) {
result = "";
}
if (trim) {
return (result.trim());
}
return (result);
}
public boolean isSucceed() {
return succeed;
}
public HashMap<String, IEvaluationItem> getCheckItemMap() {
return checkItemMap;
}
public Set<String> getMetricsSet() {
return metricsSet;
}
}