package com.googlecode.gwt.test.internal.resources; import com.googlecode.gwt.test.internal.AfterTestCallback; import com.googlecode.gwt.test.internal.AfterTestCallbackManager; import java.io.*; import java.net.URL; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Utility class to parse CSS files.<strong>For internal use only.</strong> * * @author Gael Lazzari */ class CssResourceReader implements AfterTestCallback { public static class CssParsingResult { private final Map<String, String> cssConstants; private CssParsingResult(Map<String, String> cssConstants) { this.cssConstants = cssConstants; } /** * Returns the value of the css constant passed as parameter * * @param name The name of the constant to retrive the value * @return The value of the corresponding constants, or null if it does not exist */ public String getConstantValue(String name) { return cssConstants.get(name); } } private static final Pattern CSS_CONSTANT_PATTERN = Pattern.compile("^\\s*@def (\\S+)\\s+(\\S+)\\s*$"); private static final CssResourceReader INSTANCE = new CssResourceReader(); public static CssResourceReader get() { return INSTANCE; } private final Map<URL, CssParsingResult> cache; private CssResourceReader() { cache = new HashMap<URL, CssParsingResult>(); AfterTestCallbackManager.get().registerCallback(this); } public void afterTest() throws Throwable { cache.clear(); } public CssParsingResult readCss(List<URL> urls) throws IOException { Map<String, String> cssConstants = new HashMap<String, String>(); for (URL url : urls) { cssConstants.putAll(readCssFile(url).cssConstants); } return new CssParsingResult(cssConstants); } public CssParsingResult readCss(String text) throws IOException { return parse(new StringReader(text)); } public CssParsingResult readCssFile(URL url) throws IOException { CssParsingResult cssConstants = cache.get(url); if (cssConstants == null) { cssConstants = parse(new InputStreamReader(url.openStream(), "UTF-8")); cache.put(url, cssConstants); } return cssConstants; } private CssParsingResult parse(Reader reader) throws IOException { Map<String, String> cssConstants = new HashMap<String, String>(); BufferedReader br = null; try { br = new BufferedReader(reader); String line; Matcher m; while ((line = br.readLine()) != null) { m = CSS_CONSTANT_PATTERN.matcher(line); if (m.matches()) { cssConstants.put(m.group(1), m.group(2)); } } return new CssParsingResult(cssConstants); } finally { if (br != null) { br.close(); } } } }