Hallo,
normalerweise konnte mir das Internet bisher immer ausreichend helfen, doch diesmal finde ich nichts was mein Problem löst.
Kurz gefasst, ich brauch für eine Java Web Anwendung ein Dateianhänge Modul mit Versionierung. Habe mich mal für den SVN Server und als API das SVNKit entschieden. Seit gestern spiele ich ein wenig mit dem SVNKit rum und finde das bisher echt prima. Aaaaaaaaber wenn ich Dateien mit 5, 10 oder mehr MB über meine Testfunktionen einchecke ist das tierisch langsam. Eine 10 MB Datei dauert locker 8 Min !!! Das ist nicht akzeptabel.
Tja, was mach ich nun falsch? Ich gehe wirklich nach denen Anleitung des SVNKits vor und finde auch sonst keine anderen Lösungansätze. Das einzige wäre, wenn die Datei lokal auf dem Datenträger liegt, dann gibts noch weitere APIs. Aber ich möchte mit Stremas arbeiten.
Schaut doch mal drüber. In der Funktion addAttachment bleibt er genau beim Aufruf von sendDelta Minuten lang stehen, bzw. der Java Prozess ist emsig am Arbeiten, laut Task-Manager.
Ach ja, wenn ich mit Subclipse (baut auf SVNKit auf !) oder mit TortoiseSVN arbeite geht das Einchecken der großen Datein ruck zuck in Sekundenbereichen.
Vielen Dank schon mal für eure Hilfe.
Gruß
Tschokko
normalerweise konnte mir das Internet bisher immer ausreichend helfen, doch diesmal finde ich nichts was mein Problem löst.
Kurz gefasst, ich brauch für eine Java Web Anwendung ein Dateianhänge Modul mit Versionierung. Habe mich mal für den SVN Server und als API das SVNKit entschieden. Seit gestern spiele ich ein wenig mit dem SVNKit rum und finde das bisher echt prima. Aaaaaaaaber wenn ich Dateien mit 5, 10 oder mehr MB über meine Testfunktionen einchecke ist das tierisch langsam. Eine 10 MB Datei dauert locker 8 Min !!! Das ist nicht akzeptabel.
Tja, was mach ich nun falsch? Ich gehe wirklich nach denen Anleitung des SVNKits vor und finde auch sonst keine anderen Lösungansätze. Das einzige wäre, wenn die Datei lokal auf dem Datenträger liegt, dann gibts noch weitere APIs. Aber ich möchte mit Stremas arbeiten.
Schaut doch mal drüber. In der Funktion addAttachment bleibt er genau beim Aufruf von sendDelta Minuten lang stehen, bzw. der Java Prozess ist emsig am Arbeiten, laut Task-Manager.
Code:
package test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.tmatesoft.svn.core.SVNDirEntry;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNNodeKind;
import org.tmatesoft.svn.core.SVNProperty;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory;
import org.tmatesoft.svn.core.internal.wc.SVNFileUtil;
import org.tmatesoft.svn.core.io.ISVNEditor;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import org.tmatesoft.svn.core.io.diff.SVNDeltaGenerator;
import org.tmatesoft.svn.core.io.diff.SVNDiffWindow;
public class Main {
public Main() {
setupAttachmentsModule();
}
private void setupAttachmentsModule() {
DAVRepositoryFactory.setup();
FSRepositoryFactory.setup();
}
private SVNRepository connectToRepository(String host, String repositoryName) throws SVNException {
SVNURL url = SVNURL.parseURIEncoded("file://" + host + "/" + repositoryName);
SVNRepository repository = SVNRepositoryFactory.create(url);
return repository;
}
private void createBaseDirectory(SVNRepository repository, Long id) throws SVNException {
ISVNEditor editor = repository.getCommitEditor("Added new base directory for project '" + id + "'" , null);
editor.openRoot(-1);
editor.addDir(id.toString(), null, -1);
editor.closeDir(); // Close new base directory
editor.closeDir(); // Close root directory
editor.closeEdit();
}
private void addAttachment(SVNRepository repository, Long id, String fileName, byte[] fileData) throws SVNException {
ISVNEditor editor = repository.getCommitEditor("Added new base directory for project '" + id + "'" , null, true, null);
editor.openRoot(-1);
editor.openDir(id.toString(), -1);
String filePath = id.toString() + "/" + fileName;
editor.addFile(filePath, null, -1);
editor.changeFileProperty(filePath, "dlvvvs:display-version", "1.5");
editor.applyTextDelta(filePath, null);
SVNDeltaGenerator deltaGenerator = new SVNDeltaGenerator();
String checksum = deltaGenerator.sendDelta(filePath, new ByteArrayInputStream(fileData), editor, true);
editor.closeFile(filePath, checksum);
editor.closeDir(); // Close new base directory
editor.closeDir(); // Close root directory
editor.closeEdit();
}
private void addAttachment(SVNRepository repository, Long id, String fileName, InputStream fileStream) throws SVNException {
ISVNEditor editor = repository.getCommitEditor("Added new base directory for project '" + id + "'" , null, true, null);
editor.openRoot(-1);
editor.openDir(id.toString(), -1);
String filePath = id.toString() + "/" + fileName;
editor.addFile(filePath, null, -1);
editor.changeFileProperty(filePath, "dlvvvs:display-version", "1.5");
editor.changeFileProperty(filePath, SVNProperty.MIME_TYPE, SVNFileUtil.BINARY_MIME_TYPE);
editor.applyTextDelta(filePath, null);
SVNDeltaGenerator deltaGenerator = new SVNDeltaGenerator();
String checksum = deltaGenerator.sendDelta(filePath, fileStream, editor, true);
editor.closeFile(filePath, checksum);
editor.closeDir(); // Close new base directory
editor.closeDir(); // Close root directory
editor.closeEdit();
}
private void updateAttachment(SVNRepository repository, Long id, String fileName, byte[] fileData, boolean incrementMajorVersion) throws SVNException {
String filePath = id.toString() + "/" + fileName;
// Get old file content
Map properties = new HashMap();
ByteArrayOutputStream oldFileData = new ByteArrayOutputStream();
repository.getFile(filePath, -1, properties, oldFileData);
ISVNEditor editor = repository.getCommitEditor("Added new base directory for project '" + id + "'" , null);
editor.openRoot(-1);
editor.openDir(id.toString(), -1);
editor.openFile(filePath, -1);
editor.applyTextDelta(filePath , null);
SVNDeltaGenerator deltaGenerator = new SVNDeltaGenerator();
String checksum = deltaGenerator.sendDelta(filePath, new ByteArrayInputStream(oldFileData.toByteArray()), 0 , new ByteArrayInputStream(fileData), editor, true);
String displayVersion = (String)properties.get("dlvvvs:display-version");
if (displayVersion == null || displayVersion.trim().equals("") == true)
displayVersion = "1.0";
String displayVersionInfo[] = displayVersion.split("\\.");
int majorVersion = 1, minorVersion = 0;
if (displayVersionInfo.length >= 1)
majorVersion = Integer.parseInt(displayVersionInfo[0]);
if (displayVersionInfo.length >= 2)
minorVersion = Integer.parseInt(displayVersionInfo[1]);
// increment display-version
if (incrementMajorVersion) {
majorVersion++;
minorVersion = 0;
}
else
minorVersion++;
displayVersion = new Integer(majorVersion).toString() + "." + new Integer(minorVersion).toString();
editor.changeFileProperty(filePath, "dlvvvs:display-version", displayVersion);
editor.closeFile(filePath, checksum);
editor.closeDir(); // Close new base directory
editor.closeDir(); // Close root directory
editor.closeEdit();
}
private List<String> getAttachmentList(SVNRepository repository, Long id) throws SVNException {
List<String> attachments = new ArrayList<String>();
SVNNodeKind nodeKind = repository.checkPath(id.toString(), -1);
if (nodeKind == SVNNodeKind.DIR) {
Map properties = new HashMap();
Collection entries = repository.getDir(id.toString(), -1 , null, (Collection) null);
//System.out.println(properties.toString());
Iterator iterator = entries.iterator( );
while (iterator.hasNext()) {
SVNDirEntry entry = (SVNDirEntry) iterator.next();
System.out.println( entry.getName() + " (author: '" + entry.getAuthor() + "'; revision: " + entry.getRevision() + "; date: " + entry.getDate() + ")");
if (entry.getKind() == SVNNodeKind.FILE) {
repository.getFile(id.toString() + "/" + entry.getRelativePath(), -1, properties, null);
System.out.println(properties.toString());
attachments.add(entry.getName());
}
}
}
return attachments;
}
public static void main(String[] args) {
byte[] contents = "This is the new text3 file.".getBytes();
Long agreementId = new Long(20091978);
try {
Main app = new Main();
SVNRepository repository = app.connectToRepository("/C:/AttachmentsArchive", "repo");
//app.createBaseDirectory(repository, agreementId);
/*FileInputStream fis = new FileInputStream("C:/Temp/blackbox_3.jpg");
FileChannel fc = fis.getChannel();
byte[] data = new byte[(int)fc.size()];
ByteBuffer bb = ByteBuffer.wrap(data);
fc.read(bb);*/
FileInputStream newFile = new FileInputStream("C:/Temp/819-4284-10.pdf");
app.addAttachment(repository, agreementId, "test9.txt", newFile);
//app.updateAttachment(repository, agreementId, "test1.txt", newFile, true);
List<String> attachments = app.getAttachmentList(repository, agreementId);
attachments.size();
}
catch (SVNException e) {
e.printStackTrace();
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
Ach ja, wenn ich mit Subclipse (baut auf SVNKit auf !) oder mit TortoiseSVN arbeite geht das Einchecken der großen Datein ruck zuck in Sekundenbereichen.
Vielen Dank schon mal für eure Hilfe.
Gruß
Tschokko