package com.nabalive.framework.web; import com.google.common.collect.ImmutableMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sun.reflect.generics.reflectiveObjects.NotImplementedException; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by IntelliJ IDEA. * User: Julien Cheype * Date: 10/20/11 */ public class Route { private static final Logger logger = LoggerFactory.getLogger(Route.class); private final Pattern pattern; private final Pattern patternContentType; private final Pattern paramsFinder = Pattern.compile("/:([^/]*)"); private final Map<String, Integer> names; public Route(String path) { this(path, null); } public Route(String path, String contentType) { if(contentType != null) patternContentType = Pattern.compile(contentType); else patternContentType = null; final HashMap<String, Integer> map = new HashMap<String, Integer>(); int i = 1; final Matcher matcher = paramsFinder.matcher(path); while (matcher.find()) { String name = matcher.group(1); map.put(name, i++); logger.debug(name); } String newStringPattern = path.replaceAll("/(:[^/]*)", "/([^/]*)"); logger.debug("new pattern: " + newStringPattern); pattern = Pattern.compile(newStringPattern); names = new ImmutableMap.Builder<String, Integer>() .putAll(map) .build(); } public Map<String, String> parse(String path, String contentType) { if(contentType != null && patternContentType != null){ Matcher contentTypeMatcher = patternContentType.matcher(contentType); if(!contentTypeMatcher.matches()){ return null; } } final Matcher matcher = pattern.matcher(path); if (!matcher.matches()) { return null; } Map<String, String> result = new HashMap<String, String>(); for (Map.Entry<String, Integer> entry : names.entrySet()) { String value = matcher.group(entry.getValue()); result.put(entry.getKey(), value); } return result; } public void handle(Request request, Response response, Map<String,String> map) throws Exception { throw new NotImplementedException(); } @Override public String toString() { return "Route{" + "pattern=" + pattern + '}'; } }