Package com.dubture.symfony.core.parser

Source Code of com.dubture.symfony.core.parser.YamlRoutingParser

/*******************************************************************************
* 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);
        }
      }
    }
  }
}
TOP

Related Classes of com.dubture.symfony.core.parser.YamlRoutingParser

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.