# Jackrabbit



## Michimitsu (13. Jan 2011)

Hallo alle zusammen, 

ich habe folgendes Problem, ich habe eine Datei ins Jackrabbit repository hochgeladen und jetzt möchte ich herausfinden ob ich datei wirklich gespeichert hatte. Also wollte ich ganz einfach die Datei auslesen und woanders hin speichern um das zu überprüfen.


```
Item item = session.getItem("/"+nodeName+"/"+fileName);
byte[] dateiinhalt = item.getPath().getBytes();
```

Da das ganze ein Item ist musste ich das erstmal in ein byte array umwandeln. Wie ist es möglich das byte array jetzt auf meinem Pc als datei zu speichern ?? 

Danke schonmal für die Hilfe


----------



## swp (13. Jan 2011)

Erstmal solltest du statt "/" lieber File.separator nutzen, das ist dann plattformunabhängig.

Abspeichern des Dateiinhalts geht so:


```
try {
  FileOutputStream fos = new FileOutputStream("/Pfad/zur/Datei"); // Stream aufmachen
  fos.write(dateiinhalt); // Bytearray in Schreibpuffer schreiben
  fos.flush(); // Puffer in Datei übertragen und leeren
  fos.close(); // Datei schließen
} catch(FileNotFoundException e) {
  // Handlen, wenn die Datei nicht angelegt werden kann
} catch(IOException e) {
  // Handlen, wenn anderweitige I/O-Fehler auftreten
}
```


----------



## Michimitsu (13. Jan 2011)

Also funktionieren tut es schonmal ... nur das die datei nicht gespeichert wird sondern der Pfad aus dem Repository  

Hast du da auch vielleicht noch eine Idee wie ich das da reinbekomme ?? 


```
Item item = session.getItem("/"+nodeName+"/"+fileName);
byte[] dateiinhalt = item.getPath().getBytes();
```

So scheint es ja nicht zu gehen. Ich hab eine Item und müsste das irgendwie vernünftig umformen.


----------



## swp (13. Jan 2011)

Das "item.getPath()" scheint auch den Pfad zurückzugeben und nicht den Inhalt. Gibt es irgendeine Methode, um an den Inhalt des Items zu kommen?


----------



## Michimitsu (13. Jan 2011)

unter item nicht wirklich ... aber es gibt unter session sowas


```
session.exportSystemView(absPath, contentHandler, skipBinary, noRecurse);
session.exportDocumentView(absPath, contentHandler, skipBinary, noRecurse);
```


----------



## swp (13. Jan 2011)

Dann musst du diesen Inhalt mit den entsprechenden Methoden in ein Byte-Array konvertieren und dann wie oben abspeichern. Wie das genau aufgebaut ist, weiß ich bei Jackrabbit nicht - du musst jedenfalls den Inhalt der Datei als Byte-Array bekommen.


----------



## Wildcard (13. Jan 2011)

Du hast den Inhalt der Datei vermutlich in ein binäres Property gespeichert.
Normalerweise nimmt man eine nt:resource um Dateien abzulegen. Wenn du eine solche verwendet hast gibt es ein binäres Property jcr:data. Du lässt dir dieses Property geben und liest anschließend den InputStream aus.
Einfacher hättest du es allerdings wenn du einen DataStorage in deinem Repository konfigurierst, dann landet die Datei nämlich nicht als BLOB in der DB, sondern wird als echte Datei (mit dem Hashwert als Name) ins Dateisystem geschrieben.


----------



## Michimitsu (14. Jan 2011)

```
Session session = createJackrabbitSession();

		String mimeType = new MimetypesFileTypeMap().getContentType(file);
		if (mimeType == null)
			mimeType = "application/octet-stream";

		Node fileNode = session.getRootNode().getNode(nodeName).addNode(fileName, "nt:file");


		Node resNode = fileNode.addNode("jcr:content", "nt:resource");
		resNode.addMixin("mix:versionable"); //set node mixin type  
		//resNode.setProperty("jcr:versionLabels", file.getName());
		resNode.setProperty("jcr:mimeType", mimeType);
		resNode.setProperty("jcr:encoding", "");
		resNode.setProperty("jcr:data", new FileInputStream(file));
		Calendar lastModified = Calendar.getInstance();
		//        lastModified.setTimeInMillis(file.lastModified());
		resNode.setProperty("jcr:lastModified", lastModified);


		session.save();
```

Hier ist der QuellCode fürs Abspeichern vllt. entdeckt ihr da schon eine unkluge strategie ... ich bin offen für andere Methoden um die Daten hochzuladen.


----------



## Wildcard (14. Jan 2011)

Das passt schon so. Und genau so musst du deine Datei nun auch wieder rausholen, über das jcr:data Property.


> byte[] dateiinhalt = item.getPath().getBytes();


Wie du darauf gekommen sein magst ist mir schleierhaft...


----------



## Michimitsu (24. Jan 2011)

Ich verstehe nicht ganz was du meinst .. kannst du mir das vielleicht deuttlichr erklären.
Und meine Inforamtionen beziehe ich aus google.


----------



## FArt (24. Jan 2011)

Michimitsu hat gesagt.:


> Ich verstehe nicht ganz was du meinst .. kannst du mir das vielleicht deuttlichr erklären.
> Und meine Inforamtionen beziehe ich aus google.



Nur der zweitbeste Ansatz. Zuerst solltest du deine Infos aus der Doku, dem Wiki und dem passenden Apache Forum beziehen. 
Ein Tutorial wäre auch nicht schlecht (tutorial jackrabbit - Google-Suche).


----------



## Michimitsu (24. Jan 2011)

ja, meist kommt man über google auch auf solche seiten. Ich meine es funktioniert ja auch mein Problem ist ich möchte nochmal sehen das es funktioniert, quasi eine datei rausholen und die woandes hinspeichern.


----------



## Wildcard (24. Jan 2011)

Ich verstehe wirklich nicht was daran so unverständlich sein soll. Es funktioniert genau so wie das Schreiben

```
Property binaryProperty = resNode.getProperty("jcr:data");
InputStream in = binaryProperty().getBinary().getStream();
```


----------



## Michimitsu (31. Jan 2011)

```
Property binaryProperty = resNode.getProperty("jcr:data");
		InputStream in = binaryProperty.getBinary().getStream();
		OutputStream out = new FileOutputStream("C:/Users/Admin/newNodeFile.txt");

		try {
			int sharedData = in.read(zwischenSpeicher);

			

			out.write(sharedData);

			return true;
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
```

so gibt er mir irgendwie einen fehler aus, wobei es vorhin noch ansatzweise ging ... hatte aber immer nur den ersten buchstaben der textdatei wiederholt ins neue document gespeichert


----------



## FArt (31. Jan 2011)

Michimitsu hat gesagt.:


> so gibt er mir irgendwie einen fehler aus


Dann wird das wohl irgendwie aus irgendeinem Grund so nicht funktionieren. Vielleicht hast du ja irgendwo mehr Infos... einen Stacktrace zum Beispiel...


----------



## Gelöschtes Mitglied 5909 (31. Jan 2011)

da du nir einen in/char aus dem stream liest und wieder schreibst ist es klar dass er nur einen buchstaben schreibt.


```
private static void copy(InputStream in, OutputStream out) throws IOException {
 byte[] b = new byte[1024];
 int read;
 while ((read = in.read(b)) != -1) {
  out.write(b, 0, read);
 }
}
```

und welchen fehler? *aus der nase zieh*


----------



## Michimitsu (31. Jan 2011)

```
Exception occurred during event dispatching:
java.lang.NullPointerException
	at java.io.InputStream.read(InputStream.java:85)
	at de.docimport.jackrabbit.JackrabbitConnector.uploadFile(JackrabbitConnector.java:182)
```

und damit verweist er auf die zeile ...


```
int sharedData = in.read(zwischenSpeicher);
```


----------



## Gelöschtes Mitglied 5909 (31. Jan 2011)

tja dann ist "zwischenSpeicher" wohl null


----------



## Michimitsu (31. Jan 2011)

Ich sag einfach mal ein dickes danke an rail ich hab deine methode verwendet und jetzt funktioniert das alles super ... jetzt bin ich mir auch sicher das die datein wirklich ins repository geladen werden  Vielen Dank.


----------



## Michimitsu (31. Jan 2011)

wüsstest du auch zufällig wie das für bilder geht ?? also ein bild ins repo laden und das dann wieder runterspeichern


----------



## Gelöschtes Mitglied 5909 (31. Jan 2011)

Auch wenn ich mich mit Jackrabbit nicht auskenne, würde ich sagen genauso wie dus bisher gemacht hast nur mit dem entsprechendem mimetype (z.B. image/jpeg).


----------



## Wildcard (31. Jan 2011)

raiL hat gesagt.:


> Auch wenn ich mich mit Jackrabbit nicht auskenne, würde ich sagen genauso wie dus bisher gemacht hast nur mit dem entsprechendem mimetype (z.B. image/jpeg).



Exakt. Genau das gleiche mit anderem Mimetype.


----------



## Michimitsu (1. Feb 2011)

ich brauchte sogar nichtmal den mimetyp ändern, habs nur in eine bmp statt der txt gespeichert


----------



## Wildcard (1. Feb 2011)

Michimitsu hat gesagt.:


> ich brauchte sogar nichtmal den mimetyp ändern, habs nur in eine bmp statt der txt gespeichert



Brauchst du nicht, solltest du aber, sonst weißt du später evtl. nicht mehr das es sich um ein Bild handelte. Ausserdem ist es für die Indexierung besser, da Jackrabbit sonst nicht den richtigen Text Extractor auf die Datei loslassen kann.


----------



## Michimitsu (1. Feb 2011)

Ich denke mal ich muss nicht dafür sorgen weil er sich den passneden mimetyp selber raussucht.


```
String mimeType = new MimetypesFileTypeMap().getContentType(file);
        if (mimeType == null)
            mimeType = "application/octet-stream";
```


----------



## Wildcard (1. Feb 2011)

Diese Map basiert aber nur auf Dateiendungen, wird also nicht immer funktionieren.


----------



## Michimitsu (2. Feb 2011)

Auf der ersten Seite beitrag 8 siehst du mein kompletten code dazu, wie bzw. wo könnt ich das denn da ändern ??

und noch eine frage zu dieser Zeile hier : 


```
resNode.setProperty("jcr:data", new FileInputStream(file));
```
dort sagt er mir is depreacated, er sagt aber nicht wie das jetzt gemacht wird, weißt du ne lösung oder soll ich das deprecated einfach lassen


----------



## Michimitsu (2. Feb 2011)

Mir fällt grade auf der ich den Benutzter sowieso bei der Dateiauswahl eingeschränkt habe, er darf sich nämlich nur zwischen (txt,pdf,doc,Jpg,gif,tif,png und bmp) entscheiden darf...  könnte es trotzdem zu problemen kommen ?


----------



## Wildcard (2. Feb 2011)

> dort sagt er mir is depreacated, er sagt aber nicht wie das jetzt gemacht wird, weißt du ne lösung oder soll ich das deprecated einfach lassen


Steht in der API Doc der Methode.


> Mir fällt grade auf der ich den Benutzter sowieso bei der Dateiauswahl eingeschränkt habe, er darf sich nämlich nur zwischen (txt,pdf,doc,Jpg,gif,tif,png und bmp) entscheiden darf... könnte es trotzdem zu problemen kommen ?


Niemand hindert den Nutzer daran ein PDF *.doc oder *.foobar zu nennen. Musst du entscheiden ob das für dich ein Problem ist, oder nicht.


----------



## Michimitsu (3. Feb 2011)

nun ja wenn der Benutzter ein txt datei von anfang an als jpg angibt dann lädt er natürlich eine fehlerhafte datei hoch ... aber ich glaube das ist nicht so schlimm


----------

