view 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 source

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;
		}
	}

}