summaryrefslogtreecommitdiffstats
path: root/org/madore/damlengine
diff options
context:
space:
mode:
Diffstat (limited to 'org/madore/damlengine')
-rw-r--r--org/madore/damlengine/WeblogServlet.java64
1 files changed, 60 insertions, 4 deletions
diff --git a/org/madore/damlengine/WeblogServlet.java b/org/madore/damlengine/WeblogServlet.java
index 648c12f..444d1ed 100644
--- a/org/madore/damlengine/WeblogServlet.java
+++ b/org/madore/damlengine/WeblogServlet.java
@@ -34,7 +34,7 @@ import javax.servlet.http.HttpServletResponse;
public class WeblogServlet extends HttpServlet {
- private static final long serialVersionUID = 2014101001L;
+ private static final long serialVersionUID = 2014101004L;
@Override
public void init(ServletConfig cfg)
@@ -60,7 +60,7 @@ public class WeblogServlet extends HttpServlet {
}
static abstract class RequestPath {
- public static RequestPath parsePath(String pathInfo)
+ public static RequestPath parsePath(String pathInfo, boolean inGet)
throws ServletException {
Matcher matcher;
if ( pathInfo == null )
@@ -110,6 +110,31 @@ public class WeblogServlet extends HttpServlet {
throw new ServletException(e);
}
}
+ if ( inGet && (matcher=Pattern.compile("/d\\.(\\d{4}-\\d{2}-\\d{2})\\.([\\p{Alpha}][\\p{Alnum}\\-]*)\\.html").matcher(pathInfo)).matches() ) {
+ final String date;
+ final String extra;
+ try {
+ date = matcher.group(1);
+ extra = matcher.group(2);
+ } catch (NumberFormatException e) {
+ return new NoSuchPath();
+ }
+ try {
+ final Connection conn = WeblogDatabaseConnection.getConnection();
+ final PreparedStatement selSt
+ = conn.prepareStatement("SELECT id FROM entries WHERE edate=? AND do_single_page=?");
+ selSt.setString(1,date);
+ selSt.setString(2,extra);
+ final ResultSet selRes = selSt.executeQuery();
+ if ( selRes.next() ) {
+ int id = selRes.getInt(1);
+ return new SingleBlogEntryRedirectPath(date, id, extra);
+ } else
+ return new NoSuchPath();
+ } catch (SQLException e) {
+ throw new ServletException(e);
+ }
+ }
return new NoSuchPath();
}
}
@@ -125,16 +150,47 @@ public class WeblogServlet extends HttpServlet {
}
}
+ static final class SingleBlogEntryRedirectPath extends RequestPath {
+ public String date;
+ public int number;
+ public String extra;
+ public SingleBlogEntryRedirectPath(String date, int number, String extra) {
+ this.date = date;
+ this.number = number;
+ this.extra = extra;
+ }
+ }
+
@Override
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
- final RequestPath rp = RequestPath.parsePath(request.getPathInfo());
+ final RequestPath rp = RequestPath.parsePath(request.getPathInfo(), true);
if ( rp instanceof NoSuchPath ) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
+ if ( rp instanceof SingleBlogEntryRedirectPath ) {
+ SingleBlogEntryRedirectPath rrp = (SingleBlogEntryRedirectPath)rp;
+ Matcher matcher = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})").matcher(rrp.date);
+ if ( ! matcher.matches() )
+ throw new AssertionError("bad date format");
+ WeblogLink lk = new WeblogLink(matcher.group(1), matcher.group(2),
+ matcher.group(3),
+ String.format("%04d", rrp.number),
+ "", rrp.extra);
+ lk.setTypeStandard();
+ String basePath = request.getScheme() + "://"
+ + request.getServerName()
+ + ":" + request.getServerPort()
+ + request.getContextPath()
+ + "/";
+ // response.sendRedirect(lk.getFile(basePath));
+ response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
+ response.setHeader("Location", lk.getFile(basePath));
+ return;
+ }
if ( ! (rp instanceof SingleBlogEntryPath) )
throw new ServletException("this cannot happen");
final int number = ((SingleBlogEntryPath)rp).number;
@@ -155,7 +211,7 @@ public class WeblogServlet extends HttpServlet {
public long getLastModified(HttpServletRequest request) {
final RequestPath rp;
try {
- rp = RequestPath.parsePath(request.getPathInfo());
+ rp = RequestPath.parsePath(request.getPathInfo(), false);
} catch (Exception e) {
return -1;
}