diff src/nabble/view/web/forum/Permalink.java @ 0:7ecd1a4ef557

add content
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 21 Mar 2019 19:15:52 -0600
parents
children 18cf4872fd7f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/nabble/view/web/forum/Permalink.java	Thu Mar 21 19:15:52 2019 -0600
@@ -0,0 +1,125 @@
+package nabble.view.web.forum;
+
+import fschmidt.util.servlet.CanonicalUrl;
+import fschmidt.util.servlet.ServletUtils;
+import nabble.model.ModelHome;
+import nabble.model.Node;
+import nabble.model.Person;
+import nabble.model.Site;
+import nabble.view.lib.Jtp;
+import nabble.view.lib.TopicView;
+import nabble.view.lib.UrlMappable;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+
+public class Permalink extends HttpServlet implements UrlMappable, CanonicalUrl {
+
+	public static String url(Node topic,Node post) {
+		if( topic==null )
+			topic = post.getTopic();
+		return topic.getSite().getBaseUrl() + path(topic,post);
+	}
+
+	public static String path(Node topic,Node post) {
+		if( topic==null )
+			topic = post.getTopic();
+		StringBuilder buf = new StringBuilder();
+		buf.append( '/' );
+		buf.append( Jtp.subjectEncode(topic.getSubject()) );
+		buf.append( "-tp" );
+		buf.append( topic.getId() );
+		if( post != null && post != topic ) {
+		    buf.append("p");
+	    	buf.append(post.getId());
+		}
+		buf.append( ".html" );
+		return buf.toString();
+	}
+
+	private static final Pattern URL_PATTERN = Pattern.compile("/([^/]*)-tp(\\d+)(p(\\d+))?(ef(\\d+))?\\.html$");
+
+	public String getCanonicalUrl(HttpServletRequest request) {
+		Site site = Jtp.getSite(request);
+		if( site == null )
+			return null;
+		Node topic = site.getNode( Long.parseLong( request.getParameter("root") ) );
+		String postS = request.getParameter("post");
+		Node post = postS==null ? null : site.getNode( Long.parseLong(postS) );
+		return url(topic,post);
+	}
+
+	public Map<String,String[]> getParameterMapFromUrl(HttpServletRequest request,String mappedUrl) {
+		Matcher m = URL_PATTERN.matcher(mappedUrl);
+		if( !m.find() )
+			throw new RuntimeException();
+		Map<String,String[]> params = new HashMap<String,String[]>();
+		String subject = m.group(1);
+		params.put("subject",new String[]{subject});
+		String rootId = m.group(2);
+		params.put("root",new String[]{rootId});
+		String postId = m.group(4);
+		if( postId != null )
+			params.put( "post", new String[]{postId} );
+		return params;
+	}
+
+	public Pattern getUrlPattern() {
+		return URL_PATTERN;
+	}
+
+	protected void service(HttpServletRequest request, HttpServletResponse response)
+		throws ServletException, IOException
+	{
+		String type = ServletUtils.getCookieValue(request,"tview");
+		TopicView topicView = "threaded".equals(type)? TopicView.THREADED
+			: "list".equals(type)? TopicView.LIST : TopicView.CLASSIC;
+
+		long rootId = Long.parseLong( request.getParameter("root") );
+		Site site = Jtp.getSite(request);
+		if (site == null) {
+			response.sendError(HttpServletResponse.SC_NOT_FOUND, "Page Not Found");
+			return;
+		}
+		Node root = site.getNode(rootId);
+		if (root == null) {
+			response.sendError(HttpServletResponse.SC_NOT_FOUND, "Node Not Found");
+			return;
+		}
+		Person visitor = Jtp.getVisitor(request, response);
+
+		String postIdS = request.getParameter("post");
+		Node post = postIdS == null? root : site.getNode(Long.parseLong(postIdS));
+		if (Jtp.canBeViewedBy(root, visitor))
+			sendToTopicPage(root, post, topicView, response);
+		else if (post.getOwner().equals(visitor))
+			response.sendRedirect("/template/NamlServlet.jtp?macro=print_post&node="+post.getId());
+		else
+			sendToTopicPage(root, post, topicView, response);
+	}
+
+	private void sendToTopicPage(Node root, Node post, TopicView topicView, HttpServletResponse response) throws IOException {
+		response.setHeader("Location", Jtp.topicViewPath(root, post.getId(), topicView));
+		response.sendError(HttpServletResponse.SC_MOVED_PERMANENTLY);
+	}
+
+	public static Node getPostFromUrl(String url) {
+		Site site = Jtp.getSiteFromUrl(url);
+		if( site == null )
+			return null;
+		Matcher m = URL_PATTERN.matcher(url);
+		if( !m.find() )
+			return null;
+		String post = m.group(4) == null? m.group(2) : m.group(4);
+		return site.getNode(Long.parseLong(post));
+	}
+
+}