package ca.concordia.cssanalyser.parser.flute;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.URL;
import org.slf4j.Logger;
import org.w3c.css.sac.InputSource;
import org.w3c.css.sac.Parser;
import org.w3c.css.sac.helpers.ParserFactory;
import ca.concordia.cssanalyser.app.FileLogger;
import ca.concordia.cssanalyser.cssmodel.StyleSheet;
import ca.concordia.cssanalyser.parser.CSSParser;
import ca.concordia.cssanalyser.parser.ParseException;
public class FluteCSSParser implements CSSParser {
private CSSDocumentHandler docHandler;
private Parser parser;
private Logger LOGGER = FileLogger.getLogger(FluteCSSParser.class);
static {
System.setProperty("org.w3c.css.sac.parser", "org.w3c.flute.parser.Parser");
}
public FluteCSSParser() {
}
public StyleSheet parseCSSString(String css) throws ParseException {
try {
return parseStreamCSS(new ByteArrayInputStream(css.getBytes()));
} catch (Exception e) {
e.printStackTrace();
throw new ParseException(e);
}
}
public StyleSheet parseExternalCSS(String path) throws ParseException {
try {
LOGGER.info("Parsing " + path);
URL uri = new URL("file", null, -1, path);
StyleSheet styleSheet = parseStreamCSS(uri.openStream());
styleSheet.setPath(path);
LOGGER.info("Parsed " + path);
return styleSheet;
}
catch (Exception e) {
LOGGER.warn(e.toString());
throw new ParseException(e);
}
}
private StyleSheet parseStreamCSS(InputStream inputStream) throws Exception {
StyleSheet styleSheet = new StyleSheet();
InputSource source = new InputSource();
source.setByteStream(inputStream);
//source.setURI(uri.toString());
ParserFactory factory = new ParserFactory();
parser = factory.makeParser();
docHandler = new CSSDocumentHandler(styleSheet);
parser.setDocumentHandler(docHandler);
parser.parseStyleSheet(source);
inputStream.close();
return styleSheet;
}
}