From 0eca5eda3b899ddeb7e4715ea4e89c5553b79b64 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Thu, 30 Aug 2012 08:45:29 +0200
Subject: [PATCH] OO-336: add a unit test for the PDF extractor to the
 extraction itself and the caching mechanism

---
 .../service/document/file/PdfDocument.java    |  11 +-
 .../document/file/PDFDocumentTest.java        |  75 ++++++++++
 .../document/file/Test_pdf_indexing.pdf       | Bin 0 -> 9016 bytes
 .../java/org/olat/test/AllTestsJunit4.java    |   1 +
 .../java/org/olat/test/VFSJavaIOFile.java     | 140 ++++++++++++++++++
 5 files changed, 225 insertions(+), 2 deletions(-)
 create mode 100644 src/test/java/org/olat/search/service/document/file/PDFDocumentTest.java
 create mode 100644 src/test/java/org/olat/search/service/document/file/Test_pdf_indexing.pdf
 create mode 100644 src/test/java/org/olat/test/VFSJavaIOFile.java

diff --git a/src/main/java/org/olat/search/service/document/file/PdfDocument.java b/src/main/java/org/olat/search/service/document/file/PdfDocument.java
index 04d4051571b..75bb1c748c8 100644
--- a/src/main/java/org/olat/search/service/document/file/PdfDocument.java
+++ b/src/main/java/org/olat/search/service/document/file/PdfDocument.java
@@ -64,6 +64,11 @@ public class PdfDocument extends FileDocument {
 		pdfTextBufferPath = SearchServiceFactory.getService().getSearchModuleConfig().getPdfTextBufferPath(); 
 	}
 	
+	public PdfDocument(boolean pdfTextBuffering, String pdfTextBufferPath) {
+		this.pdfTextBuffering = pdfTextBuffering;
+		this.pdfTextBufferPath = pdfTextBufferPath;
+	}
+	
 	public static Document createDocument(SearchResourceContext leafResourceContext, VFSLeaf leaf) throws IOException,DocumentException,DocumentAccessException {
     PdfDocument textDocument = new PdfDocument();
     textDocument.setFilePath(getPdfTextTmpFilePath(leafResourceContext));
@@ -128,10 +133,12 @@ public class PdfDocument extends FileDocument {
 		String dirPath = fullPdfTextTmpFilePath.substring(0,lastSlash);
 		File dirFile = new File(dirPath);
 		dirFile.mkdirs();
+		
+		FileOutputStream out = new FileOutputStream(pdfTextFile);
 		if(StringHelper.containsNonWhitespace(pdfText.getTitle())) {
-			FileUtils.save(new FileOutputStream(pdfTextFile), pdfText.getTitle() + "\u00A0|\u00A0" + pdfText.getContent(), "utf-8");
+			FileUtils.save(out, pdfText.getTitle() + "\u00A0|\u00A0" + pdfText.getContent(), "utf-8");
 		} else {
-			FileUtils.save(new FileOutputStream(pdfTextFile), pdfText.getContent(), "utf-8");
+			FileUtils.save(out, pdfText.getContent(), "utf-8");
 		}
 	}
 
diff --git a/src/test/java/org/olat/search/service/document/file/PDFDocumentTest.java b/src/test/java/org/olat/search/service/document/file/PDFDocumentTest.java
new file mode 100644
index 00000000000..555429f97b1
--- /dev/null
+++ b/src/test/java/org/olat/search/service/document/file/PDFDocumentTest.java
@@ -0,0 +1,75 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.search.service.document.file;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.UUID;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.olat.core.util.vfs.VFSLeaf;
+import org.olat.search.service.document.file.FileDocument.FileContent;
+import org.olat.test.VFSJavaIOFile;
+
+/**
+ * 
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ */
+public class PDFDocumentTest {
+	
+	@Test
+	public void testPDFDocument() throws DocumentException, DocumentAccessException, URISyntaxException {
+		URL pdfUrl = PDFDocumentTest.class.getResource("Test_pdf_indexing.pdf");
+		Assert.assertNotNull(pdfUrl);
+
+		VFSLeaf doc = new VFSJavaIOFile("Test_1.pdf", new File(pdfUrl.toURI()));
+		String temp = System.getProperty("java.io.tmpdir");
+		PdfDocument document = new PdfDocument(false, temp);
+		FileContent content =	document.readContent(doc);
+		Assert.assertNotNull(content);
+		Assert.assertEquals("Test pdf indexing", content.getTitle());
+		Assert.assertEquals("Un petit texte en français", content.getContent().trim());
+	}
+	
+	@Test
+	public void testPDFDocumentCaching() throws DocumentException, DocumentAccessException, URISyntaxException {
+		URL pdfUrl = PDFDocumentTest.class.getResource("Test_pdf_indexing.pdf");
+		Assert.assertNotNull(pdfUrl);
+
+		VFSLeaf doc = new VFSJavaIOFile(UUID.randomUUID().toString() + ".pdf", new File(pdfUrl.toURI()));
+		String temp = System.getProperty("java.io.tmpdir");
+		PdfDocument document = new PdfDocument(false, temp);
+		
+		//index the pdf
+		FileContent contentIndexed =	document.readContent(doc);
+		Assert.assertNotNull(contentIndexed);
+		Assert.assertEquals("Test pdf indexing", contentIndexed.getTitle());
+		Assert.assertEquals("Un petit texte en français", contentIndexed.getContent().trim());
+		
+		//take from the cache
+		FileContent contentCached =	document.readContent(doc);
+		Assert.assertNotNull(contentCached);
+		Assert.assertEquals("Test pdf indexing", contentCached.getTitle());
+		Assert.assertEquals("Un petit texte en français", contentCached.getContent().trim());
+	}
+}
\ No newline at end of file
diff --git a/src/test/java/org/olat/search/service/document/file/Test_pdf_indexing.pdf b/src/test/java/org/olat/search/service/document/file/Test_pdf_indexing.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..16d8cdcb0e9df6dffa044b6778dac33582abf4ee
GIT binary patch
literal 9016
zcmb_icUV)+(pL~f1QbLBX`zF(6at|uy-IIV10)byfP^AddKD0q4pOD}t{}Z59R)=|
z=^_G(Ak{C?*X#RU?|tq+Uk=aY?3~$|*_qAkvcJQjDW|{>5`d6$bS-~g-YEEzHQLof
zDg*!m(3W<j5)uGGHH4E5))oN8v9tk#3MdCG!WH-J0LLQa5LRew1VBoP6oYj|z#U0F
z&)(N;p$G(Co;#wRHzdw-3~noSabYWR0aAqC6gtZ~*`BnW(PCK<6}3LPvG2VeO$?#V
z$Pv(VBuk{=QtR`$o$EI0%wLsBmy0yy3W2*(G-hA(w^dSyLlB1@ljc$lj8%1`oLR*3
zDUa%k$OlxWDVyrVbe5_mhvRzB6%CLrbrDjPwgm;mgxOepGQX)rJl(Oi=6M3(yB|Nw
z%MS6iH7cK_H}F>EE<LkOWnyt@+W7Ejg-~w)HZ3W_$@;HB;O_8a#}63)4T1^dAL4Jp
ze+!H5U1tP9P!n$RgSsM|umH%<5NRVYXg60Y1O_1dlOc<C!s4D|0Qj)tVyKR=M!{v!
zo&aMYjsX>g0$@U5Q&L<Q|FVPc_bdFGu4pSA1QuY7GbX115Y$C@VgaTAL0Pl|+EvFH
zZiN8gvm}cF0YrYNmy*I|2WRmITUQq(00hAB4{-YNnfl9w=-*8Im0=Lx8=QN$0U&_j
zEqt1ta5)AD$|2lQRtQB`_}%}V{t!KN2YS8BOg675iaR0+YxQ^^ah=|gN7Y`Srn-?;
zo*{-}ef8o}oc2}6S0g(w)7~OHHifk`n&PhL60np5g1ra>3h($$u8f;S7U~k|_7N2+
zm7Te8witHiecIR8Mq#oqz4rE3UJRujAbV6NeaE&Xo~d4bA)alXJT&}V!dneHpCvF}
z7`9D|TtKMiU+9V1P&(c8`Q)q0lQ=s&_*`s6_-+0m7?|xwG{}E`MM6u3YhX7elbOnm
zIm~Aby9V;3|JMF`*P7y+L?z7|f^k`*b)|W*e7gvZT)zizVn(!E4Q8)u9fE!(s_*9x
z|9Y;j$mMvCbp@j5kEQx%w6L#kWlh?6$@9g<OVtcwru$R&keMgV_Lc9MQzMqSXi6po
z&q|-kK=3l85q~=G_e#`Af@;IOtZDJ1jrdY)+O1Et+g5S|iNy?yuSph8tA}FGuo34Q
zmc>^4f740~>Y*N_GdC<<iEL|BZSoy}nGnp89v5ug{%jh1xyU%rbm7^8`R11ns==^(
zsxhWZ&*Gw<@&$4CO13=?o?0I>{C+h07-_us1>G$sL`=ps-cggw<aOP%qe8>gLF0@d
z-Ko-9TEFqtd`M?A=((2g=b=rVHvh3Go*?!nEY&=x=<cP@<b62`!4jWc^xNm25C}2w
zJuaO*(G615{M?MN(YngT@{ysGm`*pcG}Y|fqpB-Hy?)MD*!H}+UZ>GxF{3WFlu~j&
z-`^UJ=rt5QJ!F6B=O*KOn^8MVxlpk1{N(DCL|*5I)4ratO@ij~)pn7&kXKI%UKM6W
zug=CCGL3kz-skwPH+a1AVqT2zt@|t{yrjt<L$Ei?uGm*bv+<p}h9$wrRQzapPcGO}
zuf_8iIZ{`HWjBf{6kEPur!;?iUb*7^k-iuII@^h?7x`o3hw?2S!)NYV_c9EGZxDC_
z<6Q2Ae<<WtY;9ocy*eE-TD7j2-t<849_cap;GHhr>XnGhwZ0^b4KpL1K{`fUVyi1`
zsKlqmvqDML_ptX+@bLVh$6>``@hQ{j2;*4oVcryn);<rK=P{2tPtwDYM;q)9c?Tk0
zjhc#m@_Yi`7Q~fvCoP1y8B4zUSmnNTuLgN7)x{rlX}0QC7lS<n&F3iZOlq@{qPkSS
z6FThYG@s8n>24QmcXt!M>EbA}F|~&}U+ef9@baE;@n%o|u>1V93-oS%yrlh@Ll?3p
zo<Z;G@nQIQn~kJErcM;{a)W#U8*yME1qE{9`@{eyq)DkIaIS9B^us+dnh`Diw_(cH
zw~~ukGHZvFI3M@N_w6D>A%rQN(UiWJ0Xd||?XVrm@!@bIP=Xla-Tq)E%xi0JU$bxK
z5#A9kLiZd$T62#qWXM0nv=GgwmV{brzIse))XbVsiy1nVf=}0n#}K?5ym?4&^oh&w
zdo|-2vtsVPo!y38%_osmuuA@O&cjQrcHtlXEW$r((vK<(gu#B*E_|KC^Kd0mSyomC
zjzL%h@byd^VERi0Uy6TK(BG9B^WSPOzMQ(@N+z!GsiLegxMGVh^*DWhtC%3rA39~>
zShxe)=I1hi`K$i_uCe&C`%fo+)MY^(H%sh~)kD|S4e`@E{2+clRFhXWQr6>DLO8f1
zuqZ3|&tfizz*xDWoUv$EQqWJ=1m&G@i!aIvXI&j`rHyukJN@P;pj<InSzEX(00PFX
z;PAg1AR*iU4N%rt+aE&|fsx`%{{PGMKQxJe@m~L@3kt=rcK8c_2mZ?^@ZaQrO8le{
z2m}BH0`YRcdf{6C<@&=Xe9wQR^v?wypM>AR{u%t+a7WxS_#YDE0Jp(q9T#DIFPR@J
zI=?6s1mG8ffdC*OAt(R@0^?S8L1o-LL0R2$vT;D*oE5x<vBK{cL_~1+cw_hmKNx~*
z$-<qL5GWg4+(VEEKu`yZaMTBg!T^GXKiQ;EFytp&2>^rQG`ZXS$S2MuKDX*{&!0^Y
zeyBg(!fn_PU;yan-sJb({K5D&Ie%>c{@S1XY=UqGfH=$lYsc3jX78z^S8xAV@%DHv
zDxUL2u5!Y}1iSkDr9+Z3p@(_35_Tw}>sg~Tr2K*UrHmWg4W!Z9ltiIn3kBaA?*YlO
zv4DG?bkYw~#ACox&J1oyhOxUodsfJDuigio9-9f{0e-nj%zl|~>-O(>Z}z^nFDq>s
zk=iuH7;v$-pQ#*e%xbX_?TekbaMMB6pkcoYby8sHS6^FkZDYOD=4@q2;(n<iW5FZo
zb4ryJhEvin=kHB@xb{@+O;Y!PGtpqRKxz1dHC1AYX^Hn%%)}v_k5~Wgb8PhE&)#_x
z1`YF)!qUyLwO{J@rZNoQFJ>(w_GbNTD%1iOiTF+=?ZtXuC(u0HaswEa1e9e38s9oY
zT$_C7Y_K%PbbzeD@*-ycX`n$8yMZr-SiYKI%1NQgspYDT#!2p%NW~WU0}lPd^7?}O
z4*IVI>{Ls!g$>b|CBI}8>uCCw0Iy)XVC~@a^dclJ;AjC9+(N>KO$f_ohO>1nlFY*P
zB(%BuJ7v?y{UdjS9t~}mi1zXmM|GxWxi?d?M84x<+)9-eQ|Gg7xfFrmzM!jfrO)g$
zH6P*m0}bZ~-dPmYeV?r6^kRgqB`-;m5R#OpU-^8j=~cBTAAeCG#)4TS53|&`7%P7_
zCN_$djLx-rDZ<(CScs9wzk0FsM7h_0#sFp}2cx!O+_j8aj9J|*VR$pnX1yP0RU#=<
zIg;q<lEnCo$)j}dlQSQ0{6USoT(Ybz1@q_CgQ=Km(lIT&)+O$3xrgW0C64$M-NytO
zQ>H1?L|rtK%vURC8bmqSc;7PZswu$KDdHvL)c44mkg(e<k%N-@TV>OfEc4R(NqS3>
zao)!WHzV<8H>M<y#Lnfiub!75??d1%m72*ns4t4jBred%v8V&Nzp9jJ=c?&)az9dG
zk?|AK-PBCy49mJc<+_%voxQ}i)N9zE!5OwZ(8={MJzgtt{BpzzQ%2G~78we1d!Eof
zmyl>4)}`$#&nb9oP%bSOq?W83)X6}bV{Jhk+|Ncy<e;=!B5bfxu;x=2P%-%0dU#4=
zb%PmF73MMI;B<kxHmswYI$}oFAT6ze)!cY*E~IogH9b8={iOHMOJCrUyGpw-&ve8n
zjbCHMAOq8yvsi5T$80j2WVZ%4zRetjw@sts2eM!Tm9wj3Qcd&c_FM-(B@igW?`|h1
z<_?}@1Y}G3n`_!#3XXA`EJd|AmET{)locI_V5UafUye43E%{wpvCIERA!fjvQSxYb
z>fKh{YEIN8cac}KGf{KvWbPx_(3;fFuNa!z;Ec`eo53GD2ii>A9ux8V6IXvbTj@%)
za3;JZYMcI!!fKDyyOAK_r($~|^;Gx0;t8&ll?T>rlY9(d%eqGxZqsf#O(f05yVKA@
z68er+Im{=zg+b1Ordh?Z%Dmmxlj6;OhiWBbj123Z5xK&W6KDCfq|y=P*1fM)Hh?QP
z7S1~p`@lXRX(J?=#Y1N~lP{iscX{tS(Szh%6P1s>RjOIRqOcXOrQ;jIyzb|A<1Ru+
z!|OKQ$-lSszp_C9(aphXwCQXM9aBqjT#9>VXizHX&a%hyw3yCeG<sbMtR`h0>nt5E
zNqMBo7n#}@=#XAVUf*5=JEc^!0o4-sm*pinu)U#^{&EH~<hY<drZpLK?TJ-!(3^KG
zlWoed^ZsFi{fM3+yBV{+Wkb|Q|C{6xmq%ERjM1?5TWV=8>ID&j)bXgi2eXQPO7#gM
zDGo@1i4LFGrnG}#M~iD!Cm+*hGiEQhM$G4HDoV#@#AL*_kaJdc$`}&bySNFq6MZ8)
zRW@W8R4~blpN#8HChlWeVZWQ2ZhgJq$TdJz$xl&=HL2f#Y=j-Gz!|oVs0W25Cndj{
zc5)X#f*pzPVVp=uwl%&m^O|&ckHxI@tl3u$OovtZTZHQch9?#U5E~L~Hoj&`KKDJK
z1Qxwca%YpFnM^uqLa~dOZTr$B!DY#+cuO$74q;OYAJ^L@WmnRPsA@iQpe>0)_ZsaL
zE34EL3M3TL*8GC366GK)9%S0a)V>SZV?DZhbhQ`5ll~xWc&d}r3EDtEA@%8uNLS17
z(Kj9+Lg`rM1(DBb)A`30-=ZSxB40$ZbR)XWL43nhPS=F9-TY#tj&ydH{UsUt<<_I#
z2^*>q<Po}OK{Giwf#Gv?(GtOj9|B4Zd7mX_3{&TbG?UCLqTiD5w=1|)N-!Qly)Vz*
z(l82<rD*djC;oVRyLOmRGu%ul@p#Swo!GlM@DMD=73yQ0I%O%Gf1RAiD?^w^D<eyr
zlr+<dj-csQQT+=#_l6MB23><BMN|<Z@9T;p+s?<;5EF0Tw914%d&QS-{3p|{2f>M_
zo~qwHRdd|*Z|RwpL%2mdTgjA$NsNF6L_3NE+I@6P4|Zn2r^(S=ECP|!?Q}vOMCtJH
z6|zwKqo>3{jseXkuH&&El==qq13E9+i8<3gshbZwOY>xmroB>+^js&+1(&6&a*LyC
z=f(6y3xGPctYMg*IzLR&%*lgxIXLV}lJX!^%(v{^`<9zgcRC!rxrb`Us<5K)1ZtAB
zPY2V-f}d~D%wowQLydNC#LwGzp4NwHH9d65)ji_OLkf$#7$Rj0In;!sFWf?yM8s>m
zEP4l)IOao2<L&aw+aEa=n%LUWRUekQZj;Me4aRk&A4D|ICalywVl6+lo||kgsx75{
zVZXS{{Hl9n9;T}L<u#_Y*A+R@NI)`mPdC;zG(&Y+nVq^m5Seim*jP*OHCQ8j0sKrW
z69p&s4Rs5-YvAkcnRQT1YZ}n#?8r+fdm~D3F4#_H`njW~I30h;W?ejH8#7z>Chvhp
zMFonvM60p(F(E=*Hugv*xz@b<XbrjEq34m3FJLz>HS<JCb!7p1RY_+`Go_PwwvFDn
zs}d4?)iZS{gYK-J)u5J)a2P9lJqy9vBV~!)YE>FG@ua7BJkG2tvI<_~t(NcljLE2j
zVfepZUCqK&`psn3yqpOc?rK`1qRR-%CYZFqT>Nmssh#d5yVj)^LY*4DNImLOc~O{|
z>>UYjuR@!4`3>4`g^;Gkl<H4CiK6`P0&d=!W+utLI_f(jTpv7=vl=QhU2JQj{qWm!
zr!UDv-P{=5|J17Qa~Eb1XTnIxDaJu*#_S*;cW0nu-09qVY;ao_>32i<bGBECKa<ee
zc0D&#vP^X#)S}WVy*#zfj$JQd3bENkzjU5yoSm*=$mdUhn(XkSrajoMXZpxqFK0;F
z6(cvu9(ttPDdOvKJ<~NKw4~Lj^VFqDtFMT=%>1SEi-x>+D3P3ZZR98zOkmyZdbxZ`
zkZ$Kht2p^9(}H)0=$G5kc<B`GO){g-n&%wkBhM+xMP}nd(M)*dA~{1MI^-h<pM++y
z8KG%7<qgq;_hp9VQRoLyi7n&t?PK~e=RuryA-s08d*HCb&}%XF(~oIF?H9M(f-5i1
zds&!a?+@(cb!}va?!fOdQMh`@T#;cM7j|WO$#y$CR+NN(CnT*N0xwd?LL&{fe5iKR
zm#*Yxc*b`dY;Uc>pCg&vOEU@0dZ-sS&vmWkKP08vF5^CBk9qXn{{g#5N-&yfKmLxw
zAfF}ij$~1YZ@lqfOAqhCJnQ3j59$Shg=hRx9@bMk-n@vjOahl5z9wlSI;X-m{G9nL
z#o5c(=E8KQ2`$Wqc^E=^t1AoTxIRdbKxbF_9!YQ8oQm>yyf`J@x>?!XKK;z+?66g^
zZsBKD&bdwl+nI9~-}>+9-AGHd(`=$DL%s(as;#uV-(zadw*BU?rxdgoHN)m*epc5Y
zR@b18<|<W2`@=ihCT9A@ykjUL1#Gp`MM`C~-r9??5c%(>--FhktUV$BIwW*D^k}Yy
zcc01ZnEKiJz`@#ly+SMCg0V7qqjO5QdoF1{CVmW3yg=wL@6Mt;T0BAJm>DnT*kG5h
zzs>VC;)ZaUVV~|yUBuo11LwT)-JJL$zG3(EI)aMYyI{3?61uMCX~w|b%nIbk{0}#>
ziwBUGn`h30%XG$@>*@M4Ne9(+%mCs$`P=L>XRUaT)Xd)Gk6{c9M6@LXd8gLZpX+DL
zB}vCi%T!LL_{fJ$9G(~<mV3wmG}m}kY1-2>Ic16`08}8t0XoW3_XMSAR;1^vWZ7E1
zU8lv<qpdLg@l>9T4bB{vemNHI=sdDIk$!#z3F)m=8I{PLuPQce3b2q+B|4^tFq%)}
z%7|qixtb?%W!tc6z2>L6g(+kjAkOk<s}EE_@6LR09m!mOHn^ms_6o83)VM}RZ@J>_
zvy-8sjGzj^zOwm-Zd)DOcn2chz8i>gQMA^V(vK?!dy`X}*WaQBEoR6gBCq$GH+<&0
z<mfLDV$#8DTo`o{TJxU1gd8nm!ag?Ns&mlj)*7@7RRg1ecDwxwLDFMrO|LTRCx<Za
z%;t_vjib8Hrc?6075UOBr|d-|8^aqZ@+xLSYI7NOBfC83SoCV&1fTORe$DZ*cC#U)
zvc+oAq^Mtj9<8iIjlHf>{kGFsGUXt!*V4s%j%vTIhhNA`+5LHgg0B~IYIm6Yt&)#n
zlPo0)CADmZyz~V$>@hYwV)wSwJKnuSeSJ+`c59G_%9IY3;uJ09E~4B}q83O$sc=7y
z9mQS}t|x(1!35IB*CuOCbUSjr5ftY-@^e+>ogI5kTEwZQ0AeiDGt)QAVX+ktd3aWg
z|Ka6^^Y@D`lR$i`a?~nXTvPlVR@oY;ug8#zT!Vhqa6B~H73?}b|6bGP1<YsbY^Kue
zuJP)y5p*%d#@vZN&8&%|b?gZT)m#KHkMqOxlDz<{pkTA7R@mBiv9G#X0~)w%PDBGu
zA6VEZSGOmn=8bY0s&STZDz8G<iF~Vjvf)AoWHdF)k&Tv{$;8IKtJd<+bK-=Lvpy6f
zWA*i7o1xmeg@S^-Jh!2AU&h9$d#G~rI(6@8A6_Z)GE72M8%?SYXTQtdd~=Yh97Ve#
z8ai~cv%)(#%_Ynnx7hDRUGB=~^yt8`qnClS#NvuB_m%Qa-bxFtVv0ycXf?N9&B%TI
z4Ek%iUc!-a+JTt&LmL_kod|!o2hv|YOjXTL?#f;?gjcn$1;1|&d`C?j(mPtPcGXjs
z)e308*?fkyMy&mYVOiXoo{=N_{KvX`9OSZr@26WinJ~HEDw;_<lZRK?Cedpeko+#s
zujjefIkg};rqHg!guX-B8VYw)yCF%qpvlJmaABV+J?BwVplMWEX6pB$HHMX$m|}!-
z5j5We8~Z$_!!mj^YIxZs+zvqKb<#A#yPuZKmp}1jg8QQai&1vfn@PIsJy!Kd&L#UV
z@@R!>`2inIi7OtSLc{rugM+tk6ER}Y#&*}Y^+i@gg?iM#=?;a<FA~4ZbH1`W?O7V|
zQjLsv2TF^I<K$3?7UJmkbdmMF+8KG<(rjj{Skg^wtwSQ!KX0gY`=~dU%gbY5<f=Z!
ze(OO`TTX64(&lrIQ>neRmBZ5Fwa2-+V>a%5Jn9w9C-)8)6-?Ijoy67_kgabzpC$~<
ztTPm7+0orsDNxzvE;7PiP_ZZNf92(7F;*a_bom9Phw{@NVt%*onW<HUkuh^9dG#c%
z)f3u%<&4^$xSb~ByEUe1Pke1RfCkRh4wpKg_kk5(Mt{mVERSgEWLibO=XW~Wzb}0!
z`*ru$sI=2GV)jv4-vIXRK-V1?uNCY_^Uy)&atiP4NyLfrNvc$lNX@IMjkzR0fJjKU
zbK9!R0gnar32qN>mB}K_YxK4Z`)t4@nwO0yU{D#<YFSf2k}m1*5%ct>CaO0243TBP
z6#O>STTQ2WHjr!ZPM(Wrtxj74nuqWD^;kID<NJrU)bw9bl(~anuUf<iC^@QmFg%@~
zWjSAE#2)KHZ>rx==n|gQF~S!7qFXX*L}94B_o+~j5&Q5G8D$rldi;0-fT}_D(ap~=
z%GL;YVtGwOSA1j&!$7SbZSRtrJLLyX(MC3{)?VAtBXYMSg6q$nOS0d@0lH=B+?da2
zQ;yt=S=@^oR54g+t2Pz6`^g8pI61d}`}E``YUtLS<nqq)+xF7Xtrp#hlTT>D$JhEU
zj5lUEpB{&_t3{vE&3xV8@`8T}EKiFp5cy_b!_Tu9IJ<C(xn=v4*^25eht5ZE?)z&C
zo9+`D@t>~@+bIR>9+{dHk96G-x**2eL)DCv*RoPWGV*nrDc2d6($0T6YS<|QFfAz5
z<|Zwz$>gT`7}C8lc$+WO#R&6Ti+f}E@S&5l+Luz(O2oxhz~Nr~n1y^~DlkoN;K%?d
zh)%E)%siOB)I=b0^k_VR&W|fg5kzzAR;)GA?ovpBeC;aFaisHAofvqCJP!w|E02}x
z^ueyQ|IV`aSVrFWgtcp9YaHVvSLK-5Pmb3Na<?9ojlH40b~{3>C_1t7S|jl`<$Lqy
zl4A=|olID+bx$4<N4BzQ0u#G<zh8c_IuEk(q6_5{i9{&(N2yy4T>WP04a2*(Rkt?H
zY&3?s`ECer&*UUKw$4258ZgvRDJ?Bm8}y>hr~|j_AX7}}SUNy1FOqMp!^1yOOfp`)
zqbQZdG0HY?!*=IG0j*Tg{s-SI-wnbUQ^Mt|snnW?riTLRk^1ajrq#l)()p=k$sySU
z`#Ma94=#sVC45z8T{8SE_g)>7i%zndeIIT)q`sa=FAco^$kU0n>{}IVihb<lLaf@(
z1f|on_?!FuGyI^;M}tlh?y1@&nXY86SVg3OpS4(yY0aJ@gp~R9>zZL#_LB+?^@i0~
z0?kKr+K+40T<KeKcpbG-PQ})V`i^D?v}3K^(BOHar=QwBv}m-p?s%hHXUkI|n3s<I
zDxD1XWy*vT#V<a*u~iQp$(hv$8_g9Ib^~5U%qyS1&23kqX{93C_Ewej(@F`NN3V29
zB*&V|Iwgr;KBl7f|E{&r;F5f`^wQMGi=qvasaG>^T51{JbT!phF~ey(SkHO+`wMn(
z26J8Z3*IK^C?VNm^NDmO66fmaVakIua4n?Y9Lcyjky7C(Sh1CQI>@#CjBB((J<FSO
z)Sh$H<962aciu+i^JiS!-<8(C6Lt!Qh5iT3;TQT1g@7Qx00q!5IG9@(fx!Ztt&sqf
zlQqH<cL2}xFPUGsEjR8&9-yHEFa&^r0x$s(K+6s8iuD5E0Nfu~uqXC+pI=}G_vv>N
zAP}g7Cs;gL#}j8fvBeWOo;cwN0#5*VqKzkLJi+{ntp8U13xD9oqtuw+{9o8Fx11Ol
z2m%9P5Fk((ED9C50|av6{{AHi#viQX4~e;dvwoo<#=pUqUo1Qht&76q&bWU>3kN0N
za>Lr9T>-eG>>tQ74$HQ7v%<YT0Q!ZD<K7y;VHyC?4}=<b{Ecs;&`xqV;F%Qk6Vnk?
zM_c3DfM0D@#9a@xD-Nak;U3<~EloAC-(0*q+J6IXJY5k;925Wsli~vP*9RaBg+ibJ
zB;YR|3@nTrEB*s;`o#l6fH+nE<bgzR$NT@r0|N12#XseMVA!8LAs}uN{ZkGkf)B;N
z@nA6A4E!e#2nGJZ0}12a9QZdm5DfB%91d9c!)GuQ`iFlaqR>C|iHM5);U5e)Xa3zT
z3@H4ET^Q(3eK3#+F020>8w?Eo!#@~U=x_PJy25cNhU<^lQFKsV2wW}!g4$>_4zR=Z
z#3fr$*$Iipp?5#;<#70&1Xxta3O8^d5ch5cP8rln821thQq)=m1{4A!;czL^|1I(p
YEW%)MKi(gc2qpv)CFS6d*H9q+KMIz6Q~&?~

literal 0
HcmV?d00001

diff --git a/src/test/java/org/olat/test/AllTestsJunit4.java b/src/test/java/org/olat/test/AllTestsJunit4.java
index 15495ea5964..42fefc422c4 100644
--- a/src/test/java/org/olat/test/AllTestsJunit4.java
+++ b/src/test/java/org/olat/test/AllTestsJunit4.java
@@ -98,6 +98,7 @@ import org.junit.runners.Suite;
 	org.olat.modules.wiki.versioning.diff.CookbookDiffTest.class,//ok
 	org.olat.properties.PropertyTest.class,//ok
 	org.olat.search.service.document.file.FileDocumentFactoryTest.class,
+	org.olat.search.service.document.file.PDFDocumentTest.class,
 	org.olat.catalog.CatalogManagerTest.class,//ok
 	org.olat.bookmark.BookmarkManagerTest.class,//ok
 	org.olat.notifications.NotificationsManagerTest.class,//fail
diff --git a/src/test/java/org/olat/test/VFSJavaIOFile.java b/src/test/java/org/olat/test/VFSJavaIOFile.java
new file mode 100644
index 00000000000..5fd92fb877d
--- /dev/null
+++ b/src/test/java/org/olat/test/VFSJavaIOFile.java
@@ -0,0 +1,140 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.test;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import org.olat.core.util.vfs.VFSConstants;
+import org.olat.core.util.vfs.VFSContainer;
+import org.olat.core.util.vfs.VFSItem;
+import org.olat.core.util.vfs.VFSLeaf;
+import org.olat.core.util.vfs.VFSStatus;
+import org.olat.core.util.vfs.callbacks.VFSSecurityCallback;
+
+/**
+ * An implementation of the VFSLEaf for a pure java.io.File with
+ * an absolute path.
+ * 
+ * 
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ */
+public class VFSJavaIOFile implements VFSLeaf {
+
+	private final String name;
+	private final File file;
+	
+	public VFSJavaIOFile(String name, File file) {
+		this.name = name;
+		this.file = file;
+	}
+
+	@Override
+	public VFSItem resolve(String path) {
+		return null;
+	}
+
+	@Override
+	public VFSContainer getParentContainer() {
+		return null;
+	}
+
+	@Override
+	public void setParentContainer(VFSContainer parentContainer) {
+		//
+	}
+
+	@Override
+	public VFSStatus rename(String newname) {
+		return VFSConstants.NO;
+	}
+
+	@Override
+	public VFSStatus delete() {
+		return VFSConstants.NO;
+	}
+
+	@Override
+	public VFSStatus canRename() {
+		return VFSConstants.NO;
+	}
+
+	@Override
+	public VFSStatus canDelete() {
+		return VFSConstants.NO;
+	}
+
+	@Override
+	public String getName() {
+		return name == null ? file.getName() : name;
+	}
+
+	@Override
+	public long getLastModified() {
+		return file.lastModified();
+	}
+
+	@Override
+	public VFSStatus canCopy() {
+		return VFSConstants.NO;
+	}
+
+	@Override
+	public VFSStatus canWrite() {
+		return VFSConstants.NO;
+	}
+
+	@Override
+	public VFSSecurityCallback getLocalSecurityCallback() {
+		return null;
+	}
+
+	@Override
+	public void setLocalSecurityCallback(VFSSecurityCallback secCallback) {
+		//
+	}
+
+	@Override
+	public boolean isSame(VFSItem vfsItem) {
+		return false;
+	}
+
+	@Override
+	public InputStream getInputStream() {
+		try {
+			return new FileInputStream(file);
+		} catch (FileNotFoundException e) {
+			return null;
+		}
+	}
+
+	@Override
+	public long getSize() {
+		return file.length();
+	}
+
+	@Override
+	public OutputStream getOutputStream(boolean append) {
+		return null;
+	}
+}
\ No newline at end of file
-- 
GitLab