/******************************************************************************* * This file is part of the Symfony eclipse plugin. * * (c) Robert Gruendler <r.gruendler@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. ******************************************************************************/ package com.dubture.symfony.core.parser; import java.io.InputStream; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.Scanner; import java.util.Stack; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.yaml.snakeyaml.Yaml; import com.dubture.symfony.core.log.Logger; import com.dubture.symfony.index.model.Route; import com.dubture.symfony.index.model.RoutingResource; /** * * {@link YamlRoutingParser}, does what you expect ;) * * * @author Robert Gruendler <r.gruendler@gmail.com> * */ public class YamlRoutingParser { private InputStream input; private Stack<Route> routes = new Stack<Route>(); private Stack<RoutingResource> resources = new Stack<RoutingResource>(); public Stack<Route> getRoutes() { return routes; } public Stack<RoutingResource> getResources() { return resources; } public YamlRoutingParser(InputStream input) { this.input = input; } @SuppressWarnings("rawtypes") public void parse() { // we need to replace the % signs, otherwise // the yaml parser will throw a syntax error exception Pattern replaceCharPattern = Pattern.compile("%", Pattern.COMMENTS); StringBuilder text = new StringBuilder(); String NL = System.getProperty("line.separator"); Scanner scanner = new Scanner(input); try { while (scanner.hasNextLine()){ text.append(scanner.nextLine() + NL); } } finally{ scanner.close(); } Matcher m = replaceCharPattern.matcher(text); String tokenString = m.replaceAll("_"); Yaml yaml = new Yaml(); Map map = (Map) yaml.load(tokenString); if (map == null) { Logger.log(Logger.WARNING, "Unable to load yaml file " + tokenString); return; } Iterator it = map.keySet().iterator(); while(it.hasNext()) { Object key = it.next(); Object value = map.get(key); if (key.getClass() == String.class && value.getClass() == LinkedHashMap.class) { try { String name = (String) key; LinkedHashMap params = (LinkedHashMap) value; String pattern = (String) params.get("pattern"); if (params.containsKey("resource")) { String resource = (String) params.get("resource"); String type = (String) params.get("type"); String prefix = (String) params.get("prefix"); resources.add(new RoutingResource(type, resource, prefix)); } else { LinkedHashMap defaults = (LinkedHashMap) params.get("defaults"); if(defaults == null) continue; String viewPath = (String) defaults.get("_controller"); routes.push(new Route(name, pattern, viewPath)); } } catch (Exception e) { Logger.logException(e); } } } } }