X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=runtime%2Forg.argeo.slc.server%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fweb%2Fajaxplorer%2Fsvn%2FSvnLogAction.java;fp=runtime%2Forg.argeo.slc.server%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fweb%2Fajaxplorer%2Fsvn%2FSvnLogAction.java;h=77b9af04c5bfdc5c619a7c4a49e12df750d65ebd;hb=210a203d89ea2e9d60081f7181a5c99181a099bc;hp=0000000000000000000000000000000000000000;hpb=8a1bf4587a82518f702a10c3d2f1422f30d74166;p=gpl%2Fargeo-slc.git 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 index 000000000..77b9af04c --- /dev/null +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/ajaxplorer/svn/SvnLogAction.java @@ -0,0 +1,112 @@ +package org.argeo.slc.web.ajaxplorer.svn; + +import java.io.File; +import java.io.PrintWriter; +import java.text.SimpleDateFormat; +import java.util.List; +import java.util.Map; +import java.util.Vector; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.slc.web.ajaxplorer.AjxpAction; +import org.argeo.slc.web.ajaxplorer.AjxpAnswer; +import org.argeo.slc.web.ajaxplorer.AjxpDriverException; +import org.tmatesoft.svn.core.ISVNLogEntryHandler; +import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.SVNLogEntry; +import org.tmatesoft.svn.core.SVNLogEntryPath; +import org.tmatesoft.svn.core.wc.SVNRevision; + +public class SvnLogAction implements AjxpAction { + private final SimpleDateFormat sdfIso = new SimpleDateFormat( + "yyyy-MM-dd HH:mm:ss"); + private final Log log = LogFactory.getLog(getClass()); + + public AjxpAnswer execute(SvnDriver driver, HttpServletRequest request) { + String fileStr = request.getParameter("file"); + log.debug("Log file " + fileStr); + if (fileStr == null) { + throw new AjxpDriverException("A file needs to be provided."); + } + File file = new File(driver.getBasePath() + fileStr); + return new SvnLogAnswer(driver, file); + } + + protected class SvnLogAnswer implements AjxpAnswer { + private final SvnDriver driver; + private final File file; + + public SvnLogAnswer(SvnDriver driver, File file) { + this.driver = driver; + this.file = file; + } + + public void updateResponse(HttpServletResponse response) { + PrintWriter writer = null; + try { + writer = response.getWriter(); + writer.append(""); + writer.append(""); + + final List logEntries = new Vector(); + ISVNLogEntryHandler logHandler = new ISVNLogEntryHandler() { + public void handleLogEntry(SVNLogEntry logEntry) + throws SVNException { + logEntries.add(logEntry); + } + }; + + driver.getManager().getLogClient().doLog(new File[] { file }, + SVNRevision.create(0), SVNRevision.HEAD, true, true, + 100, logHandler); + + for (int i = logEntries.size() - 1; i >= 0; i--) { + String xml = logEntryAsXml(logEntries.get(i), file); + if(log.isTraceEnabled()) + log.trace(xml); + writer.append(xml); + } + + writer.append(""); + writer.append(""); + } catch (Exception e) { + throw new AjxpDriverException( + "Cannot retrieve log for " + file, e); + } finally { + IOUtils.closeQuietly(writer); + } + } + + } + + protected String logEntryAsXml(SVNLogEntry entry, File file) { + StringBuffer buf = new StringBuffer(); + buf.append(""); + + buf.append("").append(entry.getAuthor()).append(""); + buf.append("").append(sdfIso.format(entry.getDate())).append( + ""); + + buf.append(""); + Map paths = entry.getChangedPaths(); + for (SVNLogEntryPath path : paths.values()) { + buf.append("").append(path.getPath()).append(""); + } + buf.append(""); + + buf.append("").append(entry.getMessage()).append(""); + + buf.append(""); + return buf.toString(); + } + +}