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