<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>
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
<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
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>
package org.argeo.eclipse.ui.jcr.explorer;
+import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;
return plugin;
}
+ public static ImageDescriptor getImageDescriptor(String path) {
+ return imageDescriptorFromPlugin(ID, path);
+ }
+
}
<includes>
<include>plugin.xml</include>
<include>META-INF/**</include>
+ <include>icons/**</include>
</includes>
</resource>
</resources>
source.. = src/main/java/
output.. = target/classes/
bin.includes = META-INF/,\
- .
+ .,\
+ icons/
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>
--- /dev/null
+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);
+ }
+
+}
--- /dev/null
+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);
+ }
+ }
+
+}
--- /dev/null
+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);
+ }
+ }
+
+}
--- /dev/null
+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);
+ }
+}
--- /dev/null
+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);
+ }
+ }
+
+}
--- /dev/null
+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;
+ }
+
+}
--- /dev/null
+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);
+ // }
+ }
+
+}
--- /dev/null
+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;
+ }
+
+}
--- /dev/null
+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;
+ }
+
+}
--- /dev/null
+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;
+ }
+
+}
--- /dev/null
+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;
+ }
+
+}
--- /dev/null
+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;
+ }
+}
--- /dev/null
+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();
+ }
+}
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;
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());
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(
});
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));
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;
}
}
--- /dev/null
+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;
+ }
+}
--- /dev/null
+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");
+ }
+
+}
--- /dev/null
+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());
+ }
+}
<includes>
<include>plugin.xml</include>
<include>META-INF/**</include>
+ <include>icons/**</include>
</includes>
</resource>
</resources>
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
</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
-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=
<!-- 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" />
<!-- 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" />
--- /dev/null
+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";
+}
--- /dev/null
+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";
+}
<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