PNG  IHDRQgAMA a cHRMz&u0`:pQ<bKGDgmIDATxwUﹻ& ^CX(J I@ "% (** BX +*i"]j(IH{~R)[~>h{}gy)I$Ij .I$I$ʊy@}x.: $I$Ii}VZPC)I$IF ^0ʐJ$I$Q^}{"r=OzI$gRZeC.IOvH eKX $IMpxsk.쒷/&r[޳<v| .I~)@$updYRa$I |M.e JaֶpSYR6j>h%IRز if&uJ)M$I vLi=H;7UJ,],X$I1AҒJ$ XY XzI@GNҥRT)E@;]K*Mw;#5_wOn~\ DC&$(A5 RRFkvIR}l!RytRl;~^ǷJj اy뷦BZJr&ӥ8Pjw~vnv X^(I;4R=P[3]J,]ȏ~:3?[ a&e)`e*P[4]T=Cq6R[ ~ޤrXR Հg(t_HZ-Hg M$ãmL5R uk*`%C-E6/%[t X.{8P9Z.vkXŐKjgKZHg(aK9ڦmKjѺm_ \#$5,)-  61eJ,5m| r'= &ڡd%-]J on Xm|{ RҞe $eڧY XYrԮ-a7RK6h>n$5AVڴi*ֆK)mѦtmr1p| q:흺,)Oi*ֺK)ܬ֦K-5r3>0ԔHjJئEZj,%re~/z%jVMڸmrt)3]J,T K֦OvԒgii*bKiNO~%PW0=dii2tJ9Jݕ{7"I P9JKTbu,%r"6RKU}Ij2HKZXJ,妝 XYrP ެ24c%i^IK|.H,%rb:XRl1X4Pe/`x&P8Pj28Mzsx2r\zRPz4J}yP[g=L) .Q[6RjWgp FIH*-`IMRaK9TXcq*I y[jE>cw%gLRԕiFCj-ďa`#e~I j,%r,)?[gp FI˨mnWX#>mʔ XA DZf9,nKҲzIZXJ,L#kiPz4JZF,I,`61%2s $,VOϚ2/UFJfy7K> X+6 STXIeJILzMfKm LRaK9%|4p9LwJI!`NsiazĔ)%- XMq>pk$-$Q2x#N ؎-QR}ᶦHZډ)J,l#i@yn3LN`;nڔ XuX5pF)m|^0(>BHF9(cզEerJI rg7 4I@z0\JIi䵙RR0s;$s6eJ,`n 䂦0a)S)A 1eJ,堌#635RIgpNHuTH_SԕqVe ` &S)>p;S$魁eKIuX`I4춒o}`m$1":PI<[v9^\pTJjriRŭ P{#{R2,`)e-`mgj~1ϣLKam7&U\j/3mJ,`F;M'䱀 .KR#)yhTq;pcK9(q!w?uRR,n.yw*UXj#\]ɱ(qv2=RqfB#iJmmL<]Y͙#$5 uTU7ӦXR+q,`I}qL'`6Kͷ6r,]0S$- [RKR3oiRE|nӦXR.(i:LDLTJjY%o:)6rxzҒqTJjh㞦I.$YR.ʼnGZ\ֿf:%55 I˼!6dKxm4E"mG_ s? .e*?LRfK9%q#uh$)i3ULRfK9yxm܌bj84$i1U^@Wbm4uJ,ҪA>_Ij?1v32[gLRD96oTaR׿N7%L2 NT,`)7&ƝL*꽙yp_$M2#AS,`)7$rkTA29_Iye"|/0t)$n XT2`YJ;6Jx".e<`$) PI$5V4]29SRI>~=@j]lp2`K9Jaai^" Ԋ29ORI%:XV5]JmN9]H;1UC39NI%Xe78t)a;Oi Ҙ>Xt"~G>_mn:%|~ޅ_+]$o)@ǀ{hgN;IK6G&rp)T2i୦KJuv*T=TOSV>(~D>dm,I*Ɛ:R#ۙNI%D>G.n$o;+#RR!.eU˽TRI28t)1LWϚ>IJa3oFbu&:tJ*(F7y0ZR ^p'Ii L24x| XRI%ۄ>S1]Jy[zL$adB7.eh4%%누>WETf+3IR:I3Xה)3אOۦSRO'ٺ)S}"qOr[B7ϙ.edG)^ETR"RtRݜh0}LFVӦDB^k_JDj\=LS(Iv─aTeZ%eUAM-0;~˃@i|l @S4y72>sX-vA}ϛBI!ݎߨWl*)3{'Y|iSlEڻ(5KtSI$Uv02,~ԩ~x;P4ցCrO%tyn425:KMlD ^4JRxSهF_}شJTS6uj+ﷸk$eZO%G*^V2u3EMj3k%)okI]dT)URKDS 7~m@TJR~荪fT"֛L \sM -0T KfJz+nإKr L&j()[E&I ߴ>e FW_kJR|!O:5/2跌3T-'|zX ryp0JS ~^F>-2< `*%ZFP)bSn"L :)+pʷf(pO3TMW$~>@~ū:TAIsV1}S2<%ޟM?@iT ,Eūoz%i~g|`wS(]oȤ8)$ ntu`өe`6yPl IzMI{ʣzʨ )IZ2= ld:5+請M$-ї;U>_gsY$ÁN5WzWfIZ)-yuXIfp~S*IZdt;t>KūKR|$#LcԀ+2\;kJ`]YǔM1B)UbG"IRߊ<xܾӔJ0Z='Y嵤 Leveg)$znV-º^3Ւof#0Tfk^Zs[*I꯳3{)ˬW4Ւ4 OdpbZRS|*I 55#"&-IvT&/윚Ye:i$ 9{LkuRe[I~_\ؠ%>GL$iY8 9ܕ"S`kS.IlC;Ҏ4x&>u_0JLr<J2(^$5L s=MgV ~,Iju> 7r2)^=G$1:3G< `J3~&IR% 6Tx/rIj3O< ʔ&#f_yXJiގNSz; Tx(i8%#4 ~AS+IjerIUrIj362v885+IjAhK__5X%nV%Iͳ-y|7XV2v4fzo_68"S/I-qbf; LkF)KSM$ Ms>K WNV}^`-큧32ŒVؙGdu,^^m%6~Nn&͓3ŒVZMsRpfEW%IwdǀLm[7W&bIRL@Q|)* i ImsIMmKmyV`i$G+R 0tV'!V)֏28vU7͒vHꦼtxꗞT ;S}7Mf+fIRHNZUkUx5SAJㄌ9MqμAIRi|j5)o*^'<$TwI1hEU^c_j?Е$%d`z cyf,XO IJnTgA UXRD }{H}^S,P5V2\Xx`pZ|Yk:$e ~ @nWL.j+ϝYb퇪bZ BVu)u/IJ_ 1[p.p60bC >|X91P:N\!5qUB}5a5ja `ubcVxYt1N0Zzl4]7­gKj]?4ϻ *[bg$)+À*x쳀ogO$~,5 زUS9 lq3+5mgw@np1sso Ӻ=|N6 /g(Wv7U;zωM=wk,0uTg_`_P`uz?2yI!b`kĸSo+Qx%!\οe|އԁKS-s6pu_(ֿ$i++T8=eY; צP+phxWQv*|p1. ά. XRkIQYP,drZ | B%wP|S5`~́@i޾ E;Չaw{o'Q?%iL{u D?N1BD!owPHReFZ* k_-~{E9b-~P`fE{AܶBJAFO wx6Rox5 K5=WwehS8 (JClJ~ p+Fi;ŗo+:bD#g(C"wA^ r.F8L;dzdIHUX݆ϞXg )IFqem%I4dj&ppT{'{HOx( Rk6^C٫O.)3:s(۳(Z?~ٻ89zmT"PLtw䥈5&b<8GZ-Y&K?e8,`I6e(֍xb83 `rzXj)F=l($Ij 2*(F?h(/9ik:I`m#p3MgLaKjc/U#n5S# m(^)=y=đx8ŬI[U]~SцA4p$-F i(R,7Cx;X=cI>{Km\ o(Tv2vx2qiiDJN,Ҏ!1f 5quBj1!8 rDFd(!WQl,gSkL1Bxg''՞^ǘ;pQ P(c_ IRujg(Wz bs#P­rz> k c&nB=q+ؔXn#r5)co*Ũ+G?7< |PQӣ'G`uOd>%Mctz# Ԫڞ&7CaQ~N'-P.W`Oedp03C!IZcIAMPUۀ5J<\u~+{9(FbbyAeBhOSܳ1 bÈT#ŠyDžs,`5}DC-`̞%r&ڙa87QWWp6e7 Rϫ/oY ꇅ Nܶըtc!LA T7V4Jsū I-0Pxz7QNF_iZgúWkG83 0eWr9 X]㾮݁#Jˢ C}0=3ݱtBi]_ &{{[/o[~ \q鯜00٩|cD3=4B_b RYb$óBRsf&lLX#M*C_L܄:gx)WΘsGSbuL rF$9';\4Ɍq'n[%p.Q`u hNb`eCQyQ|l_C>Lb꟟3hSb #xNxSs^ 88|Mz)}:](vbۢamŖ࿥ 0)Q7@0=?^k(*J}3ibkFn HjB׻NO z x}7p 0tfDX.lwgȔhԾŲ }6g E |LkLZteu+=q\Iv0쮑)QٵpH8/2?Σo>Jvppho~f>%bMM}\//":PTc(v9v!gոQ )UfVG+! 35{=x\2+ki,y$~A1iC6#)vC5^>+gǵ@1Hy٪7u;p psϰu/S <aʸGu'tD1ԝI<pg|6j'p:tպhX{o(7v],*}6a_ wXRk,O]Lܳ~Vo45rp"N5k;m{rZbΦ${#)`(Ŵg,;j%6j.pyYT?}-kBDc3qA`NWQū20/^AZW%NQ MI.X#P#,^Ebc&?XR tAV|Y.1!؅⨉ccww>ivl(JT~ u`ٵDm q)+Ri x/x8cyFO!/*!/&,7<.N,YDŽ&ܑQF1Bz)FPʛ?5d 6`kQձ λc؎%582Y&nD_$Je4>a?! ͨ|ȎWZSsv8 j(I&yj Jb5m?HWp=g}G3#|I,5v珿] H~R3@B[☉9Ox~oMy=J;xUVoj bUsl_35t-(ՃɼRB7U!qc+x4H_Qo֮$[GO<4`&č\GOc[.[*Af%mG/ ňM/r W/Nw~B1U3J?P&Y )`ѓZ1p]^l“W#)lWZilUQu`-m|xĐ,_ƪ|9i:_{*(3Gѧ}UoD+>m_?VPۅ15&}2|/pIOʵ> GZ9cmíتmnz)yߐbD >e}:) r|@R5qVSA10C%E_'^8cR7O;6[eKePGϦX7jb}OTGO^jn*媓7nGMC t,k31Rb (vyܴʭ!iTh8~ZYZp(qsRL ?b}cŨʊGO^!rPJO15MJ[c&~Z`"ѓޔH1C&^|Ш|rʼ,AwĴ?b5)tLU)F| &g٣O]oqSUjy(x<Ϳ3 .FSkoYg2 \_#wj{u'rQ>o;%n|F*O_L"e9umDds?.fuuQbIWz |4\0 sb;OvxOSs; G%T4gFRurj(֍ڑb uԖKDu1MK{1^ q; C=6\8FR艇!%\YÔU| 88m)֓NcLve C6z;o&X x59:q61Z(T7>C?gcļxѐ Z oo-08jہ x,`' ҔOcRlf~`jj".Nv+sM_]Zk g( UOPyεx%pUh2(@il0ݽQXxppx-NS( WO+轾 nFߢ3M<;z)FBZjciu/QoF 7R¥ ZFLF~#ȣߨ^<쩡ݛкvџ))ME>ώx4m#!-m!L;vv#~Y[đKmx9.[,UFS CVkZ +ߟrY٧IZd/ioi$%͝ب_ֶX3ܫhNU ZZgk=]=bbJS[wjU()*I =ώ:}-蹞lUj:1}MWm=̛ _ ¾,8{__m{_PVK^n3esw5ӫh#$-q=A̟> ,^I}P^J$qY~Q[ Xq9{#&T.^GVj__RKpn,b=`żY@^՝;z{paVKkQXj/)y TIc&F;FBG7wg ZZDG!x r_tƢ!}i/V=M/#nB8 XxЫ ^@CR<{䤭YCN)eKOSƟa $&g[i3.C6xrOc8TI;o hH6P&L{@q6[ Gzp^71j(l`J}]e6X☉#͕ ׈$AB1Vjh㭦IRsqFBjwQ_7Xk>y"N=MB0 ,C #o6MRc0|$)ف"1!ixY<B9mx `,tA>)5ػQ?jQ?cn>YZe Tisvh# GMމȇp:ԴVuږ8ɼH]C.5C!UV;F`mbBk LTMvPʍϤj?ԯ/Qr1NB`9s"s TYsz &9S%U԰> {<ؿSMxB|H\3@!U| k']$U+> |HHMLޢ?V9iD!-@x TIî%6Z*9X@HMW#?nN ,oe6?tQwڱ.]-y':mW0#!J82qFjH -`ѓ&M0u Uγmxϵ^-_\])@0Rt.8/?ٰCY]x}=sD3ojަЫNuS%U}ԤwHH>ڗjܷ_3gN q7[q2la*ArǓԖ+p8/RGM ]jacd(JhWko6ڎbj]i5Bj3+3!\j1UZLsLTv8HHmup<>gKMJj0@H%,W΃7R) ">c, xixј^ aܖ>H[i.UIHc U1=yW\=S*GR~)AF=`&2h`DzT󑓶J+?W+}C%P:|0H܆}-<;OC[~o.$~i}~HQ TvXΈr=b}$vizL4:ȰT|4~*!oXQR6Lk+#t/g lԁߖ[Jڶ_N$k*". xsxX7jRVbAAʯKҎU3)zSNN _'s?f)6X!%ssAkʱ>qƷb hg %n ~p1REGMHH=BJiy[<5 ǁJҖgKR*倳e~HUy)Ag,K)`Vw6bRR:qL#\rclK/$sh*$ 6덤 KԖc 3Z9=Ɣ=o>X Ώ"1 )a`SJJ6k(<c e{%kϊP+SL'TcMJWRm ŏ"w)qc ef꒵i?b7b('"2r%~HUS1\<(`1Wx9=8HY9m:X18bgD1u ~|H;K-Uep,, C1 RV.MR5άh,tWO8WC$ XRVsQS]3GJ|12 [vM :k#~tH30Rf-HYݺ-`I9%lIDTm\ S{]9gOڒMNCV\G*2JRŨ;Rҏ^ڽ̱mq1Eu?To3I)y^#jJw^Ńj^vvlB_⋌P4x>0$c>K†Aļ9s_VjTt0l#m>E-,,x,-W)سo&96RE XR.6bXw+)GAEvL)͞K4$p=Ũi_ѱOjb HY/+@θH9޼]Nԥ%n{ &zjT? Ty) s^ULlb,PiTf^<À] 62R^V7)S!nllS6~͝V}-=%* ʻ>G DnK<y&>LPy7'r=Hj 9V`[c"*^8HpcO8bnU`4JȪAƋ#1_\ XϘHPRgik(~G~0DAA_2p|J묭a2\NCr]M_0 ^T%e#vD^%xy-n}-E\3aS%yN!r_{ )sAw ڼp1pEAk~v<:`'ӭ^5 ArXOI驻T (dk)_\ PuA*BY]yB"l\ey hH*tbK)3 IKZ򹞋XjN n *n>k]X_d!ryBH ]*R 0(#'7 %es9??ښFC,ՁQPjARJ\Ρw K#jahgw;2$l*) %Xq5!U᢯6Re] |0[__64ch&_}iL8KEgҎ7 M/\`|.p,~`a=BR?xܐrQ8K XR2M8f ?`sgWS%" Ԉ 7R%$ N}?QL1|-эټwIZ%pvL3Hk>,ImgW7{E xPHx73RA @RS CC !\ȟ5IXR^ZxHл$Q[ŝ40 (>+ _C >BRt<,TrT {O/H+˟Pl6 I B)/VC<6a2~(XwV4gnXR ϱ5ǀHٻ?tw똤Eyxp{#WK qG%5],(0ӈH HZ])ג=K1j&G(FbM@)%I` XRg ʔ KZG(vP,<`[ Kn^ SJRsAʠ5xՅF`0&RbV tx:EaUE/{fi2;.IAwW8/tTxAGOoN?G}l L(n`Zv?pB8K_gI+ܗ #i?ޙ.) p$utc ~DžfՈEo3l/)I-U?aԅ^jxArA ΧX}DmZ@QLےbTXGd.^|xKHR{|ΕW_h] IJ`[G9{).y) 0X YA1]qp?p_k+J*Y@HI>^?gt.06Rn ,` ?);p pSF9ZXLBJPWjgQ|&)7! HjQt<| ؅W5 x W HIzYoVMGP Hjn`+\(dNW)F+IrS[|/a`K|ͻ0Hj{R,Q=\ (F}\WR)AgSG`IsnAR=|8$}G(vC$)s FBJ?]_u XRvύ6z ŨG[36-T9HzpW̞ú Xg큽=7CufzI$)ki^qk-) 0H*N` QZkk]/tnnsI^Gu't=7$ Z;{8^jB% IItRQS7[ϭ3 $_OQJ`7!]W"W,)Iy W AJA;KWG`IY{8k$I$^%9.^(`N|LJ%@$I}ֽp=FB*xN=gI?Q{٥4B)mw $Igc~dZ@G9K X?7)aK%݅K$IZ-`IpC U6$I\0>!9k} Xa IIS0H$I H ?1R.Чj:4~Rw@p$IrA*u}WjWFPJ$I➓/6#! LӾ+ X36x8J |+L;v$Io4301R20M I$-E}@,pS^ޟR[/s¹'0H$IKyfŸfVOπFT*a$I>He~VY/3R/)>d$I>28`Cjw,n@FU*9ttf$I~<;=/4RD~@ X-ѕzἱI$: ԍR a@b X{+Qxuq$IЛzo /~3\8ڒ4BN7$IҀj V]n18H$IYFBj3̵̚ja pp $Is/3R Ӻ-Yj+L;.0ŔI$Av? #!5"aʄj}UKmɽH$IjCYs?h$IDl843.v}m7UiI=&=0Lg0$I4: embe` eQbm0u? $IT!Sƍ'-sv)s#C0:XB2a w I$zbww{."pPzO =Ɔ\[ o($Iaw]`E).Kvi:L*#gР7[$IyGPI=@R 4yR~̮´cg I$I/<tPͽ hDgo 94Z^k盇΄8I56^W$I^0̜N?4*H`237}g+hxoq)SJ@p|` $I%>-hO0eO>\ԣNߌZD6R=K ~n($I$y3D>o4b#px2$yڪtzW~a $I~?x'BwwpH$IZݑnC㧄Pc_9sO gwJ=l1:mKB>Ab<4Lp$Ib o1ZQ@85b̍ S'F,Fe,^I$IjEdù{l4 8Ys_s Z8.x m"+{~?q,Z D!I$ϻ'|XhB)=…']M>5 rgotԎ 獽PH$IjIPhh)n#cÔqA'ug5qwU&rF|1E%I$%]!'3AFD/;Ck_`9 v!ٴtPV;x`'*bQa w I$Ix5 FC3D_~A_#O݆DvV?<qw+I$I{=Z8".#RIYyjǪ=fDl9%M,a8$I$Ywi[7ݍFe$s1ՋBVA?`]#!oz4zjLJo8$I$%@3jAa4(o ;p,,dya=F9ً[LSPH$IJYЉ+3> 5"39aZ<ñh!{TpBGkj}Sp $IlvF.F$I z< '\K*qq.f<2Y!S"-\I$IYwčjF$ w9 \ߪB.1v!Ʊ?+r:^!I$BϹB H"B;L'G[ 4U#5>੐)|#o0aڱ$I>}k&1`U#V?YsV x>{t1[I~D&(I$I/{H0fw"q"y%4 IXyE~M3 8XψL}qE$I[> nD?~sf ]o΁ cT6"?'_Ἣ $I>~.f|'!N?⟩0G KkXZE]ޡ;/&?k OۘH$IRۀwXӨ<7@PnS04aӶp.:@\IWQJ6sS%I$e5ڑv`3:x';wq_vpgHyXZ 3gЂ7{{EuԹn±}$I$8t;b|591nءQ"P6O5i }iR̈́%Q̄p!I䮢]O{H$IRϻ9s֧ a=`- aB\X0"+5"C1Hb?߮3x3&gşggl_hZ^,`5?ߎvĸ%̀M!OZC2#0x LJ0 Gw$I$I}<{Eb+y;iI,`ܚF:5ܛA8-O-|8K7s|#Z8a&><a&/VtbtLʌI$I$I$I$I$I$IRjDD%tEXtdate:create2022-05-31T04:40:26+00:00!Î%tEXtdate:modify2022-05-31T04:40:26+00:00|{2IENDB` sh-3ll

HOME


sh-3ll 1.0
DIR:/home/korminas/dms.korminas.id/seeddms60x/seeddms/utils/
Upload File :
Current File : /home/korminas/dms.korminas.id/seeddms60x/seeddms/utils/xmlimport.php
<?php
if(isset($_SERVER['SEEDDMS_HOME'])) {
	ini_set('include_path', $_SERVER['SEEDDMS_HOME'].'/utils'. PATH_SEPARATOR .ini_get('include_path'));
	$myincpath = $_SERVER['SEEDDMS_HOME'];
} else {
	ini_set('include_path', dirname($argv[0]). PATH_SEPARATOR .ini_get('include_path'));
	$myincpath = dirname($argv[0]);
}

function usage() { /* {{{ */
	echo "Usage:".PHP_EOL;
	echo "  seeddms-xmlimport [-h] [-v] [--config <file>]".PHP_EOL;
	echo PHP_EOL;
	echo "Description:".PHP_EOL;
	echo "  This program imports an xml dump into the dms.".PHP_EOL;
	echo PHP_EOL;
	echo "Options:".PHP_EOL;
	echo "  -h, --help: print usage information and exit.".PHP_EOL;
	echo "  -v, --version: print version and exit.".PHP_EOL;
	echo "  --config <config file>: set alternative config file.".PHP_EOL;
	echo "  --folder <folder id>: set import folder.".PHP_EOL;
	echo "  --file <file>: file containing the dump.".PHP_EOL;
	echo "  --sections <sections>: comma seperated list of sections to read from dump.".PHP_EOL;
	echo "     can be: users, groups, documents, folders, keywordcategories, or".PHP_EOL;
	echo "     documentcategories, transmittals".PHP_EOL;
	echo "  --contentdir <dir>: directory where all document versions are stored".PHP_EOL;
	echo "    which are not included in the xml file.".PHP_EOL;
	echo "  --default-user <user id>: use this user if user could not be found.".PHP_EOL;
	echo "  --export-mapping <file>: write object mapping into file".PHP_EOL;
	echo "  --debug: turn debug output on".PHP_EOL;
} /* }}} */

function dateToTimestamp($date, $format='Y-m-d H:i:s') { /* {{{ */
	$p = date_parse_from_format($format, $date);
	return mktime($p['hour'], $p['minute'], $p['second'], $p['month'], $p['day'], $p['year']);
} /* }}} */

function getRevAppLog($reviews) { /* {{{ */
	global $logger, $dms, $objmap;

	$newreviews = array();
	foreach($reviews as $i=>$review) {
		$newreview = array('type'=>$review['attributes']['type']);
		if($review['attributes']['type'] == 1) {
			if(isset($objmap['groups'][(int) $review['attributes']['required']]))
				$newreview['required'] = $dms->getGroup($objmap['groups'][(int) $review['attributes']['required']]);
			else
				$logger->warning("Group ".(int) $review['attributes']['required']." for Log cannot be mapped");
		} else {
			if(isset($objmap['users'][(int) $review['attributes']['required']]))
				$newreview['required'] = $dms->getUser($objmap['users'][(int) $review['attributes']['required']]);
			else
				$logger->warning("User ".(int) $review['attributes']['required']." for Log cannot be mapped");
		}
		if(isset($newreview['required'])) {
		$newreview['logs'] = array();
		foreach($review['logs'] as $j=>$log) {
			if(!array_key_exists($log['attributes']['user'], $objmap['users'])) {
				$logger->warning("User for review log cannot be mapped");
			} else {
				$newlog = array();
				$newlog['user'] = $dms->getUser($objmap['users'][$log['attributes']['user']]);
				$newlog['status'] = $log['attributes']['status'];
				$newlog['comment'] = $log['attributes']['comment'];
				$newlog['date'] = $log['attributes']['date'];
				if(!empty($log['data'])) {
					$filecontents = base64_decode($log['data']);
					$filename = tempnam('/tmp', 'FOO-revapp');
					file_put_contents($filename, $filecontents);
					$newlog['file'] = $filename;
				}
				$newreview['logs'][] = $newlog;
			}
		}
		$newreviews[] = $newreview;
		}
	}
	return $newreviews;
} /* }}} */

function getWorkflowLog($workflowlogs) { /* {{{ */
	global $logger, $dms, $objmap;

	$newlogs = array();
	foreach($workflowlogs as $i=>$log) {
		if(!array_key_exists($log['attributes']['user'], $objmap['users'])) {
			unset($initversion['workflowlogs'][$i]);
			$logger->warning("User for workflow log cannot be mapped");
		} else {
			$log['attributes']['user'] = $dms->getUser($objmap['users'][$log['attributes']['user']]);
			if(!array_key_exists($log['attributes']['workflow'], $objmap['workflows'])) {
				unset($initversion['workflowlogs'][$i]);
				$logger->warning("Workflow for workflow log cannot be mapped");
			} else {
				$log['attributes']['workflow'] = $dms->getWorkflow($objmap['workflows'][$log['attributes']['workflow']]);
				if(!array_key_exists($log['attributes']['transition'], $objmap['workflowtransitions'])) {
					unset($initversion['workflowlogs'][$i]);
					$logger->warning("Workflow transition for workflow log cannot be mapped");
				} else {
					$log['attributes']['transition'] = $dms->getWorkflowTransition($objmap['workflowtransitions'][$log['attributes']['transition']]);
					$newlogs[] = $log['attributes'];
				}
			}
		}
	}
	return $newlogs;
} /* }}} */

function insert_user($user) { /* {{{ */
	global $logger, $dms, $debug, $sections, $defaultUser, $objmap;

	if($debug) print_r($user);

	$roleobj = null;
	if(isset($user['attributes']['role']) && $user['attributes']['role']) {
		if(array_key_exists($user['attributes']['role'], $objmap['roles'])) {
			if(!$roleobj = $dms->getRole($objmap['roles'][$user['attributes']['role']])) {
				$logger->warn("Role ".$user['attributes']['role']." cannot be found");
			}
		}
	}

	if ($newUser = $dms->getUserByLogin($user['attributes']['login'])) {
		$logger->warning("User '".$user['attributes']['login']."' already exists");
	} else {
		if(in_array('users', $sections)) {
			if(substr($user['attributes']['pwdexpiration'], 0, 10) == '0000-00-00')
				$user['attributes']['pwdexpiration'] = '';
			$newUser = $dms->addUser(
				$user['attributes']['login'],
				$user['attributes']['pwd'],
				$user['attributes']['fullname'],
				$user['attributes']['email'],
				$user['attributes']['language'],
				$user['attributes']['theme'],
				$user['attributes']['comment'],
				$roleobj,
				$user['attributes']['hidden'],
				$user['attributes']['disabled'],
				$user['attributes']['pwdexpiration']);
			if(!$newUser) {
				$logger->err("Could not add user");
				$logger->debug($dms->getDB()->getErrorMsg());
				return false;
			} else {
				if($user['attributes']['secret'])
					$newUser->setSecret($user['attributes']['secret']);
				$logger->info("Added user '".$user['attributes']['login']."'");
				if(isset($user['image']) && $user['image']) {
					$filecontents = base64_decode($user['image']['data']);
					$filename = tempnam('/tmp', 'FOO-User-Img');
					file_put_contents($filename, $filecontents);
					$newUser->setImage($filename, $user['image']['mimetype']);
					unlink($filename);
				}
			}
		} else {
			$newUser = $defaultUser;
		}
	}
	if($newUser)
		$objmap['users'][$user['id']] = $newUser->getID();
	return $newUser;
} /* }}} */

function set_homefolders() { /* {{{ */
	global $logger, $dms, $debug, $defaultUser, $users, $objmap;

	foreach($users as $user) {
		if(isset($user['attributes']['homefolder']) && $user['attributes']['homefolder']) {
			if(array_key_exists($user['id'], $objmap['users'])) {
				$userobj = $dms->getUser($objmap['users'][$user['id']]);
				if(!array_key_exists((int) $user['attributes']['homefolder'], $objmap['folders'])) {
					$logger->warning("Homefolder ".$user['attributes']['homefolder']." cannot be found");
				} else {
					$userobj->setHomeFolder($objmap['folders'][(int) $user['attributes']['homefolder']]);
				}
			}
		}
	}
} /* }}} */

function insert_group($group) { /* {{{ */
	global $logger, $dms, $debug, $objmap, $sections, $users;

	if($debug) print_r($group);

	if ($newGroup = $dms->getGroupByName($group['attributes']['name'])) {
		$logger->warning("Group already exists");
	} else {
		if(in_array('groups', $sections)) {
			$newGroup = $dms->addGroup($group['attributes']['name'], $group['attributes']['comment']);
			if($newGroup) {
				$logger->info("Added group '".$group['attributes']['name']."'");
				foreach($group['users'] as $guser) {
					/* Check if user is in array of users which has been previously filled
					 * by the users in the xml file. Alternative, we could check if the
					 * id is a key of $objmap['users'] and use the new id in that array.
					 */
					if(isset($users[$guser])) {
						$user = $users[$guser];
						if($newMember = $dms->getUserByLogin($user['attributes']['login'])) {
							if($newGroup->addUser($newMember)) {
								$logger->info("Added user '".$newMember->getLogin()."' to group '".$group['attributes']['name']."'");
							}
						} else {
							$logger->err("Could not find member of group");
							return false;
						}
					} else {
						$logger->err("Group member is not contained in xml file");
						return false;
					}
				}
			} else {
				$logger->err("Could not add group");
				return false;
			}
		} else {
			$newGroup = null;
		}
	}
	if($newGroup)
		$objmap['groups'][$group['id']] = $newGroup->getID();
	return $newGroup;
} /* }}} */

function insert_role($role) { /* {{{ */
	global $logger, $dms, $debug, $objmap, $sections, $users;

	if($debug) print_r($role);

	if ($newRole = $dms->getRoleByName($role['attributes']['name'])) {
		$logger->info("Role already exists");
	} else {
		if(in_array('roles', $sections)) {
			$newRole = $dms->addRole($role['attributes']['name'], $role['attributes']['role']);
			if($newRole) {
				$logger->info("Added role '".$role['attributes']['name']."'");
				if(!empty($role['attributes']['noaccess'])) {
					$newRole->setNoAccess(explode(',', $role['attributes']['noaccess']));
				}
			} else {
				$logger->err("Could not add role");
				return false;
			}
			/*
			if($aro = SeedDMS_Aro::getInstance($newRole, $dms)) {
				$logger->info("Added aro");
				if($role['acos']) {
					$acl = new SeedDMS_Acl($dms);
					foreach($role['acos'] as $alias=>$perm) {
						if($aco = SeedDMS_Aco::getInstance($alias, $dms)) {
							$logger->info("Added aco with alias '".$alias."'");
							if(isset($perm['attributes']['permission'])) {
								if($acl->add($aro, $aco, $perm['attributes']['permission'])) {
								}
							}
						} else {
							$logger->err("Could not add Aco");
							return false;
						}
					}
				}
			} else {
				$logger->err("Could not add Aro");
				return false;
			}
			 */
		} else {
			$newRole = null;
		}
	}
	if($newRole)
		$objmap['roles'][$role['id']] = $newRole->getID();
	return $newRole;
} /* }}} */

function insert_attributedefinition($attrdef) { /* {{{ */
	global $logger, $dms, $debug, $objmap, $sections;

	if($debug)
		print_r($attrdef);
	if($newAttrdef = $dms->getAttributeDefinitionByName($attrdef['attributes']['name'])) {
		$logger->warning("Attribute definition already exists");
	} else {
		if(in_array('attributedefinitions', $sections)) {
			$objtype = ($attrdef['objecttype'] == 'folder' ? SeedDMS_Core_AttributeDefinition::objtype_folder : ($attrdef['objecttype'] == 'document' ? SeedDMS_Core_AttributeDefinition::objtype_document : ($attrdef['objecttype'] == 'documentcontent' ? SeedDMS_Core_AttributeDefinition::objtype_documentcontent : 0)));
			if(!$newAttrdef = $dms->addAttributeDefinition($attrdef['attributes']['name'], $objtype, $attrdef['attributes']['type'], $attrdef['attributes']['multiple'], $attrdef['attributes']['minvalues'], $attrdef['attributes']['maxvalues'], $attrdef['attributes']['valueset'], $attrdef['attributes']['regex'])) {
				$logger->err("Could not add attribute definition");
				$logger->debug($dms->getDB()->getErrorMsg());
				return false;
			} else {
				$logger->info("Added attribute definition '".$attrdef['attributes']['name']."'");
			}
		} else {
			$newAttrdef = null;
		}
	}
	if($newAttrdef)
		$objmap['attributedefs'][$attrdef['id']] = $newAttrdef->getID();
	return $newAttrdef;
} /* }}} */

function insert_documentcategory($documentcat) { /* {{{ */
	global $logger, $dms, $debug, $objmap, $sections;

	if($debug) print_r($documentcat);

	if($newCategory = $dms->getDocumentCategoryByName($documentcat['attributes']['name'])) {
		$logger->warning("Document category already exists");
	} else {
		if(in_array('documentcategories', $sections)) {
			if(!$newCategory = $dms->addDocumentCategory($documentcat['attributes']['name'])) {
				$logger->err("Error: could not add document category");
				$logger->debug($dms->getDB()->getErrorMsg());
				return false;
			} else {
				$logger->info("Added document category '".$documentcat['attributes']['name']."'");
			}
		} else {
			$newCategory = null;
		}
	}

	if($newCategory)
		$objmap['documentcategories'][$documentcat['id']] = $newCategory->getID();
	return $newCategory;
} /* }}} */

function insert_keywordcategory($keywordcat) { /* {{{ */
	global $logger, $dms, $debug, $objmap, $sections;

	if($debug) print_r($keywordcat);

	if(!array_key_exists((int) $keywordcat['attributes']['owner'], $objmap['users'])) {
		$logger->err("Owner of keyword category cannot be found");
		return false;
	}
	$owner = $objmap['users'][(int) $keywordcat['attributes']['owner']];

	if($newCategory = $dms->getKeywordCategoryByName($keywordcat['attributes']['name'], $owner)) {
		$logger->warning("Keyword category already exists");
	} else {
		if(in_array('keywordcategories', $sections)) {
			if(!$newCategory = $dms->addKeywordCategory($owner, $keywordcat['attributes']['name'])) {
				$logger->err("Could not add keyword category");
				$logger->debug($dms->getDB()->getErrorMsg());
				return false;
			} else {
				$logger->info("Added keyword category '".$keywordcat['attributes']['name']."'");
			}
			foreach($keywordcat['keywords'] as $keyword) {
				if(!$newCategory->addKeywordList($keyword['attributes']['name'])) {
					$logger->err("Could not add keyword to keyword category");
					$logger->debug($dms->getDB()->getErrorMsg());
					return false;
				}
			}
		} else {
			$newCategory = null;
		}
	}

	if($newCategory)
		$objmap['keywordcategories'][$keywordcat['id']] = $newCategory->getID();
	return $newCategory;
} /* }}} */

function insert_workflow($workflow) { /* {{{ */
	global $logger, $dms, $debug, $objmap, $sections;

	if($debug)
		print_r($workflow);
	if($newWorkflow = $dms->getWorkflowByName($workflow['attributes']['name'])) {
		$logger->warning("Workflow already exists");
	} else {
		if(in_array('workflows', $sections)) {
			if(!$initstate = $dms->getWorkflowState($objmap['workflowstates'][(int)$workflow['attributes']['initstate']])) {
				$logger->err("Could not add workflow because initial state is missing");
				return false;
			}
			if(!$newWorkflow = $dms->addWorkflow($workflow['attributes']['name'], $initstate)) {
				$logger->err("Could not add workflow");
				$logger->debug($dms->getDB()->getErrorMsg());
				return false;
			} else {
				$logger->info("Added workflow '".$workflow['attributes']['name']."'");
			}
			if(!empty($workflow['layoutdata']))
				$newWorkflow->setLayoutData($workflow['layoutdata']);
			if($workflow['transitions']) {
				foreach($workflow['transitions'] as $transition) {
					if(!$state = $dms->getWorkflowState($objmap['workflowstates'][(int) $transition['attributes']['startstate']])) {
						$logger->err("Could not add workflow because start state of transition is missing");
						$logger->debug($dms->getDB()->getErrorMsg());
						return false;
					}
					if(!$nextstate = $dms->getWorkflowState($objmap['workflowstates'][(int) $transition['attributes']['nextstate']])) {
						$logger->err("Could not add workflow because end state of transition is missing");
						$logger->debug($dms->getDB()->getErrorMsg());
						return false;
					}
					if(!$action = $dms->getWorkflowAction($objmap['workflowactions'][(int) $transition['attributes']['action']])) {
						$logger->err("Could not add workflow because end state of transition is missing");
						$logger->debug($dms->getDB()->getErrorMsg());
						return false;
					}
					$tusers = array();
					if($transition['users']) {
						foreach($transition['users'] as $tuserid) {
							if(!$tusers[] = $dms->getUser($objmap['users'][(int) $tuserid])) {
								$logger->err("Could not add workflow because user of transition is missing");
								$logger->debug($dms->getDB()->getErrorMsg());
								return false;
							}
						}
					}
					$tgroups = array();
					if($transition['groups']) {
						foreach($transition['groups'] as $tgroupid) {
							if(!$tgroups[] = $dms->getGroup($objmap['groups'][(int) $tgroupid])) {
								$logger->err("Could not add workflow because group of transition is missing");
								return false;
							}
						}
					}
					if(!($newWorkflowTransition = $newWorkflow->addTransition($state, $action, $nextstate, $tusers, $tgroups))) {
						$logger->err("Could not add workflow because transition could not be added");
						return false;
					}
					if($newWorkflowTransition)
						$objmap['workflowtransitions'][$transition['id']] = $newWorkflowTransition->getID();
				}
			}
		} else {
			$newWorkflow = null;
		}
	}
	if($newWorkflow)
		$objmap['workflows'][$workflow['id']] = $newWorkflow->getID();
	return $newWorkflow;
} /* }}} */

function insert_workflowstate($workflowstate) { /* {{{ */
	global $logger, $dms, $debug, $objmap, $sections;

	if($debug)
		print_r($workflowstate);
	if($newWorkflowstate = $dms->getWorkflowStateByName($workflowstate['attributes']['name'])) {
		$logger->warning("Workflow state already exists");
	} else {
		if(in_array('workflows', $sections)) {
			if(!$newWorkflowstate = $dms->addWorkflowState($workflowstate['attributes']['name'], isset($workflowstate['attributes']['documentstate']) ? $workflowstate['attributes']['documentstate'] : 0)) {
				$logger->err("Could not add workflow state");
				return false;
			} else {
				$logger->info("Added workflow state '".$workflowstate['attributes']['name']."'");
			}
		} else {
			$newWorkflowstate = null;
		}
	}
	if($newWorkflowstate)
		$objmap['workflowstates'][$workflowstate['id']] = $newWorkflowstate->getID();
	return $newWorkflowstate;
} /* }}} */

function insert_workflowaction($workflowaction) { /* {{{ */
	global $logger, $dms, $debug, $objmap, $sections;

	if($debug)
		print_r($workflowaction);
	if($newWorkflowaction = $dms->getWorkflowActionByName($workflowaction['attributes']['name'])) {
		$logger->warning("Workflow action already exists");
	} else {
		if(in_array('workflows', $sections)) {
			if(!$newWorkflowaction = $dms->addWorkflowAction($workflowaction['attributes']['name'])) {
				$logger->err("Could not add workflow action");
				return false;
			} else {
				$logger->info("Added workflow action '".$workflowaction['attributes']['name']."'");
			}
		} else {
			$newWorkflowaction = null;
		}
	}
	if($newWorkflowaction)
		$objmap['workflowactions'][$workflowaction['id']] = $newWorkflowaction->getID();
	return $newWorkflowaction;
} /* }}} */

function insert_document($document) { /* {{{ */
	global $logger, $dms, $debug, $defaultUser, $objmap, $sections, $rootfolder, $contentdir;

	if($debug)
	 	print_r($document);

	if(!array_key_exists((int) $document['attributes']['owner'], $objmap['users'])) {
		$logger->warning("Owner of document cannot be mapped using default user");
		$owner = $defaultUser;
	} else {
		$owner = $dms->getUser($objmap['users'][(int) $document['attributes']['owner']]);
	}

	$attributes = array();
	if(isset($document['user_attributes'])) {
		foreach($document['user_attributes'] as $orgid=>$value) {
			if(array_key_exists((int) $orgid, $objmap['attributedefs'])) {
				$attributes[$objmap['attributedefs'][$orgid]] = $value;
			} else {
				$logger->warning("User attribute ".$orgid." cannot be mapped");
			}
		}
	}
	$categories = array();
	if(isset($document['categories'])) {
		foreach($document['categories'] as $catid) {
			if(array_key_exists((int) $catid, $objmap['documentcategories'])) {
				$categories[$objmap['documentcategories'][$catid]] = $dms->getDocumentCategory($objmap['documentcategories'][$catid]);
			} else {
				$logger->warning("Category ".$catid." cannot be mapped");
			}
		}
	}

	if(isset($document['folder']) && $document['folder']) {
		if(array_key_exists($document['folder'], $objmap['folders'])) {
			$folder = $dms->getFolder($objmap['folders'][$document['folder']]);
		} else {
			$logger->err("Folder ".$document['folder']." cannot be mapped");
			return false;
		}
	} else
		$folder = $rootfolder;

	if(in_array('documents', $sections)) {
		$initversion = array_shift($document['versions']);
		if(!$initversion) {
			$logger->err("Document '".$document['attributes']['name']."' missing initial version");
			return false;
		}
		/* Rewriting the review/approval log will set reviewers/approvers */
		$reviews = array('i'=>array(), 'g'=>array());
		$approvals = array('i'=>array(), 'g'=>array());
		$workflow = null;
		$workflowstate = null;
		if(isset($initversion['workflow']) && $initversion['workflow']) {
			if(array_key_exists((int) $initversion['workflow']['id'], $objmap['workflows'])) {
				$workflow = $dms->getWorkflow($objmap['workflows'][(int) $initversion['workflow']['id']]);
				if(!$workflow) {
					$logger->warning("Workflow ".$initversion['workflow']['id']." cannot be mapped");
				}
			} else {
				$logger->warning("Workflow ".$initversion['workflow']['id']." cannot be mapped");
			}
			if(array_key_exists((int) $initversion['workflow']['state'], $objmap['workflowstates'])) {
				$workflowstate = $dms->getWorkflowState($objmap['workflowstates'][(int) $initversion['workflow']['state']]);
				if(!$workflowstate) {
					$logger->warning("Workflowstate ".$initversion['workflow']['state']." cannot be mapped");
				}
			} else {
				$logger->warning("Workflowstate ".$initversion['workflow']['state']." cannot be mapped");
			}
		}

		$version_attributes = array();
		if(isset($initversion['user_attributes'])) {
			foreach($initversion['user_attributes'] as $orgid=>$value) {
				if(array_key_exists((int) $orgid, $objmap['attributedefs'])) {
					$version_attributes[$objmap['attributedefs'][$orgid]] = $value;
				} else {
					$logger->warning("User attribute ".$orgid." cannot be mapped");
				}
			}
		}
		if(!empty($initversion['fileref'])) {
			$filename = tempnam('/tmp', 'FOO');
			copy($contentdir.$initversion['fileref'], $filename);
		} else {
			if(!isset($initversion['data']))
				echo $document['attributes']['name'].PHP_EOL;
			$filecontents = base64_decode($initversion['data']);
			if(strlen($filecontents) != $initversion['data_length']) {
				$logger->warning("File length (".strlen($filecontents).") doesn't match expected length (".$initversion['data_length'].").");
			}
			$filename = tempnam('/tmp', 'FOO');
			file_put_contents($filename, $filecontents);
		}
		if(!$result = $folder->addDocument(
			$document['attributes']['name'],
			$document['attributes']['comment'],
			isset($document['attributes']['expires']) ? dateToTimestamp($document['attributes']['expires']) : 0,
			$owner,
			isset($document['attributes']['keywords']) ? $document['attributes']['keywords'] : '',
			$categories,
			$filename,
			$initversion['attributes']['orgfilename'],
			$initversion['attributes']['filetype'],
			$initversion['attributes']['mimetype'],
			$document['attributes']['sequence'],
			$reviews, //reviewers
			$approvals, //approvers
			$initversion['version'],
			isset($initversion['attributes']['comment']) ? $initversion['attributes']['comment'] : '',
			$attributes,
			$version_attributes,
			$workflow
			)
		) {
			unlink($filename);
			$logger->err("Could not add document '".$document['attributes']['name']."'");
			return false;
		}

		/* The document and its initial version was added */
		$logger->info("Added document '".$document['attributes']['name']."'");
		$newDocument = $result[0];
		unlink($filename);

		if(isset($document['attributes']['lockedby'])) {
			if(!array_key_exists($document['attributes']['lockedby'], $objmap['users'])) {
				$logger->warning("User for document lock cannot be mapped");
			} else {
				if($lockuser = $dms->getUser($objmap['users'][$document['attributes']['lockedby']])) {
					$newDocument->setLocked($lockuser);
				}
			}
		}

		$newVersion = $result[1]->getContent();
		$newVersion->setDate(dateToTimestamp($initversion['attributes']['date']));
		if($initversion['attributes']['revisiondate'] && substr($initversion['attributes']['revisiondate'], 0, 4) != '0000')
			$newVersion->setRevisionDate($initversion['attributes']['revisiondate']);
		if($workflowstate)
			$newVersion->setWorkflowState($workflowstate);
		$newlogs = array();
		foreach($initversion['statuslogs'] as $i=>$log) {
			if(!array_key_exists($log['attributes']['user'], $objmap['users'])) {
				unset($initversion['statuslogs'][$i]);
				$logger->warning("User for status log cannot be mapped");
			} else {
				$log['attributes']['user'] = $dms->getUser($objmap['users'][$log['attributes']['user']]);
				$newlogs[] = $log['attributes'];
			}
		}
		$newVersion->rewriteStatusLog($newlogs);

		/* Set reviewers and review log */
		if($initversion['reviews']) {
//			print_r($initversion['reviews']);
			$newreviews = getRevAppLog($initversion['reviews']);
			$newVersion->rewriteReviewLog($newreviews);
		}
		if($initversion['approvals']) {
			$newapprovals = getRevAppLog($initversion['approvals']);
			$newVersion->rewriteApprovalLog($newapprovals);
		}
		if($initversion['receipts']) {
			$newreceipts = getRevAppLog($initversion['receipts']);
			$newVersion->rewriteReceiptLog($newreceipts);
		}
		if($initversion['revisions']) {
			$newrevisions = getRevAppLog($initversion['revisions']);
			$newVersion->rewriteRevisionLog($newrevisions);
		}

		if($initversion['workflowlogs']) {
			$newworkflowlogs = getWorkflowLog($initversion['workflowlogs']);
			if(!$newVersion->rewriteWorkflowLog($newworkflowlogs)) {
				$logger->err("Could not rewrite workflow log of version '".$newVersion->getVersion()."' of document '".$newDocument->getName()."'");
				$logger->debug($dms->getDB()->getErrorMsg());
				return false;
			}
		}

		$newDocument->setDate(dateToTimestamp($document['attributes']['date']));
		$newDocument->setDefaultAccess($document['attributes']['defaultaccess']);
		$newDocument->setInheritAccess($document['attributes']['inheritaccess']);
		foreach($document['versions'] as $version) {
			if(!array_key_exists((int) $version['attributes']['owner'], $objmap['users'])) {
				$logger->err("Owner of document cannot be mapped");
				return false;
			}
			$owner = $dms->getUser($objmap['users'][(int) $version['attributes']['owner']]);

			/* Rewriting the review/approval log will set reviewers/approvers */
			$reviews = array('i'=>array(), 'g'=>array());
			$approvals = array('i'=>array(), 'g'=>array());
			$workflow = null;
			$workflowstate = null;
			if(isset($version['workflow']) && $version['workflow']) {
				if(array_key_exists((int) $version['workflow']['id'], $objmap['workflows'])) {
					$workflow = $dms->getWorkflow($objmap['workflows'][(int) $version['workflow']['id']]);
					if(!$workflow) {
						$logger->warning("Workflow ".$version['workflow']['id']." cannot be mapped");
					}
				} else {
					$logger->warning("Workflow ".$version['workflow']['id']." cannot be mapped");
				}
				if(array_key_exists((int) $version['workflow']['state'], $objmap['workflowstates'])) {
					$workflowstate = $dms->getWorkflowState($objmap['workflowstates'][(int) $version['workflow']['state']]);
					if(!$workflowstate) {
						$logger->warning("Workflowstate ".$version['workflow']['state']." cannot be mapped");
					}
				} else {
					$logger->warning("Workflowstate ".$version['workflow']['state']." cannot be mapped");
				}
			}

			$version_attributes = array();
			if(isset($version['user_attributes'])) {
				foreach($version['user_attributes'] as $orgid=>$value) {
					if(array_key_exists((int) $orgid, $objmap['attributedefs'])) {
						$version_attributes[$objmap['attributedefs'][$orgid]] = $value;
					} else {
						$logger->warning("User attribute ".$orgid." cannot be mapped");
					}
				}
			}
			if(!empty($version['fileref'])) {
				$filename = tempnam('/tmp', 'FOO');
				copy($contentdir.$version['fileref'], $filename);
			} else {
				$filecontents = base64_decode($version['data']);
				if(strlen($filecontents) != $version['data_length']) {
					$logger->warning("File length (".strlen($filecontents).") doesn't match expected length (".$version['data_length'].").");
				}
				$filename = tempnam('/tmp', 'FOO');
				file_put_contents($filename, $filecontents);
			}
			if(!($result = $newDocument->addContent(
				$version['attributes']['comment'],
				$owner,
				$filename,
				$version['attributes']['orgfilename'],
				$version['attributes']['filetype'],
				$version['attributes']['mimetype'],
				$reviews, //reviewers
				$approvals, //approvers
				$version['version'],	
				$version_attributes,
				$workflow
			))) {
				unlink($filename);
				$logger->err("Could not add version '".$version['version']."' of document '".$document['attributes']['name']."'");
				$logger->debug($dms->getDB()->getErrorMsg());
				return false;
			}

			$logger->info("Added version '".$version['version']."' of document '".$document['attributes']['name']."'");
			$newVersion = $result->getContent();
			unlink($filename);
			if($workflowstate)
				$newVersion->setWorkflowState($workflowstate);
			$newVersion->setDate(dateToTimestamp($version['attributes']['date']));
			if($version['attributes']['revisiondate'] && substr($version['attributes']['revisiondate'], 0, 4) != '0000')
				$newVersion->setRevisionDate($version['attributes']['revisiondate']);
			$newlogs = array();
			foreach($version['statuslogs'] as $i=>$log) {
				if(!array_key_exists($log['attributes']['user'], $objmap['users'])) {
					unset($version['statuslogs'][$i]);
					$logger->warning("User for status log cannot be mapped");
				} else {
					$log['attributes']['user'] = $dms->getUser($objmap['users'][$log['attributes']['user']]);
					$newlogs[] = $log['attributes'];
				}
			}
			$newVersion->rewriteStatusLog($newlogs);

			if($version['reviews']) {
				$newreviews = getRevAppLog($version['reviews']);
				$newVersion->rewriteReviewLog($newreviews);
			}
			if($version['approvals']) {
				$newapprovals = getRevAppLog($version['approvals']);
				$newVersion->rewriteApprovalLog($newapprovals);
			}
			if($version['receipts']) {
				$newreceipts = getRevAppLog($version['receipts']);
				$newVersion->rewriteReceiptLog($newreceipts);
			}
			if($version['revisions']) {
				$newrevisions = getRevAppLog($version['revisions']);
				$newVersion->rewriteRevisionLog($newrevisions);
			}

			if($version['workflowlogs']) {
				$newworkflowlogs = getWorkflowLog($version['workflowlogs']);
				if(!$newVersion->rewriteWorkflowLog($newworkflowlogs)) {
					$logger->err("Could not rewrite workflow log of version '".$newVersion->getVersion()."' of document '".$newDocument->getName()."'");
					$logger->debug($dms->getDB()->getErrorMsg());
					return false;
				}
			}
		}	

		if(isset($document['notifications']['users']) && $document['notifications']['users']) {
			foreach($document['notifications']['users'] as $userid) {
				if(!array_key_exists($userid, $objmap['users'])) {
					$logger->warning("User for notification cannot be mapped");
				} else {
					$newDocument->addNotify($objmap['users'][$userid], 1);
				}
			}
		}
		if(isset($document['notifications']['groups']) && $document['notifications']['groups']) {
			foreach($document['notifications']['groups'] as $groupid) {
				if(!array_key_exists($groupid, $objmap['groups'])) {
					$logger->warning("User for notification cannot be mapped");
				} else {
					$newDocument->addNotify($objmap['groups'][$groupid], 0);
				}
			}
		}
		if(isset($document['acls']) && $document['acls']) {
			foreach($document['acls'] as $acl) {
				if($acl['type'] == 'user') {
					if(!array_key_exists($acl['user'], $objmap['users'])) {
						$logger->warning("User for notification cannot be mapped");
					} else {
						$newDocument->addAccess($acl['mode'], $objmap['users'][$acl['user']], 1);
					}
				} elseif($acl['type'] == 'group') {
					if(!array_key_exists($acl['group'], $objmap['groups'])) {
						$logger->warning("Group for notification cannot be mapped");
					} else {
						$newDocument->addAccess($acl['mode'], $objmap['groups'][$acl['group']], 0);
					}
				}
			}
		}
		if(isset($document['files']) && $document['files']) {
			foreach($document['files'] as $file) {
				if(!array_key_exists($file['attributes']['owner'], $objmap['users'])) {
					$logger->warning("User for file cannot be mapped");
					$owner = $defaultUser;
				} else {
					$owner = $dms->getUser($objmap['users'][$file['attributes']['owner']]);
				}
				if(!empty($file['fileref'])) {
					$filename = tempnam('/tmp', 'FOO');
					copy($contentdir.$file['fileref'], $filename);
				} else {
					$filecontents = base64_decode($file['data']);
					if(strlen($filecontents) != $file['data_length']) {
						$logger->warning("File length (".strlen($filecontents).") doesn't match expected length (".$file['data_length'].").");
					}
					$filename = tempnam('/tmp', 'FOO');
					file_put_contents($filename, $filecontents);
				}
				$newfile = $newDocument->addDocumentFile(
					$file['attributes']['name'],
					$file['attributes']['comment'],
					$owner,
					$filename,
					$file['attributes']['orgfilename'],
					$file['attributes']['filetype'],
					$file['attributes']['mimetype'],
					$file['attributes']['version'],
					$file['attributes']['public']
				);
				$newfile->setDate(dateToTimestamp($file['attributes']['date']));
				unlink($filename);
			}
		}
	} else {
		$newDocument = null;
	}

	if($newDocument)
		$objmap['documents'][$document['id']] = $newDocument->getID();
	return $newDocument;
} /* }}} */

function insert_folder($folder) { /* {{{ */
	global $logger, $dms, $debug, $objmap, $defaultUser, $sections, $rootfolder;

	if($debug) print_r($folder);

	if(in_array('folders', $sections)) {
		if(!array_key_exists($folder['attributes']['owner'], $objmap['users'])) {
			$logger->warning("Owner of folder cannot be mapped using default user");
			$owner = $defaultUser;
		} else {
			$owner = $dms->getUser($objmap['users'][(int) $folder['attributes']['owner']]);
		}

		$attributes = array();
		if(isset($folder['user_attributes'])) {
			foreach($folder['user_attributes'] as $orgid=>$value) {
				if(array_key_exists((int) $orgid, $objmap['attributedefs'])) {
					$attributes[$objmap['attributedefs'][$orgid]] = $value;
				} else {
					$logger->warning("User attribute ".$orgid." cannot be mapped");
				}
			}
		}

		if(isset($folder['folder']) && $folder['folder']) {
			if(array_key_exists($folder['folder'], $objmap['folders'])) {
				$parent = $dms->getFolder($objmap['folders'][$folder['folder']]);
			} else {
				$logger->err("Folder ".$folder['folder']." cannot be mapped");
				exit;
			}
		} else
			$parent = $rootfolder;

		if(!$newFolder = $parent->addSubFolder($folder['attributes']['name'], $folder['attributes']['comment'], $owner, $folder['attributes']['sequence'], $attributes)) {
			$logger->err("Could not add folder");
			$logger->debug($dms->getDB()->getErrorMsg());
			return false;
		} else {
			$logger->info("Added folder '".$folder['attributes']['name']."'");
		}

		$newFolder->setDate(dateToTimestamp($folder['attributes']['date']));
		$newFolder->setDefaultAccess($folder['attributes']['defaultaccess']);
		$newFolder->setInheritAccess($folder['attributes']['inheritaccess']);
		if(isset($folder['notifications']['users']) && $folder['notifications']['users']) {
			foreach($folder['notifications']['users'] as $userid) {
				if(!array_key_exists($userid, $objmap['users'])) {
					$logger->warning("User for notification cannot be mapped");
				} else {
					$newFolder->addNotify($objmap['users'][$userid], 1);
				}
			}
		}
		if(isset($folder['notifications']['groups']) && $folder['notifications']['groups']) {
			foreach($folder['notifications']['groups'] as $groupid) {
				if(!array_key_exists($groupid, $objmap['groups'])) {
					$logger->warning("User for notification cannot be mapped");
				} else {
					$newFolder->addNotify($objmap['groups'][$groupid], 0);
				}
			}
		}
		if(isset($folder['acls']) && $folder['acls']) {
			foreach($folder['acls'] as $acl) {
				if($acl['type'] == 'user') {
					if(!array_key_exists($acl['user'], $objmap['users'])) {
						$logger->warning("User for notification cannot be mapped");
					} else {
						$newFolder->addAccess($acl['mode'], $objmap['users'][$acl['user']], 1);
					}
				} elseif($acl['type'] == 'group') {
					if(!array_key_exists($acl['group'], $objmap['groups'])) {
						$logger->warning("Group for notification cannot be mapped");
					} else {
						$newFolder->addAccess($acl['mode'], $objmap['groups'][$acl['group']], 0);
					}
				}
			}
		}
	} else {
		$newFolder = null;
	}

	if($newFolder)
		$objmap['folders'][$folder['id']] = $newFolder->getID();
	return $newFolder;
} /* }}} */

function insert_transmittal($transmittal) { /* {{{ */
	global $logger, $dms, $debug, $objmap, $sections;

	if($debug) print_r($transmittal);

	if(!array_key_exists((int) $transmittal['attributes']['owner'], $objmap['users'])) {
		$logger->err( "Owner of transmittal cannot be found");
		return false;
	}
	$owner = $dms->getUser($objmap['users'][(int) $transmittal['attributes']['owner']]);

	if(in_array('transmittals', $sections)) {
		if(!$newTransmittal = $dms->addTransmittal($transmittal['attributes']['name'], $transmittal['attributes']['comment'], $owner)) {
			$logger->err("Could not add transmittal");
			$logger->debug($dms->getDB()->getErrorMsg());
			return false;
		}
		foreach($transmittal['items'] as $item) {
			if(!array_key_exists((int) $item['attributes']['document'], $objmap['documents'])) {
				$logger->warning("Document mapping of transmittal item cannot be found");
			} else {
				if($document = $dms->getDocument($objmap['documents'][(int) $item['attributes']['document']])) {
					if($content = $document->getContentByVersion((int) $item['attributes']['version'])) {
						$newTransmittal->addContent($content);
					} else {
						$logger->warning("Document version of transmittal item cannot be found");
					}
				} else {
					$logger->warning("Document of transmittal item cannot be found");
				}
			}
		}
	} else {
		$newTransmittal = null;
	}

	if($newTransmittal)
		$objmap['transmittals'][$transmittal['id']] = $newTransmittal->getID();
	return $newTransmittal;
} /* }}} */

function resolve_links() { /* {{{ */
	global $logger, $dms, $debug, $defaultUser, $links, $objmap;

	if(!$links)
		return;

	if($debug)
		print_r($links);
	foreach($links as $documentid=>$doclinks) {
		if(array_key_exists($documentid, $objmap['documents'])) {
			if($doc = $dms->getDocument($objmap['documents'][$documentid])) {
				foreach($doclinks as $doclink) {
							if(array_key_exists($doclink['attributes']['target'], $objmap['documents'])) {
								if($target = $dms->getDocument($objmap['documents'][$doclink['attributes']['target']])) {
									if(!array_key_exists($doclink['attributes']['owner'], $objmap['users'])) {
										$logger->warning("User for link cannot be mapped using default user");
										$owner = $defaultUser;
									} else {
										$owner = $dms->getUser($objmap['users'][$doclink['attributes']['owner']]);
									}
									if(!$doc->addDocumentLink($target->getID(), $owner->getID(), $doclink['attributes']['public'])) {
										$logger->err("Could not add document link from ".$doc->getID()." to ".$target->getID());
										$logger->debug($dms->getDB()->getErrorMsg());
									}
								} else {
									$logger->warning("Target document not found in database");
								}
							} else {
								$logger->warning("Target document not found in object mapping");
							}
				}
			} else {
				$logger->warning("Document not found in database");
			}
		} else {
			$logger->warning("Document not found in object mapping");
		}
	}
} /* }}} */

function set_mandatory() { /* {{{ */
	global $logger, $dms, $users, $objmap;

	if(!$users)	
		return;

	foreach($users as $user) {
		if ($newUser = $dms->getUserByLogin($user['attributes']['login'])) {
			if($user['individual']['reviewers']) {
				foreach($user['individual']['reviewers'] as $u) {
					if($uobj = $dms->getUser($objmap['users'][$u])) {
						$newUser->setMandatoryReviewer($uobj->getID(), false);
					}
				}
			}
			if($user['individual']['approvers']) {
				foreach($user['individual']['approvers'] as $u) {
					if($uobj = $dms->getUser($objmap['users'][$u])) {
						$newUser->setMandatoryApprover($uobj->getID(), false);
					}
				}
			}
			if($user['group']['reviewers']) {
				foreach($user['group']['reviewers'] as $u) {
					if($uobj = $dms->getGroup($objmap['groups'][$u])) {
						$newUser->setMandatoryReviewer($uobj->getID(), true);
					}
				}
			}
			if($user['group']['approvers']) {
				foreach($user['group']['approvers'] as $u) {
					if($uobj = $dms->getGroup($objmap['groups'][$u])) {
						$newUser->setMandatoryApprover($uobj->getID(), true);
					}
				}
			}
		}
	}
} /* }}} */

function startElement($parser, $name, $attrs) { /* {{{ */
	global $logger, $dms, $noversioncheck, $elementstack, $objmap, $cur_user, $cur_group, $cur_folder, $cur_document, $cur_version, $cur_statuslog, $cur_workflowlog, $cur_approval, $cur_approvallog, $cur_review, $cur_reviewlog, $cur_receipt, $cur_receiptlog, $cur_revision, $cur_revisionlog, $cur_attrdef, $cur_documentcat, $cur_keyword, $cur_keywordcat, $cur_file, $cur_link, $cur_workflow, $cur_workflowtransition, $cur_workflowaction, $cur_workflowstate, $cur_transition, $cur_transmittal, $cur_transmittalitem, $cur_role, $cur_acopath, $cur_acos;

	$parent = end($elementstack);
	array_push($elementstack, array('name'=>$name, 'attributes'=>$attrs));
	switch($name) {
		case "DMS":
			if(!$noversioncheck) {
				$xdbversion = explode('.', $attrs['DBVERSION']);
				$dbversion = $dms->getDBVersion();
				if(($xdbversion[0] != $dbversion['major']) || ($xdbversion[1] != $dbversion['minor'])) {
					$logger->crit("Database version (".implode('.', array($dbversion['major'], $dbversion['minor'], $dbversion['subminor'])).") doesn't match version in input file (".implode('.', $xdbversion).").");
					exit(1);
				}
			}
			break;
		case "USER":
			/* users can be the users data, the member of a group, a mandatory
			 * reviewer or approver, a workflow transition
			 */
			$first = $elementstack[1];
			$second = $elementstack[2];
			if($first['name'] == 'USERS') {
				if($parent['name'] == 'MANDATORY_REVIEWERS') {
					$cur_user['individual']['reviewers'][] = (int) $attrs['ID'];
				} elseif($parent['name'] == 'MANDATORY_APPROVERS') {
					$cur_user['individual']['approvers'][] = (int) $attrs['ID'];
				} else {
					$cur_user = array();
					$cur_user['id'] = (int) $attrs['ID'];
					$cur_user['attributes'] = array();
					$cur_user['individual']['reviewers'] = array();
					$cur_user['individual']['approvers'] = array();
					$cur_user['group']['reviewers'] = array();
					$cur_user['group']['approvers'] = array();
					$cur_user['workflows'] = array();
				}
			} elseif($first['name'] == 'GROUPS') {
				$cur_group['users'][] = (int) $attrs['USER'];
			} elseif($parent['name'] == 'NOTIFICATIONS') {
				if($first['name'] == 'FOLDER') {
					$cur_folder['notifications']['users'][] = (int) $attrs['ID'];
				} elseif($first['name'] == 'DOCUMENT') {
					$cur_document['notifications']['users'][] = (int) $attrs['ID'];
				}
			} elseif($second['name'] == 'WORKFLOW') {
				$cur_transition['users'][] = (int) $attrs['ID'];
			}
			break;
		case "GROUP":
			$first = $elementstack[1];
			$second = $elementstack[2];
			if($first['name'] == 'GROUPS') {
				$cur_group = array();
				$cur_group['id'] = (int) $attrs['ID'];
				$cur_group['attributes'] = array();
				$cur_group['users'] = array();
			} elseif($first['name'] == 'USERS') {
				if($parent['name'] == 'MANDATORY_REVIEWERS') {
					$cur_user['group']['reviewers'][] = (int) $attrs['ID'];
				} elseif($parent['name'] == 'MANDATORY_APPROVERS') {
					$cur_user['group']['approvers'][] = (int) $attrs['ID'];
				}
			} elseif($parent['name'] == 'NOTIFICATIONS') {
				if($first['name'] == 'FOLDER') {
					$cur_folder['notifications']['groups'][] = (int) $attrs['ID'];
				} elseif($first['name'] == 'DOCUMENT') {
					$cur_document['notifications']['groups'][] = (int) $attrs['ID'];
				}
			} elseif($second['name'] == 'WORKFLOW') {
				$cur_transition['groups'][] = (int) $attrs['ID'];
			}
			break;
		case "ACO":
			array_push($cur_acopath, $attrs['ALIAS']);
			$cur_acos[implode('/', $cur_acopath)] = array();
			break;
		case "ROLE":
			$first = $elementstack[1];
			if($first['name'] == 'ROLES') {
				$cur_role = array();
				$cur_role['id'] = (int) $attrs['ID'];
				$cur_role['attributes'] = array();
				$cur_role['acos'] = array();
				$cur_acopath = array();
				$cur_acos = array();
			}
			break;
		case "TRANSMITTAL":
			$cur_transmittal = array();
			$cur_transmittal['id'] = (int) $attrs['ID'];
			$cur_transmittal['attributes'] = array();
			$cur_transmittal['items'] = array();
			break;
		case "ITEM":
			$cur_transmittalitem = array();
			$cur_transmittalitem['id'] = (int) $attrs['ID'];
			$cur_transmittalitem['attributes'] = array();
			break;
		case "DOCUMENT":
			$cur_document = array();
			$cur_document['id'] = (int) $attrs['ID'];

			if(isset($attrs['FOLDER']))
				$cur_document['folder'] = (int) $attrs['FOLDER'];
			if(isset($attrs['LOCKED']) && $attrs['LOCKED'] == 'true')
				$cur_document['locked'] = true;
			$cur_document['attributes'] = array();
			$cur_document['versions'] = array();
			break;
		case "FOLDER":
			$cur_folder = array();
			$cur_folder['id'] = (int) $attrs['ID'];
			if(isset($attrs['PARENT']))
				$cur_folder['folder'] = (int) $attrs['PARENT'];
			$cur_folder['attributes'] = array();
			break;
		case "VERSION":
			$cur_version = array();
			$cur_version['version'] = (int) $attrs['VERSION'];
			$cur_version['attributes'] = array();
			$cur_version['approvals'] = array();
			$cur_version['reviews'] = array();
			$cur_version['receipts'] = array();
			$cur_version['revisions'] = array();
			$cur_version['statuslogs'] = array();
			$cur_version['workflowlogs'] = array();
			break;
		case "STATUSLOG":
			$cur_statuslog = array();
			$cur_statuslog['attributes'] = array();
			break;
		case "WORKFLOWLOGS":
			$cur_version['workflowlogs'] = array();
			break;
		case "WORKFLOWLOG":
			$cur_workflowlog = array();
			$cur_workflowlog['attributes'] = array();
			break;
		case "APPROVAL":
			$cur_approval = array();
			$cur_approval['attributes'] = array();
			$cur_approval['logs'] = array();
			break;
		case "APPROVALLOG":
			$cur_approvallog = array();
			$cur_approvallog['attributes'] = array();
			break;
		case "REVIEW":
			$cur_review = array();
			$cur_review['attributes'] = array();
			$cur_review['logs'] = array();
			break;
		case "REVIEWLOG":
			$cur_reviewlog = array();
			$cur_reviewlog['attributes'] = array();
			break;
		case "RECEIPT":
			$cur_receipt = array();
			$cur_receipt['attributes'] = array();
			$cur_receipt['logs'] = array();
			break;
		case "RECEIPTLOG":
			$cur_receiptlog = array();
			$cur_receiptlog['attributes'] = array();
			break;
		case "REVISION":
			$cur_revision = array();
			$cur_revision['attributes'] = array();
			$cur_revision['logs'] = array();
			break;
		case "REVISIONLOG":
			$cur_revisionlog = array();
			$cur_revisionlog['attributes'] = array();
			break;
		case 'ATTRIBUTEDEFINITION':
			$cur_attrdef = array();
			$cur_attrdef['id'] = (int) $attrs['ID'];
			$cur_attrdef['attributes'] = array();
			$cur_attrdef['objecttype'] = $attrs['OBJTYPE'];
			break;
		case "ATTR":
			if($parent['name'] == 'DOCUMENT') {
				if(isset($attrs['TYPE']) && $attrs['TYPE'] == 'user') {
					$cur_document['user_attributes'][$attrs['ATTRDEF']] = '';
				} else {
					$cur_document['attributes'][$attrs['NAME']] = '';
				}
			} elseif($parent['name'] == 'VERSION') {
				if(isset($attrs['TYPE']) && $attrs['TYPE'] == 'user') {
					$cur_version['user_attributes'][$attrs['ATTRDEF']] = '';
				} else {
					$cur_version['attributes'][$attrs['NAME']] = '';
				}
			} elseif($parent['name'] == 'STATUSLOG') {
				$cur_statuslog['attributes'][$attrs['NAME']] = '';
			} elseif($parent['name'] == 'WORKFLOWLOG') {
				$cur_workflowlog['attributes'][$attrs['NAME']] = '';
			} elseif($parent['name'] == 'APPROVAL') {
				$cur_approval['attributes'][$attrs['NAME']] = '';
			} elseif($parent['name'] == 'APPROVALLOG') {
				$cur_approvallog['attributes'][$attrs['NAME']] = '';
			} elseif($parent['name'] == 'REVIEW') {
				$cur_review['attributes'][$attrs['NAME']] = '';
			} elseif($parent['name'] == 'REVIEWLOG') {
				$cur_reviewlog['attributes'][$attrs['NAME']] = '';
			} elseif($parent['name'] == 'RECEIPT') {
				$cur_receipt['attributes'][$attrs['NAME']] = '';
			} elseif($parent['name'] == 'RECEIPTLOG') {
				$cur_receiptlog['attributes'][$attrs['NAME']] = '';
			} elseif($parent['name'] == 'REVISION') {
				$cur_revision['attributes'][$attrs['NAME']] = '';
			} elseif($parent['name'] == 'REVISIONLOG') {
				$cur_revisionlog['attributes'][$attrs['NAME']] = '';
			} elseif($parent['name'] == 'FOLDER') {
				if(isset($attrs['TYPE']) && $attrs['TYPE'] == 'user') {
					$cur_folder['user_attributes'][$attrs['ATTRDEF']] = '';
				} else {
					$cur_folder['attributes'][$attrs['NAME']] = '';
				}
			} elseif($parent['name'] == 'USER') {
				$cur_user['attributes'][$attrs['NAME']] = '';
			} elseif($parent['name'] == 'GROUP') {
				$cur_group['attributes'][$attrs['NAME']] = '';
			} elseif($parent['name'] == 'ROLE') {
				$cur_role['attributes'][$attrs['NAME']] = '';
			} elseif($parent['name'] == 'ACO') {
				$cur_acos[implode('/', $cur_acopath)]['attributes'][$attrs['NAME']] = '';
			} elseif($parent['name'] == 'KEYWORD') {
				$cur_keyword['attributes'][$attrs['NAME']] = '';
			} elseif($parent['name'] == 'ATTRIBUTEDEFINITION') {
				$cur_attrdef['attributes'][$attrs['NAME']] = '';
			} elseif($parent['name'] == 'FILE') {
				$cur_file['attributes'][$attrs['NAME']] = '';
			} elseif($parent['name'] == 'LINK') {
				$cur_link['attributes'][$attrs['NAME']] = '';
			} elseif($parent['name'] == 'TRANSMITTAL') {
				$cur_transmittal['attributes'][$attrs['NAME']] = '';
			} elseif($parent['name'] == 'ITEM') {
				$cur_transmittalitem['attributes'][$attrs['NAME']] = '';
			} elseif($parent['name'] == 'WORKFLOW') {
				$cur_workflow['attributes'][$attrs['NAME']] = '';
			} elseif($parent['name'] == 'WORKFLOWTRANSITION') {
				$cur_workflowtransition['attributes'][$attrs['NAME']] = '';
			} elseif($parent['name'] == 'WORKFLOWACTION') {
				$cur_workflowaction['attributes'][$attrs['NAME']] = '';
			} elseif($parent['name'] == 'TRANSITION') {
				$cur_transition['attributes'][$attrs['NAME']] = '';
			}
			break;
		case "CATEGORIES":
			if($parent['name'] == 'DOCUMENT') {
				$cur_document['categories'] = array();
			}
			break;
		case "CATEGORY":
			$first = $elementstack[1];
			if($first['name'] == 'DOCUMENT') {
				$cur_document['categories'][] = (int) $attrs['ID'];
			}
			break;
		case "ACLS":
			if($parent['name'] == 'DOCUMENT') {
				$cur_document['acls'] = array();
			} elseif($parent['name'] == 'FOLDER') {
				$cur_folder['acls'] = array();
			}
			break;
		case "ACL":
			$first = $elementstack[1];
			if($first['name'] == 'FOLDER') {
				$acl = array('type'=>$attrs['TYPE'], 'mode'=>$attrs['MODE']);
				if($attrs['TYPE'] == 'user') {
					$acl['user'] = $attrs['USER'];
				} elseif($attrs['TYPE'] == 'group') { 
					$acl['group'] = $attrs['GROUP'];
				}
				$cur_folder['acls'][] = $acl;
			} elseif($first['name'] == 'DOCUMENT') {
				$acl = array('type'=>$attrs['TYPE'], 'mode'=>$attrs['MODE']);
				if($attrs['TYPE'] == 'user') {
					$acl['user'] = $attrs['USER'];
				} elseif($attrs['TYPE'] == 'group') { 
					$acl['group'] = $attrs['GROUP'];
				}
				$cur_document['acls'][] = $acl;
			}
			break;
		case "DATA":
			if($parent['name'] == 'IMAGE') {
				$cur_user['image']['id'] = $parent['attributes']['ID'];
				$cur_user['image']['data'] = "";
			} elseif($parent['name'] == 'VERSION') {
				$cur_version['data_length'] = (int) $attrs['LENGTH'];
				if(isset($attrs['FILEREF']))
					$cur_version['fileref'] = $attrs['FILEREF'];
				else
					$cur_version['data'] = "";
			} elseif($parent['name'] == 'FILE') {
				$cur_file['data_length'] = (int) $attrs['LENGTH'];
				if(isset($attrs['FILEREF']))
					$cur_file['fileref'] = $attrs['FILEREF'];
				else
					$cur_file['data'] = "";
			} elseif($parent['name'] == 'REVIEWLOG') {
				$cur_reviewlog['data_length'] = (int) $attrs['LENGTH'];
				if(isset($attrs['FILEREF']))
					$cur_reviewlog['fileref'] = $attrs['FILEREF'];
				else
					$cur_reviewlog['data'] = "";
			}
			break;
		case "KEYWORD":
			$cur_keyword = array();
			$cur_keyword['id'] = (int) $attrs['ID'];
			$cur_keyword['attributes'] = array();
			break;
		case "KEYWORDCATEGORY":
			$cur_keywordcat = array();
			$cur_keywordcat['id'] = (int) $attrs['ID'];
			$cur_keywordcat['attributes'] = array();
			$cur_keywordcat['keywords'] = array();
			break;
		case "DOCUMENTCATEGORY":
			$cur_documentcat = array();
			$cur_documentcat['id'] = (int) $attrs['ID'];
			$cur_documentcat['attributes'] = array();
			break;
		case "NOTIFICATIONS":
			$first = $elementstack[1];
			if($first['name'] == 'FOLDER') {
				$cur_folder['notifications'] = array('users'=>array(), 'groups'=>array());
			} elseif($first['name'] == 'DOCUMENT') {
				$cur_document['notifications'] = array('users'=>array(), 'groups'=>array());
			}
			break;
		case "FILES":
			$first = $elementstack[1];
			if($first['name'] == 'DOCUMENT') {
				$cur_document['files'] = array();
			}
			break;
		case "FILE":
			$first = $elementstack[1];
			if($first['name'] == 'DOCUMENT') {
				$cur_file = array();
				$cur_file['id'] = (int) $attrs['ID'];
			}
			break;
		case "LINKS":
			$first = $elementstack[1];
			if($first['name'] == 'DOCUMENT') {
				$cur_document['links'] = array();
			}
			break;
		case "LINK":
			$first = $elementstack[1];
			if($first['name'] == 'DOCUMENT') {
				$cur_link = array();
				$cur_link['id'] = (int) $attrs['ID'];
			}
			break;
		case "TRANSITIONS":
			$first = $elementstack[2];
			if($first['name'] == 'WORKFLOW') {
				$cur_workflow['transitions'] = array();
			}
			break;
		case "TRANSITION":
			$first = $elementstack[2];
			if($first['name'] == 'WORKFLOW') {
				$cur_transition = array();
				$cur_transition['id'] = (int) $attrs['ID'];
				$cur_transition['users'] = array();
				$cur_transition['groups'] = array();
			}
			break;
		case "WORKFLOW":
			$first = $elementstack[1];
			if($first['name'] == 'WORKFLOWS') {
				$cur_workflow = array();
				$cur_workflow['id'] = (int) $attrs['ID'];
			} elseif($parent['name'] == 'MANDATORY_WORKFLOWS') {
				$cur_user['workflows'][] = (int) $attrs['ID'];
			} elseif($parent['name'] == 'VERSION') {
				$cur_version['workflow'] = array('id'=>(int) $attrs['ID'], 'state'=>(int) $attrs['STATE']);
			}
			break;
		case "WORKFLOWACTION":
			$first = $elementstack[1];
			if($first['name'] == 'WORKFLOWACTIONS') {
				$cur_workflowaction = array();
				$cur_workflowaction['id'] = (int) $attrs['ID'];
			}
			break;
		case "WORKFLOWSTATE":
			$first = $elementstack[1];
			if($first['name'] == 'WORKFLOWSTATES') {
				$cur_workflowstate = array();
				$cur_workflowstate['id'] = (int) $attrs['ID'];
			}
			break;
	}
} /* }}} */

function endElement($parser, $name) { /* {{{ */
	global $logger, $dms, $sections, $rootfolder, $objmap, $elementstack, $users, $groups, $links,$cur_user, $cur_group, $cur_folder, $cur_document, $cur_version, $cur_statuslog, $cur_approval, $cur_approvallog, $cur_review, $cur_reviewlog, $cur_receipt, $cur_receiptlog, $cur_revision, $cur_revisionlog, $cur_attrdef, $cur_documentcat, $cur_keyword, $cur_keywordcat, $cur_file, $cur_link, $cur_workflow, $cur_workflowlog, $cur_workflowtransition, $cur_workflowaction, $cur_workflowstate, $cur_transition, $cur_transmittal, $cur_transmittalitem, $cur_role, $cur_acopath, $cur_acos;

	array_pop($elementstack);
	$parent = end($elementstack);
	switch($name) {
		case "DOCUMENT":
			insert_document($cur_document);
			if(!empty($cur_document['links']))
			$links[$cur_document['id']] = $cur_document['links'];
			break;
		case "FOLDER":
			insert_folder($cur_folder);
			break;
		case "VERSION":
			$cur_document['versions'][] = $cur_version;
			break;
		case "STATUSLOG":
			$cur_version['statuslogs'][] = $cur_statuslog;
			break;
		case "WORKFLOWLOG":
			$cur_version['workflowlogs'][] = $cur_workflowlog;
			break;
		case "APPROVAL":
			$cur_version['approvals'][] = $cur_approval;
			break;
		case "APPROVALLOG":
			$cur_approval['logs'][] = $cur_approvallog;
			break;
		case "REVIEW":
			$cur_version['reviews'][] = $cur_review;
			break;
		case "REVIEWLOG":
			$cur_review['logs'][] = $cur_reviewlog;
			break;
		case "RECEIPT":
			$cur_version['receipts'][] = $cur_receipt;
			break;
		case "RECEIPTLOG":
			$cur_receipt['logs'][] = $cur_receiptlog;
			break;
		case "REVISION":
			$cur_version['revisions'][] = $cur_revision;
			break;
		case "REVISIONLOG":
			$cur_revision['logs'][] = $cur_revisionlog;
			break;
		case "USER":
			/* users can be the users data or the member of a group */
			$first = $elementstack[1];
			if($first['name'] == 'USERS' && $parent['name'] == 'USERS') {
				$users[$cur_user['id']] = $cur_user;
				insert_user($cur_user);
			}
			break;
		case "GROUP":
			$first = $elementstack[1];
			if($first['name'] == 'GROUPS') {
				$groups[$cur_group['id']] = $cur_group;
				insert_group($cur_group);
			}
			break;
		case 'ACO':
			array_pop($cur_acopath);
			break;
		case 'ROLE':
			$cur_role['acos'] = $cur_acos;
			insert_role($cur_role);
			break;
		case 'ATTRIBUTEDEFINITION':
			insert_attributedefinition($cur_attrdef);
			break;
		case 'KEYWORD':
			$cur_keywordcat['keywords'][] = $cur_keyword;
			break;
		case 'KEYWORDCATEGORY':
			insert_keywordcategory($cur_keywordcat);
			break;
		case 'DOCUMENTCATEGORY':
			insert_documentcategory($cur_documentcat);
			break;
		case "FILE":
			$first = $elementstack[1];
			if($first['name'] == 'DOCUMENT') {
				$cur_document['files'][] = $cur_file;
			}
			break;
		case "LINK":
			$first = $elementstack[1];
			if($first['name'] == 'DOCUMENT') {
				$cur_document['links'][] = $cur_link;
			}
			break;
		case "ITEM":
			$cur_transmittal['items'][] = $cur_transmittalitem;
			break;
		case 'TRANSMITTAL':
			insert_transmittal($cur_transmittal);
			break;
		case "TRANSITION":
			$second = $elementstack[2];
			if($second['name'] == 'WORKFLOW') {
				$cur_workflow['transitions'][] = $cur_transition;
			}
			break;
		case 'WORKFLOW':
			$first = $elementstack[1];
			if($first['name'] == 'WORKFLOWS') {
				insert_workflow($cur_workflow);
			}
			break;
		case 'WORKFLOWACTION':
			insert_workflowaction($cur_workflowaction);
			break;
		case 'WORKFLOWSTATE':
			insert_workflowstate($cur_workflowstate);
			break;
		case 'WORKFLOWS':
			/* Workflows has all been added. It's time to set the mandatory workflows
			 * of each user.
			 */
			foreach($users as $tuser) {
				if($tuser['workflows']) {
					if(!$user = $dms->getUser($objmap['users'][$tuser['id']])) {
						$logger->err("Cannot find user for adding mandatory workflows");
						exit;
					}
					foreach($tuser['workflows'] as $tworkflowid) {
						if(!$wk = $dms->getWorkflow($objmap['workflows'][$tworkflowid])) {
							$logger->err("Cannot find workflow for adding mandatory workflows");
							exit;
						}
						$user->setMandatoryWorkflow($wk);
					}
					foreach($tuser['individual']['reviewers'] as $userid) {
						$user->setMandatoryReviewer($objmap['users'][$userid], false);
					}
					foreach($tuser['individual']['approvers'] as $userid) {
						$user->setMandatoryApprover($objmap['users'][$userid], false);
					}
					foreach($tuser['group']['reviewers'] as $groupid) {
						$user->setMandatoryReviewer($objmap['groups'][$groupid], true);
					}
					foreach($tuser['group']['approvers'] as $userid) {
						$user->setMandatoryApprover($objmap['groups'][$groupid], true);
					}
				}
			}
			break;
	}
} /* }}} */

function characterData($parser, $data) { /* {{{ */
	global $elementstack, $objmap, $cur_user, $cur_group, $cur_folder, $cur_document, $cur_version, $cur_statuslog, $cur_approval, $cur_approvallog, $cur_review, $cur_reviewlog, $cur_receipt, $cur_receiptlog, $cur_revision, $cur_revisionlog, $cur_attrdef, $cur_documentcat, $cur_keyword, $cur_keywordcat, $cur_file, $cur_link, $cur_workflow, $cur_workflowlog, $cur_workflowtransition, $cur_workflowaction, $cur_workflowstate, $cur_transition, $cur_transmittal, $cur_transmittalitem, $cur_role, $cur_acopath, $cur_acos;

	$current = end($elementstack);
	$parent = prev($elementstack);
	switch($current['name']) {
		case 'ATTR':
			switch($parent['name']) {
				case 'DOCUMENT':
					if(isset($current['attributes']['TYPE']) && $current['attributes']['TYPE'] == 'user') {
						if(isset($cur_document['user_attributes'][$current['attributes']['ATTRDEF']]))
							$cur_document['user_attributes'][$current['attributes']['ATTRDEF']] .= $data;
						else
							$cur_document['user_attributes'][$current['attributes']['ATTRDEF']] = $data;
					} else {
						if(isset($cur_document['attributes'][$current['attributes']['NAME']]))
							$cur_document['attributes'][$current['attributes']['NAME']] .= $data;
						else
							$cur_document['attributes'][$current['attributes']['NAME']] = $data;
					}
					break;
				case 'FOLDER':
					if(isset($current['attributes']['TYPE']) && $current['attributes']['TYPE']  == 'user') {
						if(isset($cur_folder['user_attributes'][$current['attributes']['ATTRDEF']]))
							$cur_folder['user_attributes'][$current['attributes']['ATTRDEF']] .= $data;
						else
							$cur_folder['user_attributes'][$current['attributes']['ATTRDEF']] = $data;
					} else {
						if(isset($cur_folder['attributes'][$current['attributes']['NAME']]))
							$cur_folder['attributes'][$current['attributes']['NAME']] .= $data;
						else
							$cur_folder['attributes'][$current['attributes']['NAME']] = $data;
					}
					break;
				case 'VERSION':
					if(isset($current['attributes']['TYPE']) && $current['attributes']['TYPE']  == 'user') {
						if(isset($cur_version['user_attributes'][$current['attributes']['ATTRDEF']]))
							$cur_version['user_attributes'][$current['attributes']['ATTRDEF']] .= $data;
						else
							$cur_version['user_attributes'][$current['attributes']['ATTRDEF']] = $data;
					} else {
						if(isset($cur_version['attributes'][$current['attributes']['NAME']]))
							$cur_version['attributes'][$current['attributes']['NAME']] .= $data;
						else
							$cur_version['attributes'][$current['attributes']['NAME']] = $data;
					}
					break;
				case 'STATUSLOG':
					if(isset($cur_statuslog['attributes'][$current['attributes']['NAME']]))
						$cur_statuslog['attributes'][$current['attributes']['NAME']] .= $data;
					else
						$cur_statuslog['attributes'][$current['attributes']['NAME']] = $data;
					break;
				case 'APPROVAL':
					$cur_approval['attributes'][$current['attributes']['NAME']] = $data;
					break;
				case 'APPROVALLOG':
					if(isset($cur_approvallog['attributes'][$current['attributes']['NAME']]))
						$cur_approvallog['attributes'][$current['attributes']['NAME']] .= $data;
					else
						$cur_approvallog['attributes'][$current['attributes']['NAME']] = $data;
					break;
				case 'REVIEW':
					$cur_review['attributes'][$current['attributes']['NAME']] = $data;
					break;
				case 'REVIEWLOG':
					if(isset($cur_reviewlog['attributes'][$current['attributes']['NAME']]))
						$cur_reviewlog['attributes'][$current['attributes']['NAME']] .= $data;
					else
						$cur_reviewlog['attributes'][$current['attributes']['NAME']] = $data;
					break;
				case 'RECEIPT':
					$cur_receipt['attributes'][$current['attributes']['NAME']] = $data;
					break;
				case 'RECEIPTLOG':
					if(isset($cur_receiptlog['attributes'][$current['attributes']['NAME']]))
						$cur_receiptlog['attributes'][$current['attributes']['NAME']] .= $data;
					else
						$cur_receiptlog['attributes'][$current['attributes']['NAME']] = $data;
					break;
				case 'REVISION':
					$cur_revision['attributes'][$current['attributes']['NAME']] = $data;
					break;
				case 'REVISIONLOG':
					if(isset($cur_revisionlog['attributes'][$current['attributes']['NAME']]))
						$cur_revisionlog['attributes'][$current['attributes']['NAME']] .= $data;
					else
						$cur_revisionlog['attributes'][$current['attributes']['NAME']] = $data;
					break;
				case 'WORKFLOWLOG':
					if(isset($cur_workflowlog['attributes'][$current['attributes']['NAME']]))
						$cur_workflowlog['attributes'][$current['attributes']['NAME']] .= $data;
					else
						$cur_workflowlog['attributes'][$current['attributes']['NAME']] = $data;
					break;
				case 'USER':
					if(isset($cur_user['attributes'][$current['attributes']['NAME']]))
						$cur_user['attributes'][$current['attributes']['NAME']] .= $data;
					else
						$cur_user['attributes'][$current['attributes']['NAME']] = $data;
					break;
				case 'GROUP':
					if(isset($cur_group['attributes'][$current['attributes']['NAME']]))
						$cur_group['attributes'][$current['attributes']['NAME']] .= $data;
					else
						$cur_group['attributes'][$current['attributes']['NAME']] = $data;
					break;
				case 'ROLE':
					if(isset($cur_role['attributes'][$current['attributes']['NAME']]))
						$cur_role['attributes'][$current['attributes']['NAME']] .= $data;
					else
						$cur_role['attributes'][$current['attributes']['NAME']] = $data;
					break;
				case 'ACO':
					if(isset($cur_acos[implode('/', $cur_acopath)]['attributes'][$current['attributes']['NAME']]))
						$cur_acos[implode('/', $cur_acopath)]['attributes'][$current['attributes']['NAME']] .= $data;
					else
						$cur_acos[implode('/', $cur_acopath)]['attributes'][$current['attributes']['NAME']] = $data;
					break;
				case 'ATTRIBUTEDEFINITION':
					if(isset($cur_attrdef['attributes'][$current['attributes']['NAME']]))
						$cur_attrdef['attributes'][$current['attributes']['NAME']] .= $data;
					else
						$cur_attrdef['attributes'][$current['attributes']['NAME']] = $data;
					break;
				case 'DOCUMENTCATEGORY':
					if(isset($cur_documentcat['attributes'][$current['attributes']['NAME']]))
						$cur_documentcat['attributes'][$current['attributes']['NAME']] .= $data;
					else
						$cur_documentcat['attributes'][$current['attributes']['NAME']] = $data;
					break;
				case 'KEYWORDCATEGORY':
					if(isset($cur_keywordcat['attributes'][$current['attributes']['NAME']]))
						$cur_keywordcat['attributes'][$current['attributes']['NAME']] .= $data;
					else
						$cur_keywordcat['attributes'][$current['attributes']['NAME']] = $data;
					break;
				case 'KEYWORD':
					if(isset($cur_keyword['attributes'][$current['attributes']['NAME']]))
						$cur_keyword['attributes'][$current['attributes']['NAME']] .= $data;
					else
						$cur_keyword['attributes'][$current['attributes']['NAME']] = $data;
					break;
				case 'IMAGE':
					$cur_user['image']['mimetype'] = $data;
					break;
				case 'FILE':
					if(isset($cur_file['attributes'][$current['attributes']['NAME']]))
						$cur_file['attributes'][$current['attributes']['NAME']] .= $data;
					else
						$cur_file['attributes'][$current['attributes']['NAME']] = $data;
					break;
				case 'LINK':
					$cur_link['attributes'][$current['attributes']['NAME']] = $data;
					break;
				case 'TRANSMITTAL':
					if(isset($cur_transmittal['attributes'][$current['attributes']['NAME']]))
						$cur_transmittal['attributes'][$current['attributes']['NAME']] .= $data;
					else
						$cur_transmittal['attributes'][$current['attributes']['NAME']] = $data;
					break;
				case 'ITEM':
					if(isset($cur_transmittalitem['attributes'][$current['attributes']['NAME']]))
						$cur_transmittalitem['attributes'][$current['attributes']['NAME']] .= $data;
					else
						$cur_transmittalitem['attributes'][$current['attributes']['NAME']] = $data;
					break;
				case 'WORKFLOW':
					if(isset($cur_workflow['attributes'][$current['attributes']['NAME']]))
						$cur_workflow['attributes'][$current['attributes']['NAME']] .= $data;
					else
						$cur_workflow['attributes'][$current['attributes']['NAME']] = $data;
					break;
				case 'WORKFLOWSTATE':
					if(isset($cur_workflowstate['attributes'][$current['attributes']['NAME']]))
						$cur_workflowstate['attributes'][$current['attributes']['NAME']] .= $data;
					else
						$cur_workflowstate['attributes'][$current['attributes']['NAME']] = $data;
					break;
				case 'WORKFLOWACTION':
					if(isset($cur_workflowaction['attributes'][$current['attributes']['NAME']]))
						$cur_workflowaction['attributes'][$current['attributes']['NAME']] .= $data;
					else
						$cur_workflowaction['attributes'][$current['attributes']['NAME']] = $data;
					break;
				case 'TRANSITION':
					$cur_transition['attributes'][$current['attributes']['NAME']] = $data;
					break;
			}
			break;
		case 'DATA':
			switch($parent['name']) {
				case 'IMAGE':
					$cur_user['image']['data'] .= $data;
					break;
				case 'VERSION':
					$cur_version['data'] .= $data;
					break;
				case 'FILE':
					$cur_file['data'] .= $data;
					break;
				case 'REVIEWLOG':
					$cur_reviewlog['data'] .= $data;
					break;
			}
			break;
		case 'USER':
			$first = $elementstack[1];
			if($first['name'] == 'GROUPS') {
				$cur_group['users'][] = $data;
			}
			break;
	}
	
} /* }}} */

$version = "0.0.1";
$shortoptions = "hv";
$longoptions = array('help', 'version', 'debug', 'config:', 'sections:', 'folder:', 'file:', 'contentdir:', 'default-user:', 'export-mapping:', 'no-version-check');
if(false === ($options = getopt($shortoptions, $longoptions))) {
	usage();
	exit(0);
}

/* Print help and exit */
if(isset($options['h']) || isset($options['help'])) {
	usage();
	exit(0);
}

/* Print version and exit */
if(isset($options['v']) || isset($options['verѕion'])) {
	echo $version."".PHP_EOL;
	exit(0);
}

/* Check for debug mode */
$debug = false;
if(isset($options['debug'])) {
	$debug = true;
}

/* Set alternative config file */
if(isset($options['config'])) {
	define('SEEDDMS_CONFIG_FILE', $options['config']);
} elseif(isset($_SERVER['SEEDDMS_CONFIG_FILE'])) {
	define('SEEDDMS_CONFIG_FILE', $_SERVER['SEEDDMS_CONFIG_FILE']);
}

include($myincpath."/inc/inc.Settings.php");
include($myincpath."/inc/inc.Init.php");
include($myincpath."/inc/inc.Extension.php");
include($myincpath."/inc/inc.DBInit.php");
include($myincpath."/inc/inc.ClassSettings.php");
include($myincpath."/inc/inc.Acl.php");

$logfile = "xmlimport.log";
$logconf = array();
$logconf['timeformat'] = '%Y-%m-%d %H:%M:%S';
$logconf['lineFormat'] = '%{timestamp} %{priority} xmlimport: %{ident} %{message}';
$logger = Log::factory('file', $logfile, '', $logconf);

if(isset($options['folder'])) {
	$folderid = intval($options['folder']);
} else {
	$folderid = $settings->_rootFolderID;
}

if(isset($options['contentdir'])) {
	if(file_exists($options['contentdir'])) {
		$contentdir = $options['contentdir'];
		if(substr($contentdir, -1, 1) != DIRECTORY_SEPARATOR)
			$contentdir .= DIRECTORY_SEPARATOR;
	} else {
		$logger->crit("Directory ".$options['contentdir']." does not exists");
		exit(1);
	}
} else {
	$contentdir = '';
}

if(isset($options['default-user'])) {
	$defaultuserid = intval($options['default-user']);
} else {
	$defaultuserid = 0;
}

$filename = '';
if(isset($options['file'])) {
	$filename = $options['file'];
} else {
	usage();
	exit(1);
}

$exportmapping = '';
if(isset($options['export-mapping'])) {
	$exportmapping = $options['export-mapping'];
}

$noversioncheck = false;
if(isset($options['no-version-check'])) {
	$noversioncheck = true;
}

$sections = array('documents', 'folders', 'groups', 'users', 'roles', 'keywordcategories', 'documentcategories', 'attributedefinitions', 'workflows', 'transmittals');
if(isset($options['sections'])) {
	$sections = explode(',', $options['sections']);
}

if(isset($settings->_extraPath))
	ini_set('include_path', $settings->_extraPath. PATH_SEPARATOR .ini_get('include_path'));

require_once("SeedDMS/Core.php");

$db = new SeedDMS_Core_DatabaseAccess($settings->_dbDriver, $settings->_dbHostname, $settings->_dbUser, $settings->_dbPass, $settings->_dbDatabase);
$db->connect() or die ("Could not connect to db-server \"" . $settings->_dbHostname . "\"");
$db->_debug = 1;

$dms = new SeedDMS_Core_DMS($db, $settings->_contentDir.$settings->_contentOffsetDir);
if(!$settings->_doNotCheckDBVersion && !$dms->checkVersion()) {
	$logger->crit("Database update needed.");
	exit;
}
$dms->setRootFolderID($settings->_rootFolderID);

$rootfolder = $dms->getFolder($folderid);
if(!$rootfolder) {
	exit(1);
}

if($defaultuserid) {
	if(!$defaultUser = $dms->getUser($defaultuserid)) {
		$logger->crit("Could not find default user with id ".$defaultuserid);
		exit(1);
	}
} else {
	$defaultUser = null;
}

$users = array();
$elementstack = array();
$objmap = array(
	'attributedefs' => array(),
	'keywordcategories' => array(),
	'documentcategories' => array(),
	'users' => array(),
	'groups' => array(),
	'folders' => array(),
	'documents' => array(),
	'transmittals' => array(),
	'workflows' => array(),
	'workflowstates' => array(),
	'workflowactions' => array(),
);

$xml_parser = xml_parser_create("UTF-8");
xml_parser_set_option($xml_parser, XML_OPTION_SKIP_WHITE, true);
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
if (!($fp = fopen($filename, "r"))) {
    die("could not open XML input");
}
while ($data = fread($fp, 65535)) {
	if (!xml_parse($xml_parser, $data, feof($fp))) {
		die(sprintf("XML error: %s at line %d",
			xml_error_string(xml_get_error_code($xml_parser)),
			xml_get_current_line_number($xml_parser)));
	}
}

resolve_links();
set_mandatory();

set_homefolders();

if($exportmapping) {
	if($fp = fopen($exportmapping, 'w')) {
		fputcsv($fp, array('object type', 'old id', 'new id'));
		foreach($objmap as $section=>$map) {
			foreach($map as $old=>$new) {
				fputcsv($fp, array($section, $old, $new));
			}
		}
		fclose($fp);
	} else {
		$logger->err("Could not open mapping file '".$exportmapping."'");
	}
}