diff src/nabble/view/web/template/UrlMapperNamespace.java @ 0:7ecd1a4ef557

add content
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 21 Mar 2019 19:15:52 -0600
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/nabble/view/web/template/UrlMapperNamespace.java	Thu Mar 21 19:15:52 2019 -0600
@@ -0,0 +1,117 @@
+package nabble.view.web.template;
+
+import fschmidt.util.servlet.UrlMapping;
+import nabble.model.ModelHome;
+import nabble.model.Node;
+import nabble.model.Site;
+import nabble.naml.namespaces.BasicNamespace;
+import nabble.naml.compiler.Command;
+import nabble.naml.compiler.IPrintWriter;
+import nabble.naml.compiler.Interpreter;
+import nabble.naml.compiler.CommandSpec;
+import nabble.naml.compiler.Template;
+import nabble.naml.compiler.TemplatePrintWriter;
+import nabble.naml.compiler.Namespace;
+import nabble.view.lib.Jtp;
+
+import javax.servlet.http.HttpServletRequest;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+
+@Namespace (
+	name = "url_mapper",
+	global = true
+)
+public final class UrlMapperNamespace {
+	private final String path;
+	private final Map<String,String[]> params = new HashMap<String,String[]>();
+
+	private UrlMapperNamespace(HttpServletRequest request) {
+		this( request.getServletPath() + Jtp.hideNull(request.getPathInfo()) );
+	}
+
+	private UrlMapperNamespace(String path) {
+		this.path = path;
+	}
+
+	@Command("path") public void _path(IPrintWriter out,Interpreter interp) {
+		out.print( path );
+	}
+
+	public static final CommandSpec set_parameter = new CommandSpec.Builder()
+		.parameters("name")
+		.dotParameter("value")
+		.outputtedParameters()
+		.build()
+	;
+
+	@Command public void set_parameter(IPrintWriter out,Interpreter interp) {
+		String name = interp.getArgString("name");
+		String value = interp.getArgString("value");
+		params.put(name,new String[]{value});
+	}
+
+	public static UrlMapping getUrlMapping(HttpServletRequest request) {
+		Site site = Jtp.getSite(request);
+		if( site == null )
+			return null;
+		Template template = site.getTemplate( "url mapper" ,
+			BasicNamespace.class, NabbleNamespace.class, UrlMapperNamespace.class
+		);
+		if( template == null )
+			return null;
+		UrlMapperNamespace umn = new UrlMapperNamespace(request);
+		template.run( TemplatePrintWriter.NULL, Collections.<String,Object>emptyMap(),
+			new BasicNamespace(template), new NabbleNamespace(site), umn
+		);
+		if( umn.params.isEmpty() )
+			return null;
+		return new UrlMapping(NamlServlet.class,umn.params);
+	}
+
+	public static Map<String,String> getParams(String urlStr) {
+		try {
+			URL url = new URL(urlStr);
+			String domain = url.getHost();
+			Long siteId = Jtp.getSiteIdFromDomain(domain);
+			if( siteId == null )
+				return null;
+			Site site = ModelHome.getSite(siteId);
+			Template template = site.getTemplate( "url mapper" ,
+				BasicNamespace.class, NabbleNamespace.class, UrlMapperNamespace.class
+			);
+			if( template == null )
+				return null;
+			UrlMapperNamespace umn = new UrlMapperNamespace(url.getPath());
+			template.run( TemplatePrintWriter.NULL, Collections.<String,Object>emptyMap(),
+				new BasicNamespace(template), new NabbleNamespace(site), umn
+			);
+			Map<String,String> params = new HashMap<String,String>();
+			for( Map.Entry<String,String[]> entry : umn.params.entrySet() ) {
+				params.put( entry.getKey(), entry.getValue()[0] );
+			}
+			return params;
+		} catch(MalformedURLException e) {
+			return null;
+		}
+	}
+
+	public static Node getNodeFromUrl(String url) {
+		Site site = Jtp.getSiteFromUrl(url);
+		if( site == null )
+			return null;
+		Map<String,String> params = getParams(url);
+		if( params == null )
+			return null;
+		try {
+			return site.getNode( Long.parseLong( params.get("node") ) );
+		} catch(NumberFormatException e) {
+			return null;
+		}
+	}
+
+}