Subversion file download + subversion (svn)

Hi Tom,
wir haben uns nun eine andere Lösung einfallen lassen.
Der Download wird über den Commandline Befehl "svn cat" durchgeführt und somit kann der STDOUT leicht gebuffert werden und an den User weitergeleitet werden. Für Uploads -muss- eine Working Copy vorhanden sein, welche wir somit auch führen werden (temporär).

Gute Nacht
- Manuel
 
Leider konnte ich mich gestern Abend nicht mehr an den rechner setzen...
Ich denke immernoch, dass das auch anders moeglich ist. Werde mich am WE mal damit beschaeftigen.

Gruss Tom
 
Hallo!

Code:
package de.tutorials.web.svn.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.tigris.subversion.javahl.ClientException;
import org.tigris.subversion.javahl.Revision;
import org.tigris.subversion.javahl.SVNClient;
import org.tigris.subversion.javahl.SVNClientInterface;

/**
 * Servlet implementation class for Servlet: SVNDownloadServlet
 * 
 * @web.servlet name="SVNDownloadServlet" display-name="SVNDownloadServlet"
 * 
 * @web.servlet-mapping url-pattern="/SVNDownloadServlet"
 * 
 */
public class SVNDownloadServlet extends javax.servlet.http.HttpServlet
        implements javax.servlet.Servlet {

    /*
     * (non-Java-doc)
     * 
     * @see javax.servlet.http.HttpServlet#HttpServlet()
     */
    public SVNDownloadServlet() {
        super();
    }

    /*
     * (non-Java-doc)
     * 
     * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request,
     *      HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition",
                "attachment; filename=eclipse.dat;");

        SVNClientInterface svnClient = null;
        try {
            svnClient = new SVNClient();
            svnClient.username("tom");
            svnClient.password("tom");
            svnClient.streamFileContent(
                    "svn://localhost/de.tutorials.web.svn/eclipse.zip",
                    Revision.getInstance(14L), Revision.getInstance(14L),
                    16384, response.getOutputStream());
        } catch (ClientException e) {
            e.printStackTrace();
        } finally {
            if (svnClient != null) {
                svnClient.dispose();
            }
        }
    }
}

Funktioniert bei mir ohne Probleme ;) Im Browser kommt ein "Datei speichern unter" Dialog hoch.
Ich denke das ist etwas bequemer als den OUTPUT auf der Konsole zu verarbeiten...

Gruss Tom
 
Hi Tom,
bin schon zuhause, aber ich weis das haben wir schon versucht und mit großen Files entstehen dadurch Probleme. Nicht das mich mcih evtl die ganze Zeit falsch verstanden hast, aber mit normalen kleinen txt Files hab ich schon dutzende Varianten zum laufen gebracht. Das Problem ist wenn ich Dateien mit 300 MB oder mehr herunterladen will. Versuch es mal bei dir, wirst sehen das du einen "Java heap space" bekommst.

Gruß
- Manuel
 
Hallo!

1) Okay das habe ich noch nicht evrsucht... meine groessten Dateien waren 30 MB.
2) Was haben so grosse binaere Dateien in einem Repository zu suchen?! Das ist in meinen Augen Bloedsinn... die sollte man woanders (ausserhalb des Repositories) ablegen.

Edit:
Das Problem scheint ein Memory leak in einer der javahl DLLs zu sein. Bei mir bleibt der Speicherverbrauch im taskmanager bei 17-18 MB (Tomcat Prozess). Schaue ich hingegen unter dem reiter Performance auf den Status der Auslagerungsdatei, so waechst diese alle 30 Sekunden um 15 MB... habs mal mit einem 300 MB grossen Zip File ausprobiert. Scheinbar wird dort der byte[] Puffer nicht mehr freigegeben...
Im javasvn.jar im subclipse Plugin findet man noch SVNWCClient dieser bietet auch eine Methode doGetFileContents(....) an welche keine Probleme mit grossen Dateien hat. Allerdings wird dazu auf dem Server eine temporaere Datei erstellt welche dann zum Client gestreamt und danach geloescht wird.

Gruss Tom
 
Hi Tom,
*** Fehler gefunden ***

Wir haben nun, schon vor einigen Tagen herausgefunden woran es liegt.
Erstmal möchte ich euch versichern das die svn-javahl (streamFileContent) perfekt funktioniert, nicht das sich noch jemand Sorgen macht ;)

Das Problem lag daran, das wir mit der JSF - MyFaces Implementation arbeiten und diese stets den Fehler verursacht hat. Entschuldigung das ich dies nicht erwähnt habe, aber wir haben ja selbst nie daran gedacht :P

Muss schon sagen, es ist wirklich schade das es an MyFaces liegt, aber die Implementierung ist einfach noch sehr "jung".

Vielen Dank für die Unterstützung.

Gruß
- Manuel
 
Zurück