view src/nabble/view/web/template/RequestNamespace.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.java.HtmlUtils;
import fschmidt.util.servlet.ServletUtils;
import nabble.model.Node;
import nabble.model.Site;
import nabble.model.ViewCount;
import nabble.naml.compiler.Command;
import nabble.naml.compiler.CommandSpec;
import nabble.naml.compiler.IPrintWriter;
import nabble.naml.compiler.Interpreter;
import nabble.naml.compiler.Namespace;
import nabble.naml.compiler.ScopedInterpreter;
import nabble.naml.namespaces.StringList;
import nabble.naml.namespaces.TemplateException;
import nabble.view.lib.Jtp;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@Namespace (
	name = "http_request",
	global = true
)
public class RequestNamespace {
	public final HttpServletRequest request;

	public RequestNamespace(HttpServletRequest request) {
		this.request = request;
	}

	public static final CommandSpec NAME = new CommandSpec.Builder()
		.dotParameter("name")
		.build()
	;

	public static final CommandSpec get_parameter = NAME;

	@Command public void get_parameter(IPrintWriter out,Interpreter interp) {
		String name = interp.getArgString("name");
		out.print( request.getParameter(name) );
	}

	public static final CommandSpec get_request_header = NAME;

	@Command public void get_request_header(IPrintWriter out,Interpreter interp) {
		String name = interp.getArgString("name");
		out.print( request.getHeader(name) );
	}

	public static final CommandSpec get_cookie_value = NAME;

	@Command public void get_cookie_value(IPrintWriter out,Interpreter interp) {
		String name = interp.getArgString("name");
		out.print( ServletUtils.getCookieValue(request, name) );
	}

	@Command public void request_method(IPrintWriter out,Interpreter interp) {
		out.print( request.getMethod() );
	}

	@Command public void servlet_path(IPrintWriter out,Interpreter interp) {
		out.print( request.getServletPath() );
	}

	@Command public void server_name(IPrintWriter out,Interpreter interp) {
		out.print( request.getServerName() );
	}

	@Command public void current_url(IPrintWriter out,Interpreter interp) {
		out.print( interp.encode( ServletUtils.getCurrentURL(request) ) );
	}

	@Command public void current_path(IPrintWriter out,Interpreter interp) {
		out.print( interp.encode( Jtp.getCurrentPath(request) ) );
	}

	// overridden in ServletNamespace
	public static final CommandSpec get_node_from_request_parameter = CommandSpec.DO;

	@Command public void get_node_from_request_parameter(IPrintWriter out,ScopedInterpreter<NodeNamespace> interp)
		throws IOException, ServletException, TemplateException
	{
		Node node = NabbleNamespace.current().site().getNode( Jtp.getLong(request, "node") );
		if( node != null )
			out.print( interp.getArg(new NodeNamespace(node),"do") );
	}

	public static final CommandSpec get_parameter_values = CommandSpec.DO()
		.parameters("name")
		.build()
	;

	@Command public void get_parameter_values(IPrintWriter out,ScopedInterpreter<ParameterValueList> interp)
		throws IOException, ServletException
	{
		String name = interp.getArgString("name");
		String[] values = request.getParameterValues(name);
		List<String> list = values == null ? Collections.<String>emptyList() : Arrays.asList(values);
		Object block = interp.getArg(new ParameterValueList(list),"do");
		out.print(block);
	}

	public static final CommandSpec get_parameters_pipe_separated = CommandSpec.DO()
		.parameters("name")
		.build()
	;

	@Command public void get_parameters_pipe_separated(IPrintWriter out,ScopedInterpreter<ParameterValueList> interp) {
		String name = interp.getArgString("name");
		String values = request.getParameter(name);
		List<String> list = values == null ? Collections.<String>emptyList() : Arrays.asList(values.split("\\|"));
		for (int i = 0; i < list.size(); i++) {
			list.set(i, HtmlUtils.urlDecode(list.get(i)));
		}
		Object block = interp.getArg(new ParameterValueList(list),"do");
		out.print(block);
	}

	@Namespace (
		name = "parameter_value_list",
		global = true
	)
	public static final class ParameterValueList extends StringList {

		ParameterValueList(List<String> values) {
			super(values);
		}

		public List<String> values() {
			return elements;
		}

		@Command public void current_parameter_value(IPrintWriter out,Interpreter interp) {
			out.print(get());
		}


		// hack for now

		private Map<String,Integer> views = null;

		public static final CommandSpec node_views = new CommandSpec.Builder()
			.parameters("node_id")
			.build()
		;

		@Command public void node_views(IPrintWriter out,Interpreter interp) {
			if( views == null ) {
				Site site = NabbleNamespace.current().site();
				List<Long> ids = new ArrayList<Long>();
				for( String value : elements ) {
					ids.add(Long.parseLong(value));
				}
				views = new HashMap<String,Integer>();
				for( Map.Entry<Long,Integer> entry : ViewCount.getCounts(site,ids).entrySet() ) {
					views.put( Long.toString(entry.getKey()), entry.getValue() );
				}
			}
			String nodeId = interp.getArgString("node_id");
			out.print( views.get(nodeId) );
		}

	}





	@Command public void request_base_url(IPrintWriter out,Interpreter interp) {
		out.print( interp.encode( Jtp.getBaseUrl(request) ) );
	}
}