diff src/nabble/view/web/mailing_list/MailingListNamespace.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/mailing_list/MailingListNamespace.java	Thu Mar 21 19:15:52 2019 -0600
@@ -0,0 +1,200 @@
+package nabble.view.web.mailing_list;
+
+import fschmidt.db.DbDatabase;
+import fschmidt.util.mail.MailAddress;
+import nabble.model.Db;
+import nabble.model.ListServer;
+import nabble.model.MailingList;
+import nabble.model.ModelException;
+import nabble.model.Node;
+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.ListSequence;
+import nabble.naml.namespaces.TemplateException;
+import nabble.view.web.template.NodeNamespace;
+import nabble.view.web.template.ServletNamespace;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.List;
+
+
+@Namespace (
+	name = "mailing_list",
+	global = true
+)
+public class MailingListNamespace {
+	private Node node;
+	private MailingList mailingList;
+
+	public MailingListNamespace(Node node) {
+		this.node = node;
+		this.mailingList = node.getMailingList();
+	}
+
+	public MailingListNamespace(MailingList mailingList) {
+		this.node = mailingList.getForum();
+		this.mailingList = mailingList;
+	}
+
+	private DbDatabase db() {
+		return node.getSite().getDb();
+	}
+
+	public static final CommandSpec mailing_list_node = CommandSpec.DO;
+
+	@Command public void mailing_list_node(IPrintWriter out,ScopedInterpreter<NodeNamespace> interp) {
+		NodeNamespace ns = new NodeNamespace(node);
+		out.print( interp.getArg(ns,"do") );
+	}
+
+	@Command public void mailing_list_address(IPrintWriter out,Interpreter interp) {
+		out.print( mailingList.getListAddress() );
+	}
+
+	@Command public void mailing_list_url(IPrintWriter out,Interpreter interp) {
+		out.print( interp.encode( mailingList.getUrl() ) );
+	}
+
+	@Command public void mailing_list_server(IPrintWriter out,Interpreter interp) {
+		out.print( mailingList.getListServer().getType() );
+	}
+
+	@Command public void mailing_list_prefix(IPrintWriter out,Interpreter interp) {
+		out.print( mailingList.getListName() );
+	}
+
+	@Command public void plain_text_only(IPrintWriter out,Interpreter interp) {
+		out.print( mailingList.plainTextOnly() );
+	}
+
+	@Command public void ignore_xnoarchive(IPrintWriter out,Interpreter interp) {
+		out.print( mailingList.ignoreNoArchive() );
+	}
+
+	@Command public void mailing_list_options_path(IPrintWriter out,Interpreter interp) {
+		out.print( interp.encode( "/mailing_list/MailingListOptions.jtp?forum=" + node.getId() ) );
+	}
+
+	@Command public void can_subscribe(IPrintWriter out,Interpreter interp) {
+		out.print( mailingList.getListServer().canSubscribe() );
+	}
+
+	@Command public void subscriber_address(IPrintWriter out,Interpreter interp) {
+		out.print( mailingList.getSubscriberAddress().getAddrSpec() );
+	}
+
+	public static final CommandSpec available_servers = CommandSpec.DO;
+
+	@Command public void available_servers(IPrintWriter out,ScopedInterpreter<Servers> interp)
+		throws IOException, ServletException
+	{
+		String[] serverTypes = ListServer.getAllServerTypes();
+		Object block = interp.getArg(new Servers(Arrays.asList(serverTypes)),"do");
+		out.print(block);
+	}
+
+	@Namespace (
+		name = "server_list",
+		global = false
+	)
+	public static final class Servers extends ListSequence<String> {
+
+		Servers(List<String> serverTypes) {
+			super(serverTypes);
+		}
+
+		@Command public void current_server(IPrintWriter out,Interpreter interp) {
+			out.print(ListServer.getServer(get()).getType());
+		}
+
+		@Command public void current_server_name(IPrintWriter out,Interpreter interp) {
+			out.print(ListServer.getServer(get()).getViewName());
+		}
+	}
+
+	public static final CommandSpec save = new CommandSpec.Builder()
+		.dotParameter("do")
+		.parameters("address","url","server","plain_text_only","ignore_xnoarchive")
+		.optionalParameters("prefix")
+		.requiredInStack(ServletNamespace.class)
+		.build()
+	;
+
+	@Command public void save(IPrintWriter out,Interpreter interp)
+		throws TemplateException
+	{
+		ServletNamespace servletNs = interp.getFromStack(ServletNamespace.class);
+		HttpServletRequest request = servletNs.request;
+		if( !"POST".equals(request.getMethod()) )
+			return;
+
+		String address = interp.getArgString("address");
+		if (address == null)
+			throw ModelException.newInstance("invalid_list_address");
+		address = address.trim().toLowerCase();
+		if (!new MailAddress(address).isValid())
+			throw ModelException.newInstance("invalid_list_address");
+
+		String url = interp.getArgString("url");
+		if (url == null)
+			throw ModelException.newInstance("invalid_list_url");
+		try {
+			new URL(url);
+		} catch (MalformedURLException e) {
+			throw ModelException.newInstance("invalid_list_url");
+		}
+
+		String server = interp.getArgString("server");
+		ListServer listServerType = ListServer.getServer(server);
+
+		String prefix = interp.getArgString("prefix");
+		if (prefix != null && prefix.trim().length() == 0)
+			prefix = null;
+
+		boolean isPlainTextOnly = interp.getArgAsBoolean("plain_text_only",false);
+		boolean isIgnoreXNoArchive = interp.getArgAsBoolean("ignore_xnoarchive",false);
+
+		db().beginTransaction();
+		try {
+			node = node.getGoodCopy(); // In case the node needs to be updated in the "do" block.
+			mailingList = node.getMailingList();
+			if (mailingList != null) {
+				mailingList.setListAddress(address);
+				mailingList.setUrl(url);
+				mailingList.setListServer(listServerType);
+			} else {
+				mailingList = node.newMailingList(listServerType, address, url);
+			}
+			mailingList.setListName(prefix);
+			mailingList.setPlainTextOnly(isPlainTextOnly);
+			mailingList.setIgnoreNoArchive(isIgnoreXNoArchive);
+
+			interp.getArgString("do");
+			mailingList.update();
+			db().commitTransaction();
+		} finally {
+			db().endTransaction();
+		}
+	}
+
+	@Command public void remove(IPrintWriter out,Interpreter interp)
+		throws TemplateException
+	{
+		db().beginTransaction();
+		try {
+			node.getGoodCopy().deleteMailingList();
+			db().commitTransaction();
+		} finally {
+			db().endTransaction();
+		}
+	}
+}