]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/ajaxplorer/svn/SvnLogAction.java
Introduce Ajaxplorer support in SLC
[gpl/argeo-slc.git] / runtime / org.argeo.slc.server / src / main / java / org / argeo / slc / web / ajaxplorer / svn / SvnLogAction.java
diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/ajaxplorer/svn/SvnLogAction.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/ajaxplorer/svn/SvnLogAction.java
new file mode 100644 (file)
index 0000000..77b9af0
--- /dev/null
@@ -0,0 +1,112 @@
+package org.argeo.slc.web.ajaxplorer.svn;\r
+\r
+import java.io.File;\r
+import java.io.PrintWriter;\r
+import java.text.SimpleDateFormat;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Vector;\r
+\r
+import javax.servlet.http.HttpServletRequest;\r
+import javax.servlet.http.HttpServletResponse;\r
+\r
+import org.apache.commons.io.IOUtils;\r
+import org.apache.commons.logging.Log;\r
+import org.apache.commons.logging.LogFactory;\r
+import org.argeo.slc.web.ajaxplorer.AjxpAction;\r
+import org.argeo.slc.web.ajaxplorer.AjxpAnswer;\r
+import org.argeo.slc.web.ajaxplorer.AjxpDriverException;\r
+import org.tmatesoft.svn.core.ISVNLogEntryHandler;\r
+import org.tmatesoft.svn.core.SVNException;\r
+import org.tmatesoft.svn.core.SVNLogEntry;\r
+import org.tmatesoft.svn.core.SVNLogEntryPath;\r
+import org.tmatesoft.svn.core.wc.SVNRevision;\r
+\r
+public class SvnLogAction implements AjxpAction<SvnDriver> {\r
+       private final SimpleDateFormat sdfIso = new SimpleDateFormat(\r
+                       "yyyy-MM-dd HH:mm:ss");\r
+       private final Log log = LogFactory.getLog(getClass());\r
+\r
+       public AjxpAnswer execute(SvnDriver driver, HttpServletRequest request) {\r
+               String fileStr = request.getParameter("file");\r
+               log.debug("Log file " + fileStr);\r
+               if (fileStr == null) {\r
+                       throw new AjxpDriverException("A  file needs to be provided.");\r
+               }\r
+               File file = new File(driver.getBasePath() + fileStr);\r
+               return new SvnLogAnswer(driver, file);\r
+       }\r
+\r
+       protected class SvnLogAnswer implements AjxpAnswer {\r
+               private final SvnDriver driver;\r
+               private final File file;\r
+\r
+               public SvnLogAnswer(SvnDriver driver, File file) {\r
+                       this.driver = driver;\r
+                       this.file = file;\r
+               }\r
+\r
+               public void updateResponse(HttpServletResponse response) {\r
+                       PrintWriter writer = null;\r
+                       try {\r
+                               writer = response.getWriter();\r
+                               writer.append("<tree>");\r
+                               writer.append("<log>");\r
+\r
+                               final List<SVNLogEntry> logEntries = new Vector<SVNLogEntry>();\r
+                               ISVNLogEntryHandler logHandler = new ISVNLogEntryHandler() {\r
+                                       public void handleLogEntry(SVNLogEntry logEntry)\r
+                                                       throws SVNException {\r
+                                               logEntries.add(logEntry);\r
+                                       }\r
+                               };\r
+\r
+                               driver.getManager().getLogClient().doLog(new File[] { file },\r
+                                               SVNRevision.create(0), SVNRevision.HEAD, true, true,\r
+                                               100, logHandler);\r
+\r
+                               for (int i = logEntries.size() - 1; i >= 0; i--) {\r
+                                       String xml = logEntryAsXml(logEntries.get(i), file);\r
+                                       if(log.isTraceEnabled())\r
+                                               log.trace(xml);\r
+                                       writer.append(xml);\r
+                               }\r
+\r
+                               writer.append("</log>");\r
+                               writer.append("</tree>");\r
+                       } catch (Exception e) {\r
+                               throw new AjxpDriverException(\r
+                                               "Cannot retrieve log for " + file, e);\r
+                       } finally {\r
+                               IOUtils.closeQuietly(writer);\r
+                       }\r
+               }\r
+\r
+       }\r
+\r
+       protected String logEntryAsXml(SVNLogEntry entry, File file) {\r
+               StringBuffer buf = new StringBuffer();\r
+               buf.append("<logentry");\r
+               buf.append(" revision=\"").append(entry.getRevision()).append("\"");\r
+               buf.append(" is_file=\"").append(file.isDirectory() ? "0" : "1")\r
+                               .append("\"");\r
+               buf.append(">");\r
+\r
+               buf.append("<author>").append(entry.getAuthor()).append("</author>");\r
+               buf.append("<date>").append(sdfIso.format(entry.getDate())).append(\r
+                               "</date>");\r
+\r
+               buf.append("<paths>");\r
+               Map<Object, SVNLogEntryPath> paths = entry.getChangedPaths();\r
+               for (SVNLogEntryPath path : paths.values()) {\r
+                       buf.append("<path>").append(path.getPath()).append("</path>");\r
+               }\r
+               buf.append("</paths>");\r
+\r
+               buf.append("<msg>").append(entry.getMessage()).append("</msg>");\r
+\r
+               buf.append("</logentry>");\r
+               return buf.toString();\r
+       }\r
+\r
+}\r