JCR browser
authorMathieu Baudier <mbaudier@argeo.org>
Thu, 24 Feb 2011 23:12:33 +0000 (23:12 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Thu, 24 Feb 2011 23:12:33 +0000 (23:12 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@4189 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

53 files changed:
eclipse/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/commands.xml
eclipse/plugins/org.argeo.jcr.ui.explorer/META-INF/spring/osgi.xml
eclipse/plugins/org.argeo.jcr.ui.explorer/icons/add.gif [new file with mode: 0644]
eclipse/plugins/org.argeo.jcr.ui.explorer/icons/browser.gif [new file with mode: 0644]
eclipse/plugins/org.argeo.jcr.ui.explorer/icons/import_fs.png [new file with mode: 0644]
eclipse/plugins/org.argeo.jcr.ui.explorer/icons/query.png [new file with mode: 0644]
eclipse/plugins/org.argeo.jcr.ui.explorer/icons/refresh.png [new file with mode: 0644]
eclipse/plugins/org.argeo.jcr.ui.explorer/icons/remove.gif [new file with mode: 0644]
eclipse/plugins/org.argeo.jcr.ui.explorer/plugin.xml
eclipse/plugins/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/eclipse/ui/jcr/explorer/JcrExplorerPlugin.java
eclipse/plugins/pom.xml
eclipse/runtime/org.argeo.eclipse.ui.jcr/build.properties
eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/binary.png [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/file.gif [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/folder.gif [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/home.gif [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/node.gif [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/repositories.gif [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/repository.gif [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/repository_connected.gif [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/repository_disconnected.gif [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/workspace.gif [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/workspace_connected.png [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/workspace_disconnected.png [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/pom.xml
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/JcrUiPlugin.java [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/ItemComparator.java [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/NodeContentProvider.java [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/NodeLabelProvider.java [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/PropertiesContentProvider.java [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/RepositoryNode.java [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/browser/WorkspaceNode.java [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/commands/AddFileFolder.java [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/commands/DeleteNode.java [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/commands/ImportFileSystem.java [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/commands/InitUserHome.java [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/commands/Refresh.java [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/dialogs/ChooseNameDialog.java [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/editors/AbstractJcrQueryEditor.java
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/views/GenericJcrBrowser.java
eclipse/runtime/org.argeo.eclipse.ui.jcr/src/main/java/org/argeo/eclipse/ui/jcr/wizards/ImportFileSystemWizard.java [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/ui/dialogs/Error.java [new file with mode: 0644]
eclipse/runtime/org.argeo.eclipse.ui/src/main/java/org/argeo/eclipse/ui/dialogs/SingleValue.java [new file with mode: 0644]
eclipse/runtime/pom.xml
security/eclipse/plugins/org.argeo.security.ui/icons/refresh.png
server/modules/org.argeo.node.repo.jackrabbit/META-INF/spring/noderepo-osgi.xml
server/modules/org.argeo.node.repo.jackrabbit/META-INF/spring/noderepo.xml
server/modules/org.argeo.node.repo.jackrabbit/noderepo.properties
server/modules/org.argeo.node.repo.jackrabbit/repository-h2.xml
server/modules/org.argeo.node.repo.jackrabbit/repository-postgresql.xml
server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/ArgeoNames.java [new file with mode: 0644]
server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/ArgeoTypes.java [new file with mode: 0644]
server/runtime/org.argeo.server.jcr/src/main/resources/org/argeo/jcr/argeo.cnd

index 325951d9bf5a12ebce31898f7b1286ebd6723689..c1c1f19b96ead0ac1d7a353a41f43be0b1eef149 100644 (file)
                <property name="editorId"
                        value="org.argeo.slc.client.ui.dist.genericJcrQueryEditor" />
        </bean>
+
+       <bean id="addFileFolder" class="org.argeo.eclipse.ui.jcr.commands.AddFileFolder"
+               scope="prototype" />
+
+       <bean id="refresh" class="org.argeo.eclipse.ui.jcr.commands.Refresh"
+               scope="prototype" />
+
+       <bean id="deleteNode" class="org.argeo.eclipse.ui.jcr.commands.DeleteNode"
+               scope="prototype" />
+
+       <bean id="importFileSystem" class="org.argeo.eclipse.ui.jcr.commands.ImportFileSystem"
+               scope="prototype" />
+
+       <bean id="initUserHome" class="org.argeo.eclipse.ui.jcr.commands.InitUserHome"
+               scope="prototype">
+               <property name="session" ref="nodeJcrSession" />
+       </bean>
 </beans>
index 0e87da8c0f35ceff64f5156dc6dcce2a50fe4748..487cebfdfe8102b9ad54785c2e5fe88e38c246e3 100644 (file)
@@ -8,6 +8,9 @@
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"\r
        osgi:default-timeout="30000">\r
 \r
+       <reference id="nodeJcrSession" interface="javax.jcr.Session"\r
+               filter="(argeo.jcr.repository.alias=node)" />\r
+\r
        <set id="repositories" interface="javax.jcr.Repository">\r
                <listener ref="repositoryRegister" bind-method="register"\r
                        unbind-method="unregister" />\r
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 (file)
index 0000000..252d7eb
Binary files /dev/null and b/eclipse/plugins/org.argeo.jcr.ui.explorer/icons/add.gif differ
diff --git a/eclipse/plugins/org.argeo.jcr.ui.explorer/icons/browser.gif b/eclipse/plugins/org.argeo.jcr.ui.explorer/icons/browser.gif
new file mode 100644 (file)
index 0000000..6c7320c
Binary files /dev/null and b/eclipse/plugins/org.argeo.jcr.ui.explorer/icons/browser.gif differ
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 (file)
index 0000000..d7c890c
Binary files /dev/null and b/eclipse/plugins/org.argeo.jcr.ui.explorer/icons/import_fs.png differ
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 (file)
index 0000000..54c089d
Binary files /dev/null and b/eclipse/plugins/org.argeo.jcr.ui.explorer/icons/query.png differ
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 (file)
index 0000000..a3884fb
Binary files /dev/null and b/eclipse/plugins/org.argeo.jcr.ui.explorer/icons/refresh.png differ
diff --git a/eclipse/plugins/org.argeo.jcr.ui.explorer/icons/remove.gif b/eclipse/plugins/org.argeo.jcr.ui.explorer/icons/remove.gif
new file mode 100644 (file)
index 0000000..0ae6dec
Binary files /dev/null and b/eclipse/plugins/org.argeo.jcr.ui.explorer/icons/remove.gif differ
index 578166569d266a732f5ed4471230c3737eaec05d..ffe7aaffa159291b52000285637cd798e81a8800 100644 (file)
    <extension
          point="org.eclipse.ui.views">
           <view
-                class="org.argeo.eclipse.spring.SpringExtensionFactory"
-                id="org.argeo.jcr.ui.explorer.browserView"
-                name="JCR Browser">
+          class="org.argeo.eclipse.spring.SpringExtensionFactory"
+          icon="icons/browser.gif"
+          id="org.argeo.jcr.ui.explorer.browserView"
+          name="JCR Browser">
           </view>
    </extension>
    <extension
@@ -24,7 +25,7 @@
                  class="org.argeo.eclipse.spring.SpringExtensionFactory"
               id="org.argeo.jcr.ui.explorer.genericJcrQueryEditor"
               name="JCR Query"
-              icon="icons/nodes.gif"
+              icon="icons/query.png"
               default="false">
         </editor>
      </extension>
                <command
             defaultHandler="org.argeo.eclipse.spring.SpringCommandHandler"
             id="org.argeo.jcr.ui.explorer.openGenericJcrQueryEditor"
-            name="OpenGenericJcrQueryEditor ">
+            name="New generic JCR query">
        </command>
+  <command
+        defaultHandler="org.argeo.eclipse.spring.SpringCommandHandler"
+        id="org.argeo.jcr.ui.explorer.addFileFolder"
+        name="Add file folder...">
+  </command>
+  <command
+        defaultHandler="org.argeo.eclipse.spring.SpringCommandHandler"
+        id="org.argeo.jcr.ui.explorer.initUserHome"
+        name="Initialize user home">
+  </command>
+  <command
+        defaultHandler="org.argeo.eclipse.spring.SpringCommandHandler"
+        id="org.argeo.jcr.ui.explorer.refresh"
+        name="Refresh">
+  </command>
+  <command
+        defaultHandler="org.argeo.eclipse.spring.SpringCommandHandler"
+        id="org.argeo.jcr.ui.explorer.deleteNode"
+        name="Delete node">
+  </command>
+  <command
+        defaultHandler="org.argeo.eclipse.spring.SpringCommandHandler"
+        id="org.argeo.jcr.ui.explorer.importFileSystem"
+        name="Import files...">
+  </command>
     </extension>
-       <extension
-         id="menu:org.eclipse.ui.main.menu"
-         point="org.eclipse.ui.menus">
-        <!-- Queries --> 
+       <extension point="org.eclipse.ui.menus">
                <menuContribution
                 allPopups="false"
-                locationURI="menu:org.eclipse.ui.main.menu?after=edit">
-               <menu label="Queries"
-              mnemonic="Queries"
-              id="queryMenu">
+                locationURI="menu:org.argeo.jcr.ui.explorer.browserView">
                 <command
                       commandId="org.argeo.jcr.ui.explorer.openGenericJcrQueryEditor"
-                      disabledIcon="icons/saveDisabled.gif"
-                      icon="icons/results.gif"
-                      label="JCR Query"
-                      style="push"
-                      tooltip="Open JCR query editor">
+                      icon="icons/query.png"
+                      style="push">
                 </command>
-             </menu>
+                            <command
+                                  commandId="org.argeo.jcr.ui.explorer.initUserHome"
+                                  style="push"
+                                  tooltip="Initializes the user specific area within this node">
+                            </command>
           </menuContribution>
+  <menuContribution
+        allPopups="false"
+        locationURI="popup:org.argeo.jcr.ui.explorer.browserView">
+     <command
+           commandId="org.argeo.jcr.ui.explorer.refresh"
+           icon="icons/refresh.png"
+           style="push">
+     </command>
+     <command
+           commandId="org.argeo.jcr.ui.explorer.addFileFolder"
+           icon="icons/add.gif"
+           style="push">
+     </command>
+     <command
+           commandId="org.argeo.jcr.ui.explorer.deleteNode"
+           icon="icons/remove.gif"
+           style="push">
+     </command>
+     <command
+           commandId="org.argeo.jcr.ui.explorer.importFileSystem"
+           icon="icons/import_fs.png"
+           style="push"
+           tooltip="Import files from the files sytem to the repository">
+     </command>
+  </menuContribution>
        </extension>
 </plugin>
index 5beb52a13244a996276adc6e93430e6ab2ceb058..b5e9af31dff751b16a724ce023463b262639b66f 100644 (file)
@@ -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);
+       }
+
 }
index 3d2271ba7280773d7a4111d47672b077c753339c..3b7006a5d1029b2a4d702b0c2e7f16ec23c97f08 100644 (file)
@@ -22,6 +22,7 @@
                                <includes>
                                        <include>plugin.xml</include>
                                        <include>META-INF/**</include>
+                                       <include>icons/**</include>
                                </includes>
                        </resource>
                </resources>
index 5fc538bc83f35ba123c9f84f2eb6124dd65c8789..b3eb07b432b2bd83e2feeba543e705a72fb2b0d0 100644 (file)
@@ -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 (file)
index 0000000..fdf4f82
Binary files /dev/null and b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/binary.png differ
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 (file)
index 0000000..ef30288
Binary files /dev/null and b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/file.gif differ
diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/folder.gif b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/folder.gif
new file mode 100644 (file)
index 0000000..42e027c
Binary files /dev/null and b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/folder.gif differ
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 (file)
index 0000000..fd0c669
Binary files /dev/null and b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/home.gif differ
diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/node.gif b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/node.gif
new file mode 100644 (file)
index 0000000..364c0e7
Binary files /dev/null and b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/node.gif differ
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 (file)
index 0000000..c13bea1
Binary files /dev/null and b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/repositories.gif differ
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 (file)
index 0000000..ef7809c
Binary files /dev/null and b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/repository.gif differ
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 (file)
index 0000000..a15fa55
Binary files /dev/null and b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/repository_connected.gif differ
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 (file)
index 0000000..4576dc5
Binary files /dev/null and b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/repository_disconnected.gif differ
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 (file)
index 0000000..0df0f5d
Binary files /dev/null and b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/workspace.gif differ
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 (file)
index 0000000..0430baa
Binary files /dev/null and b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/workspace_connected.png differ
diff --git a/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/workspace_disconnected.png b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/workspace_disconnected.png
new file mode 100644 (file)
index 0000000..fddcb8c
Binary files /dev/null and b/eclipse/runtime/org.argeo.eclipse.ui.jcr/icons/workspace_disconnected.png differ
index fe336bd931cd77eea6ca1707743255ef94dd2006..6fe7b680e80490182e9186dd1a0a22425d55da5c 100644 (file)
@@ -34,6 +34,7 @@
                                                        org.eclipse.swt,
                                                        *
                                                </Import-Package>
+                                               <Require-Bundle>org.eclipse.ui;resolution:=optional,org.eclipse.rap.ui;resolution:=optional,org.eclipse.core.runtime</Require-Bundle>
                                        </instructions>
                                </configuration>
                        </plugin>
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 (file)
index 0000000..bc40983
--- /dev/null
@@ -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 (file)
index 0000000..2051937
--- /dev/null
@@ -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<Item> {
+       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 (file)
index 0000000..f8a5de9
--- /dev/null
@@ -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<RepositoryNode> nodes = new ArrayList<RepositoryNode>();
+                       Map<String, Repository> 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<Node> children = new ArrayList<Node>();
+                       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 (file)
index 0000000..3d5ef58
--- /dev/null
@@ -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 (file)
index 0000000..68f6fdc
--- /dev/null
@@ -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<Property> props = new TreeSet<Property>(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 (file)
index 0000000..7158c74
--- /dev/null
@@ -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 (file)
index 0000000..8cbf1a2
--- /dev/null
@@ -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 (file)
index 0000000..4dc0dbe
--- /dev/null
@@ -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 (file)
index 0000000..93304fd
--- /dev/null
@@ -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 (file)
index 0000000..dcaf137
--- /dev/null
@@ -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 (file)
index 0000000..6bc5dff
--- /dev/null
@@ -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 = "<not yet logged in>";
+               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 (file)
index 0000000..699a96d
--- /dev/null
@@ -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 (file)
index 0000000..267e51e
--- /dev/null
@@ -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();
+       }
+}
index 76ea5508e06e429d15ca73680984a58946b77a75..dbe4a5576561c6ffbcf4029fbaf44b18585c98fa 100644 (file)
@@ -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;
index e39bc56599e130d8fc01258826ff81e14bf990ea..eb23629673f4c367f7fef24847eabc2cdd555c13 100644 (file)
@@ -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<Item> itemComparator = new Comparator<Item>() {
-               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<Node> children = new ArrayList<Node>();
-                       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<RepositoryNode> nodes = new ArrayList<RepositoryNode>();
-                               Map<String, Repository> 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<Property> props = new TreeSet<Property>(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 (file)
index 0000000..b10b066
--- /dev/null
@@ -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 (file)
index 0000000..4a0f4fa
--- /dev/null
@@ -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 (file)
index 0000000..d3e6797
--- /dev/null
@@ -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());
+       }
+}
index 49f298b17fa41f6ba984f029fc3a9cb67562d09a..cc6c1058e2287281427bca3bcb161fdb95f07524 100644 (file)
@@ -23,6 +23,7 @@
                                <includes>
                                        <include>plugin.xml</include>
                                        <include>META-INF/**</include>
+                                       <include>icons/**</include>
                                </includes>
                        </resource>
                </resources>
index bb3803b0770a81e334f8050687c8a8237997c9c8..a3884fb4888c2a68f0fa64d523e69da2f0569ab2 100644 (file)
Binary files a/security/eclipse/plugins/org.argeo.security.ui/icons/refresh.png and b/security/eclipse/plugins/org.argeo.security.ui/icons/refresh.png differ
index b75dd7adc6a1c35288b370e994ac76e6670e1478..222f302908c93daefe8bb68e14b46740b04c5b05 100644 (file)
@@ -9,7 +9,18 @@
        http://www.springframework.org/schema/util\r
        http://www.springframework.org/schema/util/spring-util-2.5.xsd">\r
 \r
-       <service ref="localJcrRepository" interface="javax.jcr.Repository">\r
+       <service ref="nodeJcrRepository" interface="javax.jcr.Repository">\r
+               <service-properties>\r
+                       <beans:entry value="node">\r
+                               <beans:key>\r
+                                       <util:constant\r
+                                               static-field="org.argeo.jcr.ArgeoJcrConstants.JCR_REPOSITORY_ALIAS" />\r
+                               </beans:key>\r
+                       </beans:entry>\r
+               </service-properties>\r
+       </service>\r
+\r
+       <service ref="nodeJcrSession" interface="javax.jcr.Session">\r
                <service-properties>\r
                        <beans:entry value="node">\r
                                <beans:key>\r
index 3947b8a430f4a70b09a7314f5bdafe7c79c3eb7e..ccb517d4f2bee602de9b7f89846fceecb8cd119b 100644 (file)
@@ -11,7 +11,7 @@
                </property>
        </bean>
 
-       <bean id="localJcrRepository" class="org.argeo.jackrabbit.JackrabbitContainer">
+       <bean id="nodeJcrRepository" class="org.argeo.jackrabbit.JackrabbitContainer">
                <property name="uri" value="${argeo.node.repo.uri}" />
                <property name="homeDirectory" value="${argeo.node.repo.home}" />
                <property name="configuration" value="${argeo.node.repo.configuration}" />
                        </list>
                </property>
        </bean>
+
+       <bean id="nodeJcrSession" class="org.argeo.jcr.ThreadBoundJcrSessionFactory">
+               <property name="repository" ref="nodeJcrRepository" />
+               <property name="workspace" value="${argeo.node.repo.workspace}" />
+       </bean>
+
 </beans>
\ No newline at end of file
index dae91ee054cefb6c56cccb5a1cab8a06e00dbc48..8f2186127a8de7e0e1af5d141e30e4dedecd259b 100644 (file)
@@ -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=
 
index 72f7aeb2fb6b261a8ecbae0e09949d48ac8138e8..3040ad1769e2d4aa751205543ac413e36da3127f 100644 (file)
@@ -27,7 +27,7 @@
 
        <!-- Workspace templates -->
        <Workspaces rootPath="${rep.home}/workspaces"
-               defaultWorkspace="prod" />
+               defaultWorkspace="dev" />
        <Workspace name="${wsp.name}">
                <FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
                        <param name="dataSourceName" value="dataSource" />
index d03fdb6b272abab5d76a62c234fa9eb8d3cfe820..0bfdef42b40f6d2359b688208a732e930a6c0892 100644 (file)
@@ -27,7 +27,7 @@
 
        <!-- Workspace templates -->
        <Workspaces rootPath="${rep.home}/workspaces"
-               defaultWorkspace="default" />
+               defaultWorkspace="dev" />
        <Workspace name="${wsp.name}">
                <FileSystem class="org.apache.jackrabbit.core.fs.db.DbFileSystem">
                        <param name="dataSourceName" value="dataSource" />
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 (file)
index 0000000..73b2046
--- /dev/null
@@ -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 (file)
index 0000000..8371923
--- /dev/null
@@ -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";
+}
index 243951139de592fdccc83976b462051667b5b773..aef5458dc7fe7204241ead9e43610daaab5a5a4b 100644 (file)
@@ -1,9 +1,10 @@
 <argeo = 'http://www.argeo.org/argeo'>
 
 // 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