From 591e96576707e4139b142026a7d915ffdde1e223 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Thu, 24 Feb 2011 23:12:33 +0000 Subject: [PATCH] JCR browser git-svn-id: https://svn.argeo.org/commons/trunk@4189 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../META-INF/spring/commands.xml | 17 ++ .../META-INF/spring/osgi.xml | 3 + .../org.argeo.jcr.ui.explorer/icons/add.gif | Bin 0 -> 318 bytes .../icons/browser.gif | Bin 0 -> 582 bytes .../icons/import_fs.png | Bin 0 -> 729 bytes .../org.argeo.jcr.ui.explorer/icons/query.png | Bin 0 -> 1086 bytes .../icons/refresh.png | Bin 0 -> 465 bytes .../icons/remove.gif | Bin 0 -> 351 bytes .../org.argeo.jcr.ui.explorer/plugin.xml | 84 +++-- .../ui/jcr/explorer/JcrExplorerPlugin.java | 5 + eclipse/plugins/pom.xml | 1 + .../org.argeo.eclipse.ui.jcr/build.properties | 3 +- .../org.argeo.eclipse.ui.jcr/icons/binary.png | Bin 0 -> 523 bytes .../org.argeo.eclipse.ui.jcr/icons/file.gif | Bin 0 -> 577 bytes .../org.argeo.eclipse.ui.jcr/icons/folder.gif | Bin 0 -> 219 bytes .../org.argeo.eclipse.ui.jcr/icons/home.gif | Bin 0 -> 583 bytes .../org.argeo.eclipse.ui.jcr/icons/node.gif | Bin 0 -> 586 bytes .../icons/repositories.gif | Bin 0 -> 588 bytes .../icons/repository.gif | Bin 0 -> 198 bytes .../icons/repository_connected.gif | Bin 0 -> 328 bytes .../icons/repository_disconnected.gif | Bin 0 -> 209 bytes .../icons/workspace.gif | Bin 0 -> 358 bytes .../icons/workspace_connected.png | Bin 0 -> 498 bytes .../icons/workspace_disconnected.png | Bin 0 -> 493 bytes .../runtime/org.argeo.eclipse.ui.jcr/pom.xml | 1 + .../org/argeo/eclipse/ui/jcr/JcrUiPlugin.java | 13 + .../ui/jcr/browser/ItemComparator.java | 20 ++ .../ui/jcr/browser/NodeContentProvider.java | 105 +++++++ .../ui/jcr/browser/NodeLabelProvider.java | 81 +++++ .../browser/PropertiesContentProvider.java | 40 +++ .../ui/jcr/browser/RepositoryNode.java | 49 +++ .../eclipse/ui/jcr/browser/WorkspaceNode.java | 107 +++++++ .../ui/jcr/commands/AddFileFolder.java | 50 +++ .../eclipse/ui/jcr/commands/DeleteNode.java | 47 +++ .../ui/jcr/commands/ImportFileSystem.java | 51 ++++ .../eclipse/ui/jcr/commands/InitUserHome.java | 47 +++ .../eclipse/ui/jcr/commands/Refresh.java | 31 ++ .../ui/jcr/dialogs/ChooseNameDialog.java | 52 ++++ .../jcr/editors/AbstractJcrQueryEditor.java | 32 +- .../ui/jcr/views/GenericJcrBrowser.java | 289 ++---------------- .../jcr/wizards/ImportFileSystemWizard.java | 189 ++++++++++++ .../org/argeo/eclipse/ui/dialogs/Error.java | 80 +++++ .../argeo/eclipse/ui/dialogs/SingleValue.java | 110 +++++++ eclipse/runtime/pom.xml | 1 + .../org.argeo.security.ui/icons/refresh.png | Bin 934 -> 465 bytes .../META-INF/spring/noderepo-osgi.xml | 13 +- .../META-INF/spring/noderepo.xml | 8 +- .../noderepo.properties | 8 +- .../repository-h2.xml | 2 +- .../repository-postgresql.xml | 2 +- .../main/java/org/argeo/jcr/ArgeoNames.java | 7 + .../main/java/org/argeo/jcr/ArgeoTypes.java | 7 + .../main/resources/org/argeo/jcr/argeo.cnd | 5 +- 53 files changed, 1259 insertions(+), 301 deletions(-) create mode 100644 eclipse/plugins/org.argeo.jcr.ui.explorer/icons/add.gif create mode 100644 eclipse/plugins/org.argeo.jcr.ui.explorer/icons/browser.gif create mode 100644 eclipse/plugins/org.argeo.jcr.ui.explorer/icons/import_fs.png create mode 100644 eclipse/plugins/org.argeo.jcr.ui.explorer/icons/query.png create mode 100644 eclipse/plugins/org.argeo.jcr.ui.explorer/icons/refresh.png create mode 100644 eclipse/plugins/org.argeo.jcr.ui.explorer/icons/remove.gif create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/binary.png create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/file.gif create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/folder.gif create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/home.gif create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/node.gif create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/repositories.gif create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/repository.gif create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/repository_connected.gif create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/repository_disconnected.gif create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/workspace.gif create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/workspace_connected.png create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/workspace_disconnected.png create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/JcrUiPlugin.java create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/ItemComparator.java create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/NodeContentProvider.java create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/NodeLabelProvider.java create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/PropertiesContentProvider.java create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/RepositoryNode.java create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/WorkspaceNode.java create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/commands/AddFileFolder.java create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/commands/DeleteNode.java create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/commands/ImportFileSystem.java create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/commands/InitUserHome.java create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/commands/Refresh.java create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/dialogs/ChooseNameDialog.java create mode 100644 eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/wizards/ImportFileSystemWizard.java create mode 100644 eclipse/runtime/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/ui/dialogs/Error.java create mode 100644 eclipse/runtime/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/ui/dialogs/SingleValue.java create mode 100644 server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/ArgeoNames.java create mode 100644 server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/ArgeoTypes.java diff --git a/eclipse/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/commands.xml b/eclipse/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/commands.xml index 325951d9b..c1c1f19b9 100644 --- a/eclipse/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/commands.xml +++ b/eclipse/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/commands.xml @@ -10,4 +10,21 @@ + + + + + + + + + + + + diff --git a/eclipse/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/osgi.xml b/eclipse/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/osgi.xml index 0e87da8c0..487cebfdf 100644 --- a/eclipse/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/osgi.xml +++ b/eclipse/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/osgi.xml @@ -8,6 +8,9 @@ http://www.springframework.org/schema/beans/spring-beans-2.5.xsd" osgi:default-timeout="30000"> + + diff --git a/eclipse/plugins/org.argeo.jcr.ui.explorer/icons/add.gif b/eclipse/plugins/org.argeo.jcr.ui.explorer/icons/add.gif new file mode 100644 index 0000000000000000000000000000000000000000..252d7ebcb8c74d6e5de66ef0eb8856622a0e9d89 GIT binary patch literal 318 zcmZ?wbhEHb6krfwxXQp_S{7na6>d=(Ze15;Qy1mX8t2lT^ zHOHgY9FJamJZkN+sI|wVk6ueSb}ixP)r4bLfn?%^+sU^crQUj&`rv8W|Ns9PC;*B- zSr{1@v>9|jW`O*}z!rUAYJrE2RKG`JYNRKhwpQrnor{(Ph`sVEnyR2Kc;c~(o$WdP zMb0Wl6K^dQ-0hgs;wm+wC{rAHMhT*Wdpw2cAth z_F~?dS3m#$zxw(A%b)*0{Qm#%@1uWzAOHEW_|K0ezrQZ|`|HBL-&YT9u{yCc?B}bJ zpRdY)zN-BBs`}@v`afTff4*-2>4y8K8y=r-czu7IG;><>%xNv3ui1RM;q&W3VtuL8 z;pN)LR+;{~8`WCjuy9uGfjP2=7pWXxtbTf>{`=DoeKmHg7nDBRCi&~6-i#*eryC_d z?o#`>Oa0d|?KM57i`y+8Z?WCfZ}R=guGjaEY_I1&)Ter|SM6~d=f+yA7dMVPtz`fI z|33pAf#OdVMh1px1|5){pg3V*U)&Jg)ZEhA)~xAh?c|`@-lXAcsjOqKuOEcXJxdMw2YXzgs2FMlJ>OFCLvaKPHtX4eilVt zWA9_pfpT(gH*N$f>RDWA@{^NylYcJnr)J<47188xYQ|vy)!tv-#3jPH$x}{&p+SN} l$x}=xVgZlVBSnS=J^^D9%O}q5N4u?RY;K*{n5@8H4FJ8>>N5ZU literal 0 HcmV?d00001 diff --git a/eclipse/plugins/org.argeo.jcr.ui.explorer/icons/import_fs.png b/eclipse/plugins/org.argeo.jcr.ui.explorer/icons/import_fs.png new file mode 100644 index 0000000000000000000000000000000000000000..d7c890c81f90b2a17917dfb65b37baa1a1f0dcdf GIT binary patch literal 729 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47#jk7LR_n6?)GX}!w@=+Epj?X z^bDc+Swac3#FA!9rOuH}o1>UHPbqVrdd~dTrF+$K=9`u-cBon6*RrB@+1`k*RVfqK zWKLN-Y3qThI}T3WabVi6gUikwU4G`sw)-cx-8;Vh-iht^j~{$}>etJ8|G%F3c7NLc zkB9!h-u(aj!~Z{@zq#1`|LKzdUvK}v)%hPN_2K;g4;TJ_y88c8$^VO`j}O-Ve|zHQ zroy9LW}B-F4z-)^Z#LQ8V7$H7=yQ)xE;9@A0!;d-r7D-u^zZTq8C!Eum$( oGn1lA$3G!YEyl(MRmC^VDelI0bKcdR0Xmhz)78&qol`;+01Q4Zvj6}9 literal 0 HcmV?d00001 diff --git a/eclipse/plugins/org.argeo.jcr.ui.explorer/icons/query.png b/eclipse/plugins/org.argeo.jcr.ui.explorer/icons/query.png new file mode 100644 index 0000000000000000000000000000000000000000..54c089de187f97527aaae13ca983f2781f6a5e74 GIT binary patch literal 1086 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fHRz`)E9 z;1lAyW#gtdPu@Iv@+POWXX=9OS>O>_%)r2R z1cVu&+uB-9mxU-|IVbz4>o(p8sw8hP~s2 zbhgd@D2EVBmlDxHpUNtR%68Yl1)mE!9vU-B?vb*QyTJ4CPO0RHqQfWSE_A*3tW(%@ zk>#85D;}N7SH64mG%sG=9K{s%qtDzy$a}))O}CkQJars%X7dQGnZBtrO=7!)uWyv^ nh1IveWIvG9FWnz`{ohq_0ZqyD{@ok4g96ag)z4*}Q$iB}>U+SI literal 0 HcmV?d00001 diff --git a/eclipse/plugins/org.argeo.jcr.ui.explorer/icons/refresh.png b/eclipse/plugins/org.argeo.jcr.ui.explorer/icons/refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..a3884fb4888c2a68f0fa64d523e69da2f0569ab2 GIT binary patch literal 465 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMffdHQn*B?J#{QLX<$A=BSKWzE= zV#<#fGk(9E_w#PmhZ_waZ#DmT(DC8HijS9zf8T38JWck{Oobm85`NsM_;I7*=h^tZ zEn*uhgm*WJ?rId>RwJ^l7Kngsu@!j&Yl{R|<_WII6I@#)w6<7iO_9)=VxeW(0{{R2 z2iioM&sl5KBX4_uVab=`lFvmYpNmUxXz4%DF}bf}d|cDunVH>FGrOY- z+D{EEKZPcINzVS9ob?$uHn=&y~n$8D`1 z2l;<(sQc1T_xQ+>|Ns9p5DgT6vM@3*7&7R9bb$QCz*ci$MuCTpRKMGd^bncK1eb^v zqDfrti^MpzbSB1VUt0b}aql73M;xvKD|}WtK1fk5iV!?;_@hVR1O_f%UNKGv4?_+f zX(=fl4i6boi78XK>s@7pr?3jKN=S;#aFP{YATA>-vrJN4*4aRuZH4n{cJUaejf + class="org.argeo.eclipse.spring.SpringExtensionFactory" + icon="icons/browser.gif" + id="org.argeo.jcr.ui.explorer.browserView" + name="JCR Browser"> @@ -33,28 +34,73 @@ + name="New generic JCR query"> + + + + + + + + + + - - + - + locationURI="menu:org.argeo.jcr.ui.explorer.browserView"> + icon="icons/query.png" + style="push"> - + + + + + + + + + + + + diff --git a/eclipse/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/eclipse/ui/jcr/explorer/JcrExplorerPlugin.java b/eclipse/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/eclipse/ui/jcr/explorer/JcrExplorerPlugin.java index 5beb52a13..b5e9af31d 100644 --- a/eclipse/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/eclipse/ui/jcr/explorer/JcrExplorerPlugin.java +++ b/eclipse/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/eclipse/ui/jcr/explorer/JcrExplorerPlugin.java @@ -1,5 +1,6 @@ package org.argeo.eclipse.ui.jcr.explorer; +import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.framework.BundleContext; @@ -53,4 +54,8 @@ public class JcrExplorerPlugin extends AbstractUIPlugin { return plugin; } + public static ImageDescriptor getImageDescriptor(String path) { + return imageDescriptorFromPlugin(ID, path); + } + } diff --git a/eclipse/plugins/pom.xml b/eclipse/plugins/pom.xml index 3d2271ba7..3b7006a5d 100644 --- a/eclipse/plugins/pom.xml +++ b/eclipse/plugins/pom.xml @@ -22,6 +22,7 @@ plugin.xml META-INF/** + icons/** diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/build.properties b/eclipse/runtime/org.argeo.eclipse.ui.jcr/build.properties index 5fc538bc8..b3eb07b43 100644 --- a/eclipse/runtime/org.argeo.eclipse.ui.jcr/build.properties +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/build.properties @@ -1,4 +1,5 @@ source.. = src/main/java/ output.. = target/classes/ bin.includes = META-INF/,\ - . + .,\ + icons/ diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/binary.png b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/binary.png new file mode 100644 index 0000000000000000000000000000000000000000..fdf4f82bec2de73e8e635d5b51c798c6db6cccd5 GIT binary patch literal 523 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMffdHQn*Dv4x{P_9j#JRg)zyJC2 z?f3faC(~P7Be`d^>IBVvFxwCs0%e`Jf>Nl-uSi7|8_}0Rs zn~RQaDL%BRbl>{&U2Cfzoan!@DdWnf%v*bFu5QZw|NlSG6Q>F<+y_$jB|(0{KoJT6 zL!VlWIM67@ByV>Yd%I+VQXq%3z$3C4NPB>>+sSM@AY-Pdi(`ny<=C^=g_;ZmS|18X zciFlHGAB7~G#8P6_E-LN3a8}p|Igmkn0FtE_vl!1!a@1{+>9NO)81Qf+y9O!_IRDQ z|Msf0^KNRh-te_}-Z9;K&V9yj+pML&S-nlWTE`&6zKr=mWu6sd%pNXPxrGsHn|xgi zdkv0eiRR3-nZdFwQTCMb6oIS=)|N>QO;M~Lw`9m1p8nL|sfO|F7S;LN^}~Q}WMJ@g L^>bP0l+XkKDjg<6 literal 0 HcmV?d00001 diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/file.gif b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/file.gif new file mode 100644 index 0000000000000000000000000000000000000000..ef302880717d12cc7dcc93a5ec9409488a788e7f GIT binary patch literal 577 zcmZ?wbhEHb6krfwc*elsm$lF@Yk_~(g0RA6@s(>r3zvl!E{&^PlisvBy=hZM)24#1 z9pw}ERe;dm+Gz(r{{H{r&;OtQ{(t!Q|KtDv-~Rvq{{R1v|Nnpf|Nra%|KI=r|M~y_ z-~a!`S@y+Q4#n9HCE1Rpxvu3o4n>&`#aWIO`R*0@-c7}JwfXjydCp}yuI;7P)2fXp zRG4;`S*&W)UD#kSyUuV%wZWWvqeU&IE7~m{9cy0KrnROYC}Z5GBYybE5lN#yT~U6Xo$Ra(3=+D1dScga+z`_1)0SMcgq@9vNlLp4}NkYYq1|o9u5f+1+4#yxaU}r`gdi^F!@s8_V^#R2r-=)!$xYw6WY^bAj4_ zFkpZI#h)yU3=A?1Iv@d%oeZoI3hI3+ne)<@xV>1B`(fEuK?V+&Lu+13upU?-aN>~% z+leJYmV$v?7gmUP30m^pSR?jZz)|4A1_>U)M7|eWr0xntihbB2lP8!e@?(!&ykzXZ OhQ@l`mR1!-25SJE4`R#! literal 0 HcmV?d00001 diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/home.gif b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/home.gif new file mode 100644 index 0000000000000000000000000000000000000000..fd0c66950972e9fd6b4eee2a45293db7b0402a95 GIT binary patch literal 583 zcmZ?wbhEHb6krfwc*ek>=hf;IH{B?(Il6LneC_)9y7e)Ys}kzgCpT_NZrqsBx;3M1 zYfjfr^Oy#Un1=ILZ(q4_=gaqB7ao7P|N7gr_usES|9bEBw__J?ox6Jb!jmu8UwnP~ z{`vgb@~XsXFsG`()# z)P`jC{<4g|#s1N)K&pC%tK(wV?&6UV6I0Yt5EGW+>Ef1>5|vq# o@xi~D$(7S6WrD(k7KTTdfM8Hb2nXEy7Tt)cRyde`|-ygpG`u5}Z!`D9^y!!t5&5tK+PqXU%vnDpS5D*?Bx$%1I52TfB*C4 zho3Lr|9Jo9*Qam4r_5RU^xco=?|;1d`19kp-=Dty`uOeF_g{Zz%wJ?aBVon4?KL}U z=PjDIXzA<~E2ghqJ!Rv%iCZ`H?cLhBb5qa$Z5{vr|7RG2K=CIFBLjmogAT~;pg3V* zU*6#C?9|fQ*3#7Ez|qs&=g{fw$YEh_(bwZR(Vo%V(wvc%nT5gBexjZ1R0~=5wQKDr z+A^tZW!kbu#de~N$!c9=Ha2M^n~Byk^UQS?E#bAEXeGK@^s17wsMSO>DMP8dckgML zP1Ms|ZJ^B~EF!5lQC0tx{#gcn)rnjRs}(d96cimaI$9DN+l4u7Z3-qFXzuiIHmI5L XgV9NeM?!&bXM&>>OK%esBZD;nX%XK6 literal 0 HcmV?d00001 diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/repositories.gif b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/repositories.gif new file mode 100644 index 0000000000000000000000000000000000000000..c13bea1ca4123cee4276db0a468963bf2ca6fa94 GIT binary patch literal 588 zcmZ?wbhEHb6krfwc*el+`SaKR|EpfTI{fnG=|4Y~{Qb56-=9lAUseA8u<*~f|e{QkZp@nt_=Q$jntgwHs z^S;@xzusLuG*M|^zw(nU&hPg}?w;YXW19D?Gd<7G&w6-v-i{6PkF@g~YT?<}t+u06 z^TSrV2kSkyPxgB@op)a&-~LAaZ!2WCwQAp5>9=J<;LnHK9`p7<5360>udf`^tuZ06y_nalWR`t`=c7 zPX6|;E(v9M9b;E*RT0U#k|Iq~$_@<7Tq|8P%c2}fQEvenVYws`UykL0Nn!y3Z^oQ+>ZL!wE|2ISloN?$o#rdvz?#i z>xYh3*R7lQ)SSLPa$ff_z~xE2fYOO64PGTj6eh|0im9zS@FdzoO;km5)rTdIC-+D> KxACwrSOWlhFVLI- literal 0 HcmV?d00001 diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/repository.gif b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/repository.gif new file mode 100644 index 0000000000000000000000000000000000000000..ef7809c94940a4e3eb6f9c32c054dbc74391a56c GIT binary patch literal 198 zcmV;%06G6hNk%w1VGsZi0J9DNe}I3VpP#?n+rYoTt*)(re}KQgzu(`#|KH#4?(Se; zU|(Qg_V)JC(b50^{{R30A^8LW000gEEC2ui01yBW000DY&`H*ay^TqkY!D!V2!oYK zL@PuBrpT&4Z;eY15hXcc!A`xC?p09gTdhtg&AiH#nW&Q7z_c$qRB)m ziPvF46`e-GX+U<{{f5W0a`MbXt)Ws>18_199XwxkU;qRs8;3`cjT@AemJSgBJ07u8 AR{#J2 literal 0 HcmV?d00001 diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/repository_connected.gif b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/repository_connected.gif new file mode 100644 index 0000000000000000000000000000000000000000..a15fa55380a15b034026ae13e7f62dc231ab2433 GIT binary patch literal 328 zcmZ?wbhEHb6krfwxXQrr`)kkNUweOjEIPEs>i36ff4;2w^JVS#M-eA>hW&h5`tw!e z&sR;~A18gim-zX*)0gXBzaM4)eo}gPx%RPDrhjhv{JHJ-^=86>IkK-0svcgXa(J=& z>6QBLPdj`&Y4Q4)|K3R=uXn0EU9b0ei|xmwA-gAA?4Dw|Ym(*mdhSDgst0@3-p=EB zyhMLvt<{TmrT_o`Gms7xf3h$#Fz7MpfV6`A#K4y7FulM-M@&$%^VugyiB@JWm4pZr ztLEoRm=;D^FHh$zVNj8g2z`~gNnp?QtrMT{iHL+>nf!0x^Y5i~vQ@>670nH`?Jce~ mW!?Td+WbsBGK#u7{>nO2rYY)3`|HW+EL*0uc$JGIgEasv#fKRH literal 0 HcmV?d00001 diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/repository_disconnected.gif b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/repository_disconnected.gif new file mode 100644 index 0000000000000000000000000000000000000000..4576dc5635fc40f20c0ad41d96b081e891bf8633 GIT binary patch literal 209 zcmZ?wbhEHb6krfwIKsg2?%lK7w@y8Jc;(6C8&@tJeD(6dwJS$%-#mTq&iQ+HF5J3) z;_9Wt=T7Z7eSF*H^ZU-9-gW2ZnZx^5pEczu{_pUy?XYIbNix2N!yLs)>gIiY~ zI(YE^|Njg~K=CIFBLjmpgAPaxWG4fw-vhP2l*p`%RWlbob8wibb17?=m(BGxZh}qB z%1ImNsxix+^|+*v+>!b|vg1=;h<5Q4pRlD7>&vv*=Iix0EDSuE6FuY0uBOWEAsW-} Ji7+u(0{~PHYlr{< literal 0 HcmV?d00001 diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/workspace.gif b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/workspace.gif new file mode 100644 index 0000000000000000000000000000000000000000..0df0f5dacd545e652debd97a6a8ee9842f6f2f96 GIT binary patch literal 358 zcmZ?wbhEHb6krfwxXQrrntkPT2`)iZP@J9x-GD4NAi^YxpNK|&Oh3)@^t&!b2E2cyYu?l z`Ny{dr)3vz@3x*E?K~&Re{pW?>dMSb&BjfBb*28*#Q_~vKFwu*vs+xJGOAcl@EIM*h`O%DoP7%)5A6m0due;%3k#U&i!w!aJdHfvBQx`0rxc*8`t`0*D zLmPumgNrVwl9UwZ1l_JO4Q?4l#p&D{rMVTFTndbgTuU`w%CtD-rKLI6YXz#YDa*-i ZWm5}OXJ_5Nk6k@b_2{vqDuIp+)&TZCko^Dv literal 0 HcmV?d00001 diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/workspace_connected.png b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/workspace_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..0430baaf50765aa5c313b3da35d3d2ad5092f2d0 GIT binary patch literal 498 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMffdHQn*Qt#iQyV)wt9y$IC&#DE zO-PxS03=iACa2GgPn{bUKQAz5aZv0c*U%NNVJp0%mbOkjVd=ltGGL8;$SMuD&3c|2 z^u0Ffdu=fFTRUm%n@QW=OxpT-(ze%gkA9ka?9;rXpXMF=wDQ`|l~;ePy!K<`!@s{? z&ii(M+W(J-{=eS*=3@8%r%V3d>iiEBxmf!DYVG5LwKq2vURYCcac$*=HI@It0O(RY z;D%)CX`r-ONswPKL_LWl!@_<)L!b$aN#5=*_IAkzr9cj6fk$L9koEv$x0Bg+Kt`vh zi(`ny<AEIQcD@AqbASA9v%ZozqTFR<<1)U%4zb-%jBWwMK#pi#lx%#VY-?ue4er>q-cjMi^8}9$x`0(%F2S@%qzVLhd z>}6d|^V(Yf|NjqkFIEsNey9{EVNnv~7YtNJ4q&j35j+JngE7h5-NoK6*#Kl9XMsm# zF_88EW4Dvpc0fjxr;B5V#N}iIcV?a&tUiqlkq6G)xN)L|QSHEy6H6AaR8dtr!@=ak z^K4JjuQs+efd$8pa)+E)vzD9vjDm55sY%FI1&67uDhHM=TDORYG3$*2BVT2uYo*2m z7S0c+6dB|_90J0Ef~1&4Djb-Y9xZw#^vKBQk;5!$6@?@HECrQ(oD2+&b{Zbe>4Mxq P*D!dx`njxgN@xNA4VCJx literal 0 HcmV?d00001 diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/pom.xml b/eclipse/runtime/org.argeo.eclipse.ui.jcr/pom.xml index fe336bd93..6fe7b680e 100644 --- a/eclipse/runtime/org.argeo.eclipse.ui.jcr/pom.xml +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/pom.xml @@ -34,6 +34,7 @@ org.eclipse.swt, * + org.eclipse.ui;resolution:=optional,org.eclipse.rap.ui;resolution:=optional,org.eclipse.core.runtime diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/JcrUiPlugin.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/JcrUiPlugin.java new file mode 100644 index 000000000..bc409830e --- /dev/null +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/JcrUiPlugin.java @@ -0,0 +1,13 @@ +package org.argeo.eclipse.ui.jcr; + +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.ui.plugin.AbstractUIPlugin; + +public class JcrUiPlugin extends AbstractUIPlugin { + public final static String ID = "org.argeo.eclipse.ui.jcr"; + + public static ImageDescriptor getImageDescriptor(String path) { + return imageDescriptorFromPlugin(ID, path); + } + +} diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/ItemComparator.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/ItemComparator.java new file mode 100644 index 000000000..20519377b --- /dev/null +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/ItemComparator.java @@ -0,0 +1,20 @@ +package org.argeo.eclipse.ui.jcr.browser; + +import java.util.Comparator; + +import javax.jcr.Item; +import javax.jcr.RepositoryException; + +import org.argeo.ArgeoException; + +public class ItemComparator implements Comparator { + public int compare(Item o1, Item o2) { + try { + // TODO: put folder before files + return o1.getName().compareTo(o2.getName()); + } catch (RepositoryException e) { + throw new ArgeoException("Cannot compare " + o1 + " and " + o2, e); + } + } + +} diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/NodeContentProvider.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/NodeContentProvider.java new file mode 100644 index 000000000..f8a5de98f --- /dev/null +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/NodeContentProvider.java @@ -0,0 +1,105 @@ +package org.argeo.eclipse.ui.jcr.browser; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import javax.jcr.Node; +import javax.jcr.NodeIterator; +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.Session; + +import org.argeo.ArgeoException; +import org.argeo.jcr.RepositoryRegister; +import org.eclipse.jface.viewers.ITreeContentProvider; +import org.eclipse.jface.viewers.Viewer; + +public class NodeContentProvider implements ITreeContentProvider { + private ItemComparator itemComparator = new ItemComparator(); + + public Object[] getElements(Object inputElement) { + return getChildren(inputElement); + } + + public Object[] getChildren(Object parentElement) { + if (parentElement instanceof Node) { + return childrenNodes((Node) parentElement); + } else if (parentElement instanceof RepositoryNode) { + return ((RepositoryNode) parentElement).getChildren(); + } else if (parentElement instanceof WorkspaceNode) { + Session session = ((WorkspaceNode) parentElement).getSession(); + if (session == null) + return new Object[0]; + + try { + return childrenNodes(session.getRootNode()); + } catch (RepositoryException e) { + throw new ArgeoException("Cannot retrieve root node of " + + session, e); + } + } else if (parentElement instanceof RepositoryRegister) { + RepositoryRegister repositoryRegister = (RepositoryRegister) parentElement; + List nodes = new ArrayList(); + Map repositories = repositoryRegister + .getRepositories(); + for (String name : repositories.keySet()) { + nodes.add(new RepositoryNode(name, repositories.get(name))); + } + return nodes.toArray(); + } else { + return new Object[0]; + } + } + + public Object getParent(Object element) { + try { + if (element instanceof Node) { + Node node = (Node) element; + return node.getParent(); + } + return null; + } catch (RepositoryException e) { + return null; + } + } + + public boolean hasChildren(Object element) { + try { + if (element instanceof Node) { + return ((Node) element).hasNodes(); + } else if (element instanceof RepositoryNode) { + return ((RepositoryNode) element).hasChildren(); + } else if (element instanceof WorkspaceNode) { + return ((WorkspaceNode) element).getSession() != null; + } + return false; + } catch (RepositoryException e) { + throw new ArgeoException("Cannot check children of " + element, e); + } + } + + public void dispose() { + } + + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + } + + protected Object[] childrenNodes(Node parentNode) { + try { + List children = new ArrayList(); + NodeIterator nit = parentNode.getNodes(); + while (nit.hasNext()) { + Node node = nit.nextNode(); + children.add(node); + } + Node[] arr = children.toArray(new Node[children.size()]); + Arrays.sort(arr, itemComparator); + return arr; + } catch (RepositoryException e) { + throw new ArgeoException("Cannot list children of " + parentNode, e); + } + } + +} diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/NodeLabelProvider.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/NodeLabelProvider.java new file mode 100644 index 000000000..3d5ef58a4 --- /dev/null +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/NodeLabelProvider.java @@ -0,0 +1,81 @@ +package org.argeo.eclipse.ui.jcr.browser; + +import javax.jcr.Node; +import javax.jcr.RepositoryException; +import javax.jcr.nodetype.NodeType; + +import org.argeo.ArgeoException; +import org.argeo.eclipse.ui.jcr.JcrUiPlugin; +import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.swt.graphics.Image; + +public class NodeLabelProvider extends LabelProvider { + // Images + public final static Image NODE = JcrUiPlugin.getImageDescriptor( + "icons/node.gif").createImage(); + public final static Image FOLDER = JcrUiPlugin.getImageDescriptor( + "icons/folder.gif").createImage(); + public final static Image FILE = JcrUiPlugin.getImageDescriptor( + "icons/file.gif").createImage(); + public final static Image BINARY = JcrUiPlugin.getImageDescriptor( + "icons/binary.png").createImage(); + + public String getText(Object element) { + try { + if (element instanceof Node) { + Node node = (Node) element; + String label = node.getName(); + // try { + // Item primaryItem = node.getPrimaryItem(); + // label = primaryItem instanceof Property ? ((Property) + // primaryItem) + // .getValue().getString() + // + " (" + // + node.getName() + // + ")" : node.getName(); + // } catch (RepositoryException e) { + // label = node.getName(); + // } + StringBuffer mixins = new StringBuffer(""); + for (NodeType type : node.getMixinNodeTypes()) + mixins.append(' ').append(type.getName()); + + return label + " [" + node.getPrimaryNodeType().getName() + + mixins + "]"; + } + return element.toString(); + } catch (RepositoryException e) { + throw new ArgeoException("Cannot get text for of " + element, e); + } + } + + @Override + public Image getImage(Object element) { + if (element instanceof Node) { + Node node = (Node) element; + try { + if (node.getPrimaryNodeType().isNodeType(NodeType.NT_FOLDER)) + return FOLDER; + else if (node.getPrimaryNodeType().isNodeType(NodeType.NT_FILE)) + return FILE; + else if (node.getPrimaryNodeType().isNodeType( + NodeType.NT_RESOURCE)) + return BINARY; + } catch (RepositoryException e) { + // silent + } + return NODE; + } else if (element instanceof RepositoryNode) { + if (((RepositoryNode) element).getDefaultSession() == null) + return RepositoryNode.REPOSITORY_DISCONNECTED; + else + return RepositoryNode.REPOSITORY_CONNECTED; + } else if (element instanceof WorkspaceNode) { + if (((WorkspaceNode) element).getSession() == null) + return WorkspaceNode.WORKSPACE_DISCONNECTED; + else + return WorkspaceNode.WORKSPACE_CONNECTED; + } + return super.getImage(element); + } +} diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/PropertiesContentProvider.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/PropertiesContentProvider.java new file mode 100644 index 000000000..68f6fdc77 --- /dev/null +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/PropertiesContentProvider.java @@ -0,0 +1,40 @@ +package org.argeo.eclipse.ui.jcr.browser; + +import java.util.Set; +import java.util.TreeSet; + +import javax.jcr.Node; +import javax.jcr.Property; +import javax.jcr.PropertyIterator; +import javax.jcr.RepositoryException; + +import org.argeo.ArgeoException; +import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.jface.viewers.Viewer; + +public class PropertiesContentProvider implements IStructuredContentProvider { + private ItemComparator itemComparator = new ItemComparator(); + + public void dispose() { + } + + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { + } + + public Object[] getElements(Object inputElement) { + try { + if (inputElement instanceof Node) { + Set props = new TreeSet(itemComparator); + PropertyIterator pit = ((Node) inputElement).getProperties(); + while (pit.hasNext()) + props.add(pit.nextProperty()); + return props.toArray(); + } + return new Object[] {}; + } catch (RepositoryException e) { + throw new ArgeoException("Cannot get element for " + inputElement, + e); + } + } + +} diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/RepositoryNode.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/RepositoryNode.java new file mode 100644 index 000000000..7158c749b --- /dev/null +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/RepositoryNode.java @@ -0,0 +1,49 @@ +package org.argeo.eclipse.ui.jcr.browser; + +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.Session; + +import org.argeo.ArgeoException; +import org.argeo.eclipse.ui.TreeParent; +import org.argeo.eclipse.ui.jcr.JcrUiPlugin; +import org.eclipse.swt.graphics.Image; + +public class RepositoryNode extends TreeParent { + private final String name; + private final Repository repository; + private Session defaultSession = null; + public final static Image REPOSITORY_DISCONNECTED = JcrUiPlugin + .getImageDescriptor("icons/repository_disconnected.gif") + .createImage(); + public final static Image REPOSITORY_CONNECTED = JcrUiPlugin + .getImageDescriptor("icons/repository_connected.gif").createImage(); + + public RepositoryNode(String name, Repository repository) { + super(name); + this.name = name; + this.repository = repository; + } + + public void login() { + try { + defaultSession = repository.login(); + String[] wkpNames = defaultSession.getWorkspace() + .getAccessibleWorkspaceNames(); + for (String wkpName : wkpNames) { + if (wkpName.equals(defaultSession.getWorkspace().getName())) + addChild(new WorkspaceNode(repository, wkpName, + defaultSession)); + else + addChild(new WorkspaceNode(repository, wkpName)); + } + } catch (RepositoryException e) { + throw new ArgeoException("Cannot connect to repository " + name, e); + } + } + + public Session getDefaultSession() { + return defaultSession; + } + +} diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/WorkspaceNode.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/WorkspaceNode.java new file mode 100644 index 000000000..8cbf1a2b1 --- /dev/null +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/WorkspaceNode.java @@ -0,0 +1,107 @@ +package org.argeo.eclipse.ui.jcr.browser; + +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.observation.EventIterator; +import javax.jcr.observation.EventListener; + +import org.argeo.ArgeoException; +import org.argeo.eclipse.ui.TreeParent; +import org.argeo.eclipse.ui.jcr.JcrUiPlugin; +import org.eclipse.swt.graphics.Image; + +public class WorkspaceNode extends TreeParent implements EventListener { + private final String name; + private final Repository repository; + private Session session = null; + public final static Image WORKSPACE_DISCONNECTED = JcrUiPlugin + .getImageDescriptor("icons/workspace_disconnected.png") + .createImage(); + public final static Image WORKSPACE_CONNECTED = JcrUiPlugin + .getImageDescriptor("icons/workspace_connected.png").createImage(); + + public WorkspaceNode(Repository repository, String name) { + this(repository, name, null); + } + + public WorkspaceNode(Repository repository, String name, Session session) { + super(name); + this.name = name; + this.repository = repository; + this.session = session; + if (session != null) + processNewSession(session); + } + + public Session getSession() { + return session; + } + + public void login() { + try { + logout(); + session = repository.login(name); + processNewSession(session); + } catch (RepositoryException e) { + throw new ArgeoException("Cannot connect to repository " + name, e); + } + } + + public void logout() { + try { + if (session != null && session.isLive()) { + session.getWorkspace().getObservationManager() + .removeEventListener(this); + session.logout(); + } + } catch (RepositoryException e) { + throw new ArgeoException("Cannot connect to repository " + name, e); + } + } + + public void onEvent(final EventIterator events) { + // if (session == null) + // return; + // Display.getDefault().syncExec(new Runnable() { + // public void run() { + // while (events.hasNext()) { + // Event event = events.nextEvent(); + // try { + // String path = event.getPath(); + // String parentPath = path.substring(0, + // path.lastIndexOf('/')); + // final Object parent; + // if (parentPath.equals("/") || parentPath.equals("")) + // parent = this; + // else if (session.itemExists(parentPath)){ + // parent = session.getItem(parentPath); + // ((Item)parent).refresh(false); + // } + // else + // parent = null; + // if (parent != null) { + // nodesViewer.refresh(parent); + // } + // + // } catch (RepositoryException e) { + // log.warn("Error processing event " + event, e); + // } + // } + // } + // }); + } + + protected void processNewSession(Session session) { + // try { + // ObservationManager observationManager = session.getWorkspace() + // .getObservationManager(); + // observationManager.addEventListener(this, Event.NODE_ADDED + // | Event.NODE_REMOVED, "/", true, null, null, false); + // } catch (RepositoryException e) { + // throw new ArgeoException("Cannot process new session " + // + session, e); + // } + } + +} diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/commands/AddFileFolder.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/commands/AddFileFolder.java new file mode 100644 index 000000000..4dc0dbec1 --- /dev/null +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/commands/AddFileFolder.java @@ -0,0 +1,50 @@ +package org.argeo.eclipse.ui.jcr.commands; + +import javax.jcr.Node; +import javax.jcr.RepositoryException; +import javax.jcr.nodetype.NodeType; + +import org.argeo.eclipse.ui.dialogs.Error; +import org.argeo.eclipse.ui.dialogs.SingleValue; +import org.argeo.eclipse.ui.jcr.views.GenericJcrBrowser; +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.ui.handlers.HandlerUtil; + +public class AddFileFolder extends AbstractHandler { + + public Object execute(ExecutionEvent event) throws ExecutionException { + ISelection selection = HandlerUtil.getActiveWorkbenchWindow(event) + .getActivePage().getSelection(); + GenericJcrBrowser view = (GenericJcrBrowser) HandlerUtil + .getActiveWorkbenchWindow(event).getActivePage() + .findView(HandlerUtil.getActivePartId(event)); + if (selection != null && !selection.isEmpty() + && selection instanceof IStructuredSelection) { + Object obj = ((IStructuredSelection) selection).getFirstElement(); + if (obj instanceof Node) { + String folderName = SingleValue.ask("Folder name", + "Enter folder name"); + if (folderName != null) { + Node parentNode = (Node) obj; + try { + Node newNode = parentNode.addNode(folderName, + NodeType.NT_FOLDER); + view.nodeAdded(parentNode, newNode); + parentNode.getSession().save(); + } catch (RepositoryException e) { + Error.show("Cannot create folder " + folderName + + " under " + parentNode, e); + } + } + } else { + Error.show("Can only add file folder to a node"); + } + } + return null; + } + +} diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/commands/DeleteNode.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/commands/DeleteNode.java new file mode 100644 index 000000000..93304fd70 --- /dev/null +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/commands/DeleteNode.java @@ -0,0 +1,47 @@ +package org.argeo.eclipse.ui.jcr.commands; + +import java.util.Iterator; + +import javax.jcr.Node; + +import org.argeo.eclipse.ui.dialogs.Error; +import org.argeo.eclipse.ui.jcr.views.GenericJcrBrowser; +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.ui.handlers.HandlerUtil; + +/** Deletes the selected nodes */ +public class DeleteNode extends AbstractHandler { + + public Object execute(ExecutionEvent event) throws ExecutionException { + ISelection selection = HandlerUtil.getActiveWorkbenchWindow(event) + .getActivePage().getSelection(); + GenericJcrBrowser view = (GenericJcrBrowser) HandlerUtil + .getActiveWorkbenchWindow(event).getActivePage() + .findView(HandlerUtil.getActivePartId(event)); + if (selection != null && selection instanceof IStructuredSelection) { + Iterator it = ((IStructuredSelection) selection).iterator(); + + Object obj = null; + try { + while (it.hasNext()) { + obj = it.next(); + if (obj instanceof Node) { + Node node = (Node) obj; + Node parentNode = node.getParent(); + node.remove(); + view.nodeRemoved(parentNode); + node.getSession().save(); + } + } + } catch (Exception e) { + Error.show("Cannot delete node " + obj, e); + } + } + return null; + } + +} diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/commands/ImportFileSystem.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/commands/ImportFileSystem.java new file mode 100644 index 000000000..dcaf137ed --- /dev/null +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/commands/ImportFileSystem.java @@ -0,0 +1,51 @@ +package org.argeo.eclipse.ui.jcr.commands; + +import javax.jcr.Node; + +import org.argeo.eclipse.ui.dialogs.Error; +import org.argeo.eclipse.ui.jcr.views.GenericJcrBrowser; +import org.argeo.eclipse.ui.jcr.wizards.ImportFileSystemWizard; +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.wizard.WizardDialog; +import org.eclipse.ui.handlers.HandlerUtil; + +public class ImportFileSystem extends AbstractHandler { + + public Object execute(ExecutionEvent event) throws ExecutionException { + ISelection selection = HandlerUtil.getActiveWorkbenchWindow(event) + .getActivePage().getSelection(); + GenericJcrBrowser view = (GenericJcrBrowser) HandlerUtil + .getActiveWorkbenchWindow(event).getActivePage() + .findView(HandlerUtil.getActivePartId(event)); + if (selection != null && !selection.isEmpty() + && selection instanceof IStructuredSelection) { + Object obj = ((IStructuredSelection) selection).getFirstElement(); + try { + if (obj instanceof Node) { + Node folder = (Node) obj; +// if (!folder.getPrimaryNodeType().getName() +// .equals(NodeType.NT_FOLDER)) { +// Error.show("Can only import to a folder node"); +// return null; +// } + ImportFileSystemWizard wizard = new ImportFileSystemWizard( + folder); + WizardDialog dialog = new WizardDialog( + HandlerUtil.getActiveShell(event), wizard); + dialog.open(); + view.refresh(folder); + } else { + Error.show("Can only import to a node"); + } + } catch (Exception e) { + Error.show("Cannot import files to " + obj, e); + } + } + return null; + } + +} diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/commands/InitUserHome.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/commands/InitUserHome.java new file mode 100644 index 000000000..6bc5dff9f --- /dev/null +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/commands/InitUserHome.java @@ -0,0 +1,47 @@ +package org.argeo.eclipse.ui.jcr.commands; + +import javax.jcr.Node; +import javax.jcr.Session; + +import org.argeo.eclipse.ui.dialogs.Error; +import org.argeo.jcr.ArgeoNames; +import org.argeo.jcr.ArgeoTypes; +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; + +/** Init the user home directory within the node */ +public class InitUserHome extends AbstractHandler { + private Session session; + + private String defaultHome = "home"; + + public Object execute(ExecutionEvent event) throws ExecutionException { + String userID = ""; + try { + userID = session.getUserID(); + Node rootNode = session.getRootNode(); + Node homeNode; + if (!rootNode.hasNode(defaultHome)) { + homeNode = rootNode.addNode(defaultHome, ArgeoTypes.ARGEO_HOME); + } else { + homeNode = rootNode.getNode(defaultHome); + } + + if (!homeNode.hasNode(userID)) { + Node userHome = homeNode.addNode(userID); + userHome.addMixin(ArgeoTypes.ARGEO_USER_HOME); + userHome.setProperty(ArgeoNames.ARGEO_USER_ID, userID); + } + session.save(); + } catch (Exception e) { + Error.show("Cannot initialize home for user '" + userID + "'", e); + } + return null; + } + + public void setSession(Session session) { + this.session = session; + } + +} diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/commands/Refresh.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/commands/Refresh.java new file mode 100644 index 000000000..699a96db2 --- /dev/null +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/commands/Refresh.java @@ -0,0 +1,31 @@ +package org.argeo.eclipse.ui.jcr.commands; + +import java.util.Iterator; + +import org.argeo.eclipse.ui.jcr.views.GenericJcrBrowser; +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.ui.handlers.HandlerUtil; + +/** Refresh one of the view */ +public class Refresh extends AbstractHandler { + + public Object execute(ExecutionEvent event) throws ExecutionException { + ISelection selection = HandlerUtil.getActiveWorkbenchWindow(event) + .getActivePage().getSelection(); + GenericJcrBrowser view = (GenericJcrBrowser) HandlerUtil + .getActiveWorkbenchWindow(event).getActivePage() + .findView(HandlerUtil.getActivePartId(event)); + if (selection != null && selection instanceof IStructuredSelection) { + Iterator it = ((IStructuredSelection) selection).iterator(); + while (it.hasNext()) { + Object obj = it.next(); + view.refresh(obj); + } + } + return null; + } +} diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/dialogs/ChooseNameDialog.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/dialogs/ChooseNameDialog.java new file mode 100644 index 000000000..267e51e3e --- /dev/null +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/dialogs/ChooseNameDialog.java @@ -0,0 +1,52 @@ +package org.argeo.eclipse.ui.jcr.dialogs; + +import org.eclipse.jface.dialogs.IMessageProvider; +import org.eclipse.jface.dialogs.TitleAreaDialog; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +/** Dialog to change the current user password */ +public class ChooseNameDialog extends TitleAreaDialog { + private Text nameT; + + public ChooseNameDialog(Shell parentShell) { + super(parentShell); + setTitle("Choose name"); + } + + protected Point getInitialSize() { + return new Point(300, 250); + } + + protected Control createDialogArea(Composite parent) { + Composite dialogarea = (Composite) super.createDialogArea(parent); + dialogarea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + Composite composite = new Composite(dialogarea, SWT.NONE); + composite.setLayout(new GridLayout(2, false)); + composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + nameT = createLT(composite, "Name"); + + setMessage("Choose name", IMessageProvider.INFORMATION); + parent.pack(); + return composite; + } + + /** Creates label and text. */ + protected Text createLT(Composite parent, String label) { + new Label(parent, SWT.NONE).setText(label); + Text text = new Text(parent, SWT.SINGLE | SWT.LEAD | SWT.BORDER); + text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + return text; + } + + public String getName() { + return nameT.getText(); + } +} diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/editors/AbstractJcrQueryEditor.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/editors/AbstractJcrQueryEditor.java index 76ea5508e..dbe4a5576 100644 --- a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/editors/AbstractJcrQueryEditor.java +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/editors/AbstractJcrQueryEditor.java @@ -239,22 +239,22 @@ public abstract class AbstractJcrQueryEditor extends EditorPart { if (true) return; - try { - - comparator.setColumn(index); - int dir = viewer.getTable().getSortDirection(); - if (viewer.getTable().getSortColumn() == column) { - dir = dir == SWT.UP ? SWT.DOWN : SWT.UP; - } else { - - dir = SWT.DOWN; - } - viewer.getTable().setSortDirection(dir); - viewer.getTable().setSortColumn(column); - viewer.refresh(); - } catch (Exception exc) { - exc.printStackTrace(); - } +// try { +// +// comparator.setColumn(index); +// int dir = viewer.getTable().getSortDirection(); +// if (viewer.getTable().getSortColumn() == column) { +// dir = dir == SWT.UP ? SWT.DOWN : SWT.UP; +// } else { +// +// dir = SWT.DOWN; +// } +// viewer.getTable().setSortDirection(dir); +// viewer.getTable().setSortColumn(column); +// viewer.refresh(); +// } catch (Exception exc) { +// exc.printStackTrace(); +// } } }; return selectionAdapter; diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/views/GenericJcrBrowser.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/views/GenericJcrBrowser.java index e39bc5659..eb2362967 100644 --- a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/views/GenericJcrBrowser.java +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/views/GenericJcrBrowser.java @@ -1,71 +1,44 @@ package org.argeo.eclipse.ui.jcr.views; -import java.util.ArrayList; import java.util.Arrays; -import java.util.Comparator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; -import javax.jcr.Item; -import javax.jcr.LoginException; import javax.jcr.Node; -import javax.jcr.NodeIterator; import javax.jcr.Property; -import javax.jcr.PropertyIterator; import javax.jcr.PropertyType; -import javax.jcr.Repository; import javax.jcr.RepositoryException; -import javax.jcr.Session; -import javax.jcr.nodetype.NodeType; import org.argeo.ArgeoException; -import org.argeo.eclipse.ui.TreeParent; +import org.argeo.eclipse.ui.jcr.browser.NodeContentProvider; +import org.argeo.eclipse.ui.jcr.browser.NodeLabelProvider; +import org.argeo.eclipse.ui.jcr.browser.PropertiesContentProvider; +import org.argeo.eclipse.ui.jcr.browser.RepositoryNode; +import org.argeo.eclipse.ui.jcr.browser.WorkspaceNode; import org.argeo.jcr.RepositoryRegister; +import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.ITreeContentProvider; -import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; -import org.eclipse.jface.viewers.TreeNode; import org.eclipse.jface.viewers.TreeViewer; -import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.SashForm; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.part.ViewPart; public class GenericJcrBrowser extends ViewPart { - // private final static Log log = - // LogFactory.getLog(GenericJcrBrowser.class); - private TreeViewer nodesViewer; private TableViewer propertiesViewer; - // private Session jcrSession; private RepositoryRegister repositoryRegister; - private Comparator itemComparator = new Comparator() { - public int compare(Item o1, Item o2) { - try { - return o1.getName().compareTo(o2.getName()); - } catch (RepositoryException e) { - throw new ArgeoException("Cannot compare " + o1 + " and " + o2, - e); - } - } - }; - @Override public void createPartControl(Composite parent) { parent.setLayout(new FillLayout()); @@ -78,6 +51,7 @@ public class GenericJcrBrowser extends ViewPart { GridLayout gl = new GridLayout(1, false); top.setLayout(gl); + // nodes viewer nodesViewer = new TreeViewer(top, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); nodesViewer.getTree().setLayoutData( @@ -98,21 +72,35 @@ public class GenericJcrBrowser extends ViewPart { }); nodesViewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { + if (event.getSelection() == null + || event.getSelection().isEmpty()) + return; Object obj = ((IStructuredSelection) event.getSelection()) .getFirstElement(); if (obj instanceof RepositoryNode) { ((RepositoryNode) obj).login(); + nodesViewer.refresh(obj); } else if (obj instanceof WorkspaceNode) { ((WorkspaceNode) obj).login(); + nodesViewer.refresh(obj); } } }); + + // context menu + MenuManager menuManager = new MenuManager(); + Menu menu = menuManager.createContextMenu(nodesViewer.getTree()); + nodesViewer.getTree().setMenu(menu); + getSite().registerContextMenu(menuManager, nodesViewer); + getSite().setSelectionProvider(nodesViewer); + nodesViewer.setInput(repositoryRegister); Composite bottom = new Composite(sashForm, SWT.NONE); bottom.setLayout(new GridLayout(1, false)); + // properties viewer propertiesViewer = new TableViewer(bottom); propertiesViewer.getTable().setLayoutData( new GridData(SWT.FILL, SWT.FILL, true, true)); @@ -185,236 +173,23 @@ public class GenericJcrBrowser extends ViewPart { return new int[] { 70, 30 }; } - public void setRepositoryRegister(RepositoryRegister repositoryRegister) { - this.repositoryRegister = repositoryRegister; - } - /* - * NODES + * NOTIFICATION */ - protected Object[] childrenNodes(Node parentNode) { - try { - List children = new ArrayList(); - NodeIterator nit = parentNode.getNodes(); - while (nit.hasNext()) { - Node node = nit.nextNode(); - children.add(node); - } - Node[] arr = children.toArray(new Node[children.size()]); - Arrays.sort(arr, itemComparator); - return arr; - } catch (RepositoryException e) { - throw new ArgeoException("Cannot list children of " + parentNode, e); - } - } - - private class NodeContentProvider implements ITreeContentProvider { - - public Object[] getElements(Object inputElement) { - return getChildren(inputElement); - } - - public Object[] getChildren(Object parentElement) { - if (parentElement instanceof Node) { - return childrenNodes((Node) parentElement); - } else if (parentElement instanceof RepositoryNode) { - return ((RepositoryNode) parentElement).getChildren(); - } else if (parentElement instanceof WorkspaceNode) { - Session session = ((WorkspaceNode) parentElement).getSession(); - if (session == null) - return new Object[0]; - - try { - return childrenNodes(session.getRootNode()); - } catch (RepositoryException e) { - throw new ArgeoException("Cannot retrieve root node of " - + session, e); - } - } else if (parentElement instanceof RepositoryRegister) { - RepositoryRegister repositoryRegister = (RepositoryRegister) parentElement; - List nodes = new ArrayList(); - Map repositories = repositoryRegister - .getRepositories(); - for (String name : repositories.keySet()) { - nodes.add(new RepositoryNode(name, repositories.get(name))); - } - return nodes.toArray(); - } else { - return new Object[0]; - } - } - - public Object getParent(Object element) { - try { - if (element instanceof Node) { - return ((Node) element).getParent(); - } - return null; - } catch (RepositoryException e) { - throw new ArgeoException( - "Cannot retrieve parent of " + element, e); - } - } - - public boolean hasChildren(Object element) { - try { - if (element instanceof Node) { - return ((Node) element).hasNodes(); - } else if (element instanceof RepositoryNode) { - return ((RepositoryNode) element).hasChildren(); - } else if (element instanceof WorkspaceNode) { - return ((WorkspaceNode) element).getSession() != null; - } - return false; - } catch (RepositoryException e) { - throw new ArgeoException("Cannot check children of " + element, - e); - } - } - - public void dispose() { - } - - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - } - - } - - class NodeLabelProvider extends LabelProvider { - - public String getText(Object element) { - try { - if (element instanceof Node) { - Node node = (Node) element; - String label = node.getName(); - // try { - // Item primaryItem = node.getPrimaryItem(); - // label = primaryItem instanceof Property ? ((Property) - // primaryItem) - // .getValue().getString() - // + " (" - // + node.getName() - // + ")" : node.getName(); - // } catch (RepositoryException e) { - // label = node.getName(); - // } - StringBuffer mixins = new StringBuffer(""); - for (NodeType type : node.getMixinNodeTypes()) - mixins.append(' ').append(type.getName()); - - return label + " [" + node.getPrimaryNodeType().getName() - + mixins + "]"; - } - return element.toString(); - } catch (RepositoryException e) { - throw new ArgeoException("Cannot get text for of " + element, e); - } - } - + public void refresh(Object obj) { + nodesViewer.refresh(obj); } - /* - * PROPERTIES - */ - private class PropertiesContentProvider implements - IStructuredContentProvider { - - public void dispose() { - } - - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - } - - public Object[] getElements(Object inputElement) { - try { - if (inputElement instanceof Node) { - Set props = new TreeSet(itemComparator); - PropertyIterator pit = ((Node) inputElement) - .getProperties(); - while (pit.hasNext()) - props.add(pit.nextProperty()); - return props.toArray(); - } - return new Object[] {}; - } catch (RepositoryException e) { - throw new ArgeoException("Cannot get element for " - + inputElement, e); - } - } - + public void nodeAdded(Node parentNode, Node newNode) { + nodesViewer.refresh(parentNode); + nodesViewer.expandToLevel(newNode, 0); } - private class RepositoryNode extends TreeParent { - private final String name; - private final Repository repository; - private Session defaultSession = null; - - public RepositoryNode(String name, Repository repository) { - super(name); - this.name = name; - this.repository = repository; - } - - public Repository getRepository() { - return repository; - } - - public Session getDefaultSession() { - return defaultSession; - } - - public void login() { - try { - defaultSession = repository.login(); - String[] wkpNames = defaultSession.getWorkspace() - .getAccessibleWorkspaceNames(); - for (String wkpName : wkpNames) { - if (wkpName.equals(defaultSession.getWorkspace().getName())) - addChild(new WorkspaceNode(repository, wkpName, - defaultSession)); - else - addChild(new WorkspaceNode(repository, wkpName)); - } - nodesViewer.refresh(this); - } catch (RepositoryException e) { - throw new ArgeoException( - "Cannot connect to repository " + name, e); - } - } + public void nodeRemoved(Node parentNode) { + nodesViewer.refresh(parentNode); } - private class WorkspaceNode extends TreeParent { - private final String name; - private final Repository repository; - private Session session = null; - - public WorkspaceNode(Repository repository, String name) { - this(repository, name, null); - } - - public WorkspaceNode(Repository repository, String name, Session session) { - super(name); - this.name = name; - this.repository = repository; - this.session = session; - } - - public Session getSession() { - return session; - } - - public void login() { - try { - if (session != null) - session.logout(); - - session = repository.login(name); - nodesViewer.refresh(this); - } catch (RepositoryException e) { - throw new ArgeoException( - "Cannot connect to repository " + name, e); - } - } - + public void setRepositoryRegister(RepositoryRegister repositoryRegister) { + this.repositoryRegister = repositoryRegister; } } diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/wizards/ImportFileSystemWizard.java b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/wizards/ImportFileSystemWizard.java new file mode 100644 index 000000000..b10b066d4 --- /dev/null +++ b/eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/wizards/ImportFileSystemWizard.java @@ -0,0 +1,189 @@ +package org.argeo.eclipse.ui.jcr.wizards; + +import java.io.File; +import java.io.FileInputStream; + +import javax.jcr.Binary; +import javax.jcr.Node; +import javax.jcr.Property; +import javax.jcr.nodetype.NodeType; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.ArgeoException; +import org.argeo.eclipse.ui.dialogs.Error; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.jface.preference.DirectoryFieldEditor; +import org.eclipse.jface.wizard.Wizard; +import org.eclipse.jface.wizard.WizardPage; +import org.eclipse.swt.widgets.Composite; + +public class ImportFileSystemWizard extends Wizard { + private final static Log log = LogFactory + .getLog(ImportFileSystemWizard.class); + + private ImportFileSystemWizardPage page1; + private final Node folder; + + public ImportFileSystemWizard(Node folder) { + this.folder = folder; + setNeedsProgressMonitor(true); + setWindowTitle("Import from file system"); + } + + @Override + public void addPages() { + page1 = new ImportFileSystemWizardPage(); + addPage(page1); + } + + @Override + public boolean performFinish() { + final String directory = page1.getDirectory(); + if (directory == null || !new File(directory).exists()) { + Error.show("Directory " + directory + " does not exist"); + return false; + } + + Boolean failed = false; + final File dir = new File(directory).getAbsoluteFile(); + final Long sizeB = directorySize(dir, 0l); + final Stats stats = new Stats(); + Long begin = System.currentTimeMillis(); + try { + getContainer().run(true, true, new IRunnableWithProgress() { + public void run(IProgressMonitor monitor) { + try { + Integer sizeKB = (int) (sizeB / FileUtils.ONE_KB); + monitor.beginTask("", sizeKB); + importDirectory(folder, dir, monitor, stats); + monitor.done(); + } catch (Exception e) { + if (e instanceof RuntimeException) + throw (RuntimeException) e; + else + throw new ArgeoException("Cannot import " + + directory, e); + } + } + }); + } catch (Exception e) { + Error.show("Cannot import " + directory, e); + failed = true; + } + + Long duration = System.currentTimeMillis() - begin; + Long durationS = duration / 1000l; + String durationStr = (durationS / 60) + " min " + (durationS % 60) + + " s"; + StringBuffer message = new StringBuffer("Imported\n"); + message.append(stats.fileCount).append(" files\n"); + message.append(stats.dirCount).append(" directories\n"); + message.append(FileUtils.byteCountToDisplaySize(stats.sizeB)); + if (failed) + message.append(" of planned ").append( + FileUtils.byteCountToDisplaySize(sizeB)); + message.append("\n"); + message.append("in ").append(durationStr).append("\n"); + if (failed) + MessageDialog.openError(getShell(), "Import failed", + message.toString()); + else + MessageDialog.openInformation(getShell(), "Import successful", + message.toString()); + + return true; + } + + /** Recursively computes the size of the directory in bytes. */ + protected Long directorySize(File dir, Long currentSize) { + Long size = currentSize; + File[] files = dir.listFiles(); + for (File file : files) { + if (file.isDirectory()) { + size = directorySize(file, size); + } else { + size = size + file.length(); + } + } + return size; + } + + /** Recursively computes the size of the directory in bytes. */ + protected void importDirectory(Node folder, File dir, + IProgressMonitor monitor, Stats stats) { + try { + File[] files = dir.listFiles(); + for (File file : files) { + if (file.isDirectory()) { + Node childFolder = folder.addNode(file.getName(), + NodeType.NT_FOLDER); + importDirectory(childFolder, file, monitor, stats); + folder.getSession().save(); + stats.dirCount++; + } else { + Long fileSize = file.length(); + monitor.subTask(file.getName() + " (" + + FileUtils.byteCountToDisplaySize(fileSize) + ") " + + file.getCanonicalPath()); + try { + Node fileNode = folder.addNode(file.getName(), + NodeType.NT_FILE); + Node resNode = fileNode.addNode(Property.JCR_CONTENT, + NodeType.NT_RESOURCE); + Binary binary = null; + try { + binary = folder.getSession().getValueFactory() + .createBinary(new FileInputStream(file)); + resNode.setProperty(Property.JCR_DATA, binary); + } finally { + if (binary != null) + binary.dispose(); + } + folder.getSession().save(); + stats.fileCount++; + stats.sizeB = stats.sizeB + fileSize; + } catch (Exception e) { + log.warn("Import of " + file + " (" + + FileUtils.byteCountToDisplaySize(fileSize) + + ") failed: " + e); + folder.getSession().refresh(false); + } + monitor.worked((int) (fileSize / FileUtils.ONE_KB)); + } + } + } catch (Exception e) { + throw new ArgeoException("Cannot import " + dir + " to " + folder, + e); + } + } + + protected class ImportFileSystemWizardPage extends WizardPage { + private DirectoryFieldEditor dfe; + + public ImportFileSystemWizardPage() { + super("Import from file system"); + setDescription("Import files from the local file system into the JCR repository"); + } + + public void createControl(Composite parent) { + dfe = new DirectoryFieldEditor("directory", "From", + parent); + setControl(dfe.getTextControl(parent)); + } + + public String getDirectory() { + return dfe.getStringValue(); + } + + } + + static class Stats { + public Long fileCount = 0l; + public Long dirCount = 0l; + public Long sizeB = 0l; + } +} diff --git a/eclipse/runtime/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/ui/dialogs/Error.java b/eclipse/runtime/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/ui/dialogs/Error.java new file mode 100644 index 000000000..4a0f4fa0d --- /dev/null +++ b/eclipse/runtime/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/ui/dialogs/Error.java @@ -0,0 +1,80 @@ +package org.argeo.eclipse.ui.dialogs; + +import java.io.PrintWriter; +import java.io.StringWriter; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.eclipse.jface.dialogs.IMessageProvider; +import org.eclipse.jface.dialogs.TitleAreaDialog; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +public class Error extends TitleAreaDialog { + private final static Log log = LogFactory.getLog(Error.class); + + private final String message; + private final Throwable exception; + + public static void show(String message, Throwable e) { + new Error(Display.getDefault().getActiveShell(), message, e).open(); + } + + public static void show(String message) { + new Error(Display.getDefault().getActiveShell(), message, null).open(); + } + + public Error(Shell parentShell, String message, Throwable e) { + super(parentShell); + this.message = message; + this.exception = e; + log.error(message, e); + } + + protected Point getInitialSize() { + if (exception != null) + return new Point(800, 600); + else + return new Point(400, 300); + } + + @Override + protected Control createDialogArea(Composite parent) { + Composite dialogarea = (Composite) super.createDialogArea(parent); + dialogarea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + Composite composite = new Composite(dialogarea, SWT.NONE); + composite.setLayout(new GridLayout(2, false)); + composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + + setMessage(message != null ? message + + (exception != null ? ": " + exception.getMessage() : "") + : exception != null ? exception.getMessage() : "Unkown Error", + IMessageProvider.ERROR); + + if (exception != null) { + Text stack = new Text(composite, SWT.MULTI | SWT.LEAD + | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); + stack.setEditable(false); + stack.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + StringWriter sw = new StringWriter(); + exception.printStackTrace(new PrintWriter(sw)); + stack.setText(sw.toString()); + } + + parent.pack(); + return composite; + } + + protected void configureShell(Shell shell) { + super.configureShell(shell); + shell.setText("Error"); + } + +} diff --git a/eclipse/runtime/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/ui/dialogs/SingleValue.java b/eclipse/runtime/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/ui/dialogs/SingleValue.java new file mode 100644 index 000000000..d3e67978f --- /dev/null +++ b/eclipse/runtime/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/ui/dialogs/SingleValue.java @@ -0,0 +1,110 @@ +package org.argeo.eclipse.ui.dialogs; + +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.IMessageProvider; +import org.eclipse.jface.dialogs.TitleAreaDialog; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +/** Dialog to change the current user password */ +public class SingleValue extends TitleAreaDialog { + private Text valueT; + private String value; + private final String title, message, label; + private final Boolean multiline; + + public static String ask(String label, String message) { + SingleValue svd = new SingleValue(label, message); + if (svd.open() == Dialog.OK) + return svd.getString(); + else + return null; + } + + public static Long askLong(String label, String message) { + SingleValue svd = new SingleValue(label, message); + if (svd.open() == Dialog.OK) + return svd.getLong(); + else + return null; + } + + public static Double askDouble(String label, String message) { + SingleValue svd = new SingleValue(label, message); + if (svd.open() == Dialog.OK) + return svd.getDouble(); + else + return null; + } + + public SingleValue(String label, String message) { + this(Display.getDefault().getActiveShell(), label, message, label, + false); + } + + public SingleValue(Shell parentShell, String title, String message, + String label, Boolean multiline) { + super(parentShell); + this.title = title; + this.message = message; + this.label = label; + this.multiline = multiline; + } + + protected Point getInitialSize() { + return new Point(300, 250); + } + + protected Control createDialogArea(Composite parent) { + Composite dialogarea = (Composite) super.createDialogArea(parent); + dialogarea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + Composite composite = new Composite(dialogarea, SWT.NONE); + composite.setLayout(new GridLayout(2, false)); + composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + valueT = createLT(composite, label); + + setMessage(message, IMessageProvider.NONE); + parent.pack(); + return composite; + } + + @Override + protected void okPressed() { + value = valueT.getText(); + super.okPressed(); + } + + /** Creates label and text. */ + protected Text createLT(Composite parent, String label) { + new Label(parent, SWT.NONE).setText(label); + Text text = new Text(parent, SWT.SINGLE | SWT.LEAD | SWT.BORDER + | (multiline ? SWT.MULTI : SWT.NONE)); + text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + return text; + } + + protected void configureShell(Shell shell) { + super.configureShell(shell); + shell.setText(title); + } + + public String getString() { + return value; + } + + public Long getLong() { + return Long.valueOf(getString()); + } + + public Double getDouble() { + return Double.valueOf(getString()); + } +} diff --git a/eclipse/runtime/pom.xml b/eclipse/runtime/pom.xml index 49f298b17..cc6c1058e 100644 --- a/eclipse/runtime/pom.xml +++ b/eclipse/runtime/pom.xml @@ -23,6 +23,7 @@ plugin.xml META-INF/** + icons/** diff --git a/security/eclipse/plugins/org.argeo.security.ui/icons/refresh.png b/security/eclipse/plugins/org.argeo.security.ui/icons/refresh.png index bb3803b0770a81e334f8050687c8a8237997c9c8..a3884fb4888c2a68f0fa64d523e69da2f0569ab2 100644 GIT binary patch literal 465 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMffdHQn*B?J#{QLX<$A=BSKWzE= zV#<#fGk(9E_w#PmhZ_waZ#DmT(DC8HijS9zf8T38JWck{Oobm85`NsM_;I7*=h^tZ zEn*uhgm*WJ?rId>RwJ^l7Kngsu@!j&Yl{R|<_WII6I@#)w6<7iO_9)=VxeW(0{{R2 z2iioM&sl5KBX4_uMzCV_|S*E^l&Yo9;Xs0009cNkl~+gc6V*LxzW4=gAcjNx9<540E+NHFg;M?#?T4C}8B`%59Qu0Z?Ae*Qsi%~%1@0#k z8C0&kQjADKBl`MB}}9~2N;trqHyI*17q4^AL6m;nHs zI$l<%Cdx2r3IT#e6*@6;VDQrMBPUg>-GWIBmVQ~npMPsN;TVOCox$P{-(sj##F^Ua9#V_fB1RG}%7^b9{r^uXc$=vrO$clz+R zeNYOvlz$`2+QdkFAI*Q8kVc>v#b55$<+;wV%!|yxP!7pvh;@Gz-OVnzmm<;T3(CH% zBC{hEEFgAbsF)B%X2Hy-=l5*G1yE3s#Ka~An-m=Lr`#2xHa{Xrpp}Lx8t_rTapf#k z=)|4|#{|(wc3Bp!X%hA!84u(g4FFaWrJuXDdVd1@62dT$4x}jNa}F)*pT!IG89?MH z>$$=q_xofloeN`L)w!f0Z-@=LNDadCcqrqlC5*$34kYlDjjUs%XnC-^k_8C7FHHhU z)^(iJf+$*!yXNoyAIU=hgLqwVm2dQQ{I<8PV%Jj0*cP&mg5?o#1Qbpt6pf@R>)FS0 zj(`1d!S*J@TKbmWNX7wRce9sU8^KqDt8O?bGH{gwWeJ`A8rx%iv`00%BO&sZb1b+X zoeSF0GJtRX2XK`cz_az0&YO+Jou1qjDFp=EwIB-uswaWp!N1Nobp57(8H^Y2WkC12 x^I-t50(epinq~&2%ryYt0eGLQe0#6|KNLf(a5#LT!5{zt002ovPDHLkV1gF3sfPdn diff --git a/server/modules/org.argeo.node.repo.jackrabbit/META-INF/spring/noderepo-osgi.xml b/server/modules/org.argeo.node.repo.jackrabbit/META-INF/spring/noderepo-osgi.xml index b75dd7adc..222f30290 100644 --- a/server/modules/org.argeo.node.repo.jackrabbit/META-INF/spring/noderepo-osgi.xml +++ b/server/modules/org.argeo.node.repo.jackrabbit/META-INF/spring/noderepo-osgi.xml @@ -9,7 +9,18 @@ http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd"> - + + + + + + + + + + + diff --git a/server/modules/org.argeo.node.repo.jackrabbit/META-INF/spring/noderepo.xml b/server/modules/org.argeo.node.repo.jackrabbit/META-INF/spring/noderepo.xml index 3947b8a43..ccb517d4f 100644 --- a/server/modules/org.argeo.node.repo.jackrabbit/META-INF/spring/noderepo.xml +++ b/server/modules/org.argeo.node.repo.jackrabbit/META-INF/spring/noderepo.xml @@ -11,7 +11,7 @@ - + @@ -27,4 +27,10 @@ + + + + + + \ No newline at end of file diff --git a/server/modules/org.argeo.node.repo.jackrabbit/noderepo.properties b/server/modules/org.argeo.node.repo.jackrabbit/noderepo.properties index dae91ee05..8f2186127 100644 --- a/server/modules/org.argeo.node.repo.jackrabbit/noderepo.properties +++ b/server/modules/org.argeo.node.repo.jackrabbit/noderepo.properties @@ -1,8 +1,12 @@ -argeo.node.repo.home=${user.home}/.argeo/localrepo +# Workspace used by the node session +argeo.node.repo.workspace=dev + +# Repository base directory +argeo.node.repo.home=${user.home}/.argeo/noderepo ## H2 Embedded (DEFAULT) argeo.node.repo.configuration=osgibundle:repository-h2.xml -argeo.node.repo.dburl=jdbc:h2:file:${rep.home}/h2/localrepo_db +argeo.node.repo.dburl=jdbc:h2:file:~/.argeo/h2/noderepo_db argeo.node.repo.dbuser=sa argeo.node.repo.dbpassword= diff --git a/server/modules/org.argeo.node.repo.jackrabbit/repository-h2.xml b/server/modules/org.argeo.node.repo.jackrabbit/repository-h2.xml index 72f7aeb2f..3040ad176 100644 --- a/server/modules/org.argeo.node.repo.jackrabbit/repository-h2.xml +++ b/server/modules/org.argeo.node.repo.jackrabbit/repository-h2.xml @@ -27,7 +27,7 @@ + defaultWorkspace="dev" /> diff --git a/server/modules/org.argeo.node.repo.jackrabbit/repository-postgresql.xml b/server/modules/org.argeo.node.repo.jackrabbit/repository-postgresql.xml index d03fdb6b2..0bfdef42b 100644 --- a/server/modules/org.argeo.node.repo.jackrabbit/repository-postgresql.xml +++ b/server/modules/org.argeo.node.repo.jackrabbit/repository-postgresql.xml @@ -27,7 +27,7 @@ + defaultWorkspace="dev" /> diff --git a/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/ArgeoNames.java b/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/ArgeoNames.java new file mode 100644 index 000000000..73b2046cc --- /dev/null +++ b/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/ArgeoNames.java @@ -0,0 +1,7 @@ +package org.argeo.jcr; + +/** JCR names in the http://www.argeo.org/argeo namespace */ +public interface ArgeoNames { + public final static String ARGEO_ = "argeo:"; + public final static String ARGEO_USER_ID = ARGEO_ + "userID"; +} diff --git a/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/ArgeoTypes.java b/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/ArgeoTypes.java new file mode 100644 index 000000000..8371923c6 --- /dev/null +++ b/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/ArgeoTypes.java @@ -0,0 +1,7 @@ +package org.argeo.jcr; + +/** JCR types in the http://www.argeo.org/argeo namespace */ +public interface ArgeoTypes { + public final static String ARGEO_HOME = "argeo:home"; + public final static String ARGEO_USER_HOME = "argeo:userHome"; +} diff --git a/server/runtime/org.argeo.server.jcr/src/main/resources/org/argeo/jcr/argeo.cnd b/server/runtime/org.argeo.server.jcr/src/main/resources/org/argeo/jcr/argeo.cnd index 243951139..aef5458dc 100644 --- a/server/runtime/org.argeo.server.jcr/src/main/resources/org/argeo/jcr/argeo.cnd +++ b/server/runtime/org.argeo.server.jcr/src/main/resources/org/argeo/jcr/argeo.cnd @@ -1,9 +1,10 @@ // HOME DIRECTORIES -[argeo:home] > nt:base, mix:created, mix:lastModified +[argeo:home] > nt:unstructured, mix:created, mix:lastModified +orderable + * (argeo:userHome) * [argeo:userHome] > mix:created, mix:lastModified mixin -- argeo:userId (STRING) +- argeo:userID (STRING) m -- 2.39.2