Mercurial Hosting > nabble
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; + } + } + +}