public final static Image HOME = JcrUiPlugin.getImageDescriptor(
"icons/home.gif").createImage();
+ public final static Image REPOSITORIES = JcrUiPlugin.getImageDescriptor(
+ "icons/repositories.gif").createImage();
+ 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 final static Image REMOTE_DISCONNECTED = JcrUiPlugin
+ .getImageDescriptor("icons/remote_disconnected.gif").createImage();
+ public final static Image REMOTE_CONNECTED = JcrUiPlugin
+ .getImageDescriptor("icons/remote_connected.gif").createImage();
+ 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();
+
}
\r
<!-- SERVICES -->\r
<service ref="repositoryFactory" interface="javax.jcr.RepositoryFactory" />\r
+ <service ref="repositoryFactory" interface="org.argeo.jcr.RepositoryRegister" />\r
</beans:beans>
\ No newline at end of file
<bean id="addRemoteRepository" class="org.argeo.jcr.ui.explorer.commands.AddRemoteRepository">
- <property name="repositoryFactory" ref="repositoryFactory" />
+ <property name="repositoryFactory" ref="repositoryRegister" />
<property name="bundleContext" ref="bundleContext" />
<property name="keyring" ref="jcrKeyring" />
</bean>
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd">
- <bean id="repositoryRegister" class="org.argeo.jcr.DefaultRepositoryRegister">
- </bean>
-
<bean id="nodeSession" class="org.argeo.jcr.spring.ThreadBoundSession">
<property name="repository" ref="nodeRepository" />
</bean>
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"\r
osgi:default-timeout="30000">\r
\r
- <set id="repositories" interface="javax.jcr.Repository"\r
- cardinality="0..N">\r
- <listener ref="repositoryRegister" bind-method="register"\r
- unbind-method="unregister" />\r
- </set>\r
-\r
- <reference id="repositoryFactory" interface="javax.jcr.RepositoryFactory" />\r
+ <reference id="repositoryRegister" interface="org.argeo.jcr.RepositoryRegister" />\r
\r
<reference id="nodeRepository" interface="javax.jcr.Repository"\r
filter="(argeo.jcr.repository.alias=node)" />\r
<!-- Views -->
<bean id="browserView" class="org.argeo.jcr.ui.explorer.views.GenericJcrBrowser"
scope="prototype">
+ <property name="jcrKeyring" ref="jcrKeyring" />
<property name="repositoryRegister" ref="repositoryRegister" />
</bean>
</beans>
import org.argeo.jcr.ArgeoJcrConstants;
import org.argeo.jcr.JcrUtils;
import org.argeo.jcr.RepositoryRegister;
+import org.argeo.jcr.security.JcrKeyring;
import org.argeo.jcr.ui.explorer.model.RepositoriesNode;
import org.argeo.jcr.ui.explorer.model.SingleJcrNode;
import org.eclipse.jface.viewers.ITreeContentProvider;
// Business Objects
private RepositoryRegister repositoryRegister;
private Session userSession;
+ private JcrKeyring jcrKeyring;
// Utils
// private ItemComparator itemComparator = new ItemComparator();
- public NodeContentProvider(Session userSession,
+ public NodeContentProvider(JcrKeyring jcrKeyring,
RepositoryRegister repositoryRegister) {
- this.userSession = userSession;
+ this.userSession = jcrKeyring != null ? jcrKeyring.getSession() : null;
+ this.jcrKeyring = jcrKeyring;
this.repositoryRegister = repositoryRegister;
}
}
if (repositoryRegister != null)
objs.add(new RepositoriesNode("Repositories", repositoryRegister,
- null));
+ null, jcrKeyring));
return objs.toArray();
}
import org.argeo.ArgeoException;
import org.argeo.eclipse.ui.jcr.DefaultNodeLabelProvider;
-import org.argeo.eclipse.ui.jcr.JcrUiPlugin;
+import org.argeo.eclipse.ui.jcr.JcrImages;
+import org.argeo.jcr.ui.explorer.model.RemoteRepositoryNode;
import org.argeo.jcr.ui.explorer.model.RepositoriesNode;
import org.argeo.jcr.ui.explorer.model.RepositoryNode;
import org.argeo.jcr.ui.explorer.model.SingleJcrNode;
public class NodeLabelProvider extends DefaultNodeLabelProvider {
// Images
- public final static Image REPOSITORIES = JcrUiPlugin.getImageDescriptor(
- "icons/repositories.gif").createImage();
public String getText(Object element) {
try {
@Override
public Image getImage(Object element) {
- if (element instanceof RepositoryNode) {
+ if (element instanceof RemoteRepositoryNode) {
+ if (((RemoteRepositoryNode) element).getDefaultSession() == null)
+ return JcrImages.REMOTE_DISCONNECTED;
+ else
+ return JcrImages.REMOTE_CONNECTED;
+ } else if (element instanceof RepositoryNode) {
if (((RepositoryNode) element).getDefaultSession() == null)
- return RepositoryNode.REPOSITORY_DISCONNECTED;
+ return JcrImages.REPOSITORY_DISCONNECTED;
else
- return RepositoryNode.REPOSITORY_CONNECTED;
+ return JcrImages.REPOSITORY_CONNECTED;
} else if (element instanceof WorkspaceNode) {
if (((WorkspaceNode) element).getSession() == null)
- return WorkspaceNode.WORKSPACE_DISCONNECTED;
+ return JcrImages.WORKSPACE_DISCONNECTED;
else
- return WorkspaceNode.WORKSPACE_CONNECTED;
+ return JcrImages.WORKSPACE_CONNECTED;
} else if (element instanceof RepositoriesNode) {
- return REPOSITORIES;
+ return JcrImages.REPOSITORIES;
} else if (element instanceof SingleJcrNode)
try {
return super.getImage(((SingleJcrNode) element).getNode());
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
+import org.argeo.ArgeoException;
import org.argeo.eclipse.ui.ErrorFeedback;
import org.argeo.jcr.ArgeoJcrConstants;
import org.argeo.jcr.ArgeoNames;
public Object execute(ExecutionEvent event) throws ExecutionException {
String uri = null;
if (event.getParameters().containsKey(PARAM_REPOSITORY_URI)) {
+ // FIXME remove this
uri = event.getParameter(PARAM_REPOSITORY_URI);
+ if (uri == null)
+ return null;
+
+ try {
+ Hashtable<String, String> params = new Hashtable<String, String>();
+ params.put(ArgeoJcrConstants.JCR_REPOSITORY_URI, uri);
+ // by default we use the URI as alias
+ params.put(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS, uri);
+ Repository repository = repositoryFactory.getRepository(params);
+ bundleContext.registerService(Repository.class.getName(),
+ repository, params);
+ } catch (Exception e) {
+ ErrorFeedback.show("Cannot add remote repository " + uri, e);
+ }
} else {
RemoteRepositoryLoginDialog dlg = new RemoteRepositoryLoginDialog(
Display.getDefault().getActiveShell());
if (dlg.open() == Dialog.OK) {
- uri = dlg.getUri();
+ // uri = dlg.getUri();
}
}
- if (uri == null)
- return null;
-
- try {
- Hashtable<String, String> params = new Hashtable<String, String>();
- params.put(ArgeoJcrConstants.JCR_REPOSITORY_URI, uri);
- // by default we use the URI as alias
- params.put(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS, uri);
- Repository repository = repositoryFactory.getRepository(params);
- bundleContext.registerService(Repository.class.getName(),
- repository, params);
- } catch (Exception e) {
- ErrorFeedback.show("Cannot add remote repository " + uri, e);
- }
return null;
}
}
class RemoteRepositoryLoginDialog extends TitleAreaDialog {
- private String uri;
private Text name;
- private Text uriText;
+ private Text uri;
private Text username;
private Text password;
false));
setMessage("Login to remote repository", IMessageProvider.NONE);
name = createLT(composite, "Name", "remoteRepository");
- uriText = createLT(composite, "URI",
+ uri = createLT(composite, "URI",
"http://localhost:7070/org.argeo.jcr.webapp/remoting/node");
username = createLT(composite, "User", "");
password = createLP(composite, "Password");
void testConnection() {
Session session = null;
try {
- URI checkedUri = new URI(uriText.getText());
+ URI checkedUri = new URI(uri.getText());
String checkedUriStr = checkedUri.toString();
Hashtable<String, String> params = new Hashtable<String, String>();
username.getText(), pwd);
session = repository.login(sc);
MessageDialog.openInformation(getParentShell(), "Success",
- "Connection to '" + uriText.getText()
- + "' successful");
+ "Connection to '" + uri.getText() + "' successful");
}
} catch (Exception e) {
ErrorFeedback.show(
- "Connection test failed for " + uriText.getText(), e);
+ "Connection test failed for " + uri.getText(), e);
} finally {
JcrUtils.logoutQuietly(session);
}
Node home = JcrUtils.getUserHome(nodeSession);
Node remote = home.hasNode(ARGEO_REMOTE) ? home
.getNode(ARGEO_REMOTE) : home.addNode(ARGEO_REMOTE);
+ if (remote.hasNode(name.getText()))
+ throw new ArgeoException(
+ "There is already a remote repository named "
+ + name.getText());
Node remoteRepository = remote.addNode(name.getText(),
ArgeoTypes.ARGEO_REMOTE_REPOSITORY);
- remoteRepository.setProperty(ARGEO_URI, uriText.getText());
+ remoteRepository.setProperty(ARGEO_URI, uri.getText());
remoteRepository.setProperty(ARGEO_USER_ID, username.getText());
Node pwd = remoteRepository.addNode(ARGEO_PASSWORD);
keyring.set(pwd.getPath(), password.getText().toCharArray());
nodeSession.save();
+ MessageDialog.openInformation(
+ getParentShell(),
+ "Repository Added",
+ "Remote repository '" + username.getText() + "@"
+ + uri.getText() + "' added");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
- uri = uriText.getText();
super.okPressed();
}
text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
return text;
}
-
- public String getUri() {
- return uri;
- }
}
}
--- /dev/null
+package org.argeo.jcr.ui.explorer.model;
+
+import java.util.Arrays;
+
+import javax.jcr.Node;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+
+import org.argeo.eclipse.ui.TreeParent;
+import org.argeo.jcr.ArgeoNames;
+import org.argeo.jcr.security.JcrKeyring;
+
+/** Root of a remote repository */
+public class RemoteRepositoryNode extends RepositoryNode {
+ private JcrKeyring jcrKeyring;
+ private String remoteNodePath;
+
+ public RemoteRepositoryNode(String alias, Repository repository,
+ TreeParent parent, JcrKeyring jcrKeyring, String remoteNodePath) {
+ super(alias, repository, parent);
+ this.jcrKeyring = jcrKeyring;
+ this.remoteNodePath = remoteNodePath;
+ }
+
+ @Override
+ protected Session repositoryLogin(String workspaceName)
+ throws RepositoryException {
+ Node remoteNode = jcrKeyring.getSession().getNode(remoteNodePath);
+ String userID = remoteNode.getProperty(ArgeoNames.ARGEO_USER_ID)
+ .getString();
+ char[] password = jcrKeyring.getAsChars(remoteNodePath + "/"
+ + ArgeoNames.ARGEO_PASSWORD);
+ try {
+ SimpleCredentials credentials = new SimpleCredentials(userID,
+ password);
+ return getRepository().login(credentials, workspaceName);
+ } finally {
+ Arrays.fill(password, 0, password.length, ' ');
+ }
+ }
+
+}
package org.argeo.jcr.ui.explorer.model;
+import java.util.Hashtable;
import java.util.Map;
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
import javax.jcr.RepositoryFactory;
+import javax.jcr.Session;
+import org.argeo.ArgeoException;
+import org.argeo.eclipse.ui.ErrorFeedback;
import org.argeo.eclipse.ui.TreeParent;
+import org.argeo.jcr.ArgeoJcrConstants;
+import org.argeo.jcr.ArgeoNames;
+import org.argeo.jcr.JcrUtils;
import org.argeo.jcr.RepositoryRegister;
+import org.argeo.jcr.security.JcrKeyring;
/**
* UI Tree component. Implements the Argeo abstraction of a
* kept here.
*/
-public class RepositoriesNode extends TreeParent {
+public class RepositoriesNode extends TreeParent implements ArgeoNames {
private final RepositoryRegister repositoryRegister;
+ private final JcrKeyring jcrKeyring;
+
public RepositoriesNode(String name, RepositoryRegister repositoryRegister,
- TreeParent parent) {
+ TreeParent parent, JcrKeyring jcrKeyring) {
super(name);
this.repositoryRegister = repositoryRegister;
+ this.jcrKeyring = jcrKeyring;
}
/**
- * Override normal behaviour to initialize the various repositories only at
+ * Override normal behavior to initialize the various repositories only at
* request time
*/
@Override
super.addChild(new RepositoryNode(name, refRepos.get(name),
this));
}
+
+ // remote
+ if (jcrKeyring != null) {
+ try {
+ addRemoteRepositories(jcrKeyring);
+ } catch (RepositoryException e) {
+ throw new ArgeoException(
+ "Cannot browse remote repositories", e);
+ }
+ }
return super.getChildren();
}
}
+ protected void addRemoteRepositories(JcrKeyring jcrKeyring)
+ throws RepositoryException {
+ Session userSession = jcrKeyring.getSession();
+ Node userHome = JcrUtils.getUserHome(userSession);
+ if (userHome.hasNode(ARGEO_REMOTE)) {
+ NodeIterator it = userHome.getNode(ARGEO_REMOTE).getNodes();
+ while (it.hasNext()) {
+ Node remoteNode = it.nextNode();
+ String uri = remoteNode.getProperty(ARGEO_URI).getString();
+ try {
+ Hashtable<String, String> params = new Hashtable<String, String>();
+ params.put(ArgeoJcrConstants.JCR_REPOSITORY_URI, uri);
+ params.put(ArgeoJcrConstants.JCR_REPOSITORY_ALIAS,
+ remoteNode.getName());
+ Repository repository = repositoryRegister
+ .getRepository(params);
+ RemoteRepositoryNode remoteRepositoryNode = new RemoteRepositoryNode(
+ remoteNode.getName(), repository, this, jcrKeyring,
+ remoteNode.getPath());
+ super.addChild(remoteRepositoryNode);
+ } catch (Exception e) {
+ ErrorFeedback.show("Cannot add remote repository "
+ + remoteNode, e);
+ }
+ }
+ }
+ }
+
public void registerNewRepository(String alias, Repository repository) {
// TODO: implement this
// Create a new RepositoryNode Object
import org.argeo.ArgeoException;
import org.argeo.eclipse.ui.TreeParent;
-import org.argeo.eclipse.ui.jcr.JcrUiPlugin;
-import org.eclipse.swt.graphics.Image;
/**
* UI Tree component. Wraps a JCR {@link Repository}. It also keeps a reference
private String alias;
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();
/** Create a new repository with alias = name */
public RepositoryNode(String alias, Repository repository, TreeParent parent) {
// SimpleCredentials sc = new SimpleCredentials("root",
// "demo".toCharArray());
// defaultSession = repository.login(sc);
- defaultSession = repository.login();
+ defaultSession = repositoryLogin(null);
String[] wkpNames = defaultSession.getWorkspace()
.getAccessibleWorkspaceNames();
for (String wkpName : wkpNames) {
}
}
+ /** Actual call to the {@link Repository#login(javax.jcr.Credentials, String)} method. To be overridden.*/
+ protected Session repositoryLogin(String workspaceName)
+ throws RepositoryException {
+ return repository.login(workspaceName);
+ }
+
public Session getDefaultSession() {
return defaultSession;
}
import org.argeo.ArgeoException;
import org.argeo.eclipse.ui.TreeParent;
-import org.argeo.eclipse.ui.jcr.JcrUiPlugin;
-import org.eclipse.swt.graphics.Image;
/**
* UI Tree component. Wraps the root node of a JCR {@link Workspace}. It also
public class WorkspaceNode extends TreeParent implements EventListener, UiNode {
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(RepositoryNode parent, String name) {
this(parent, name, null);
}
public void login() {
try {
logout();
- session = ((RepositoryNode) getParent()).getRepository().login(
- getName());
+ session = ((RepositoryNode) getParent()).repositoryLogin(getName());
processNewSession(session);
} catch (RepositoryException e) {
import javax.jcr.Property;
import javax.jcr.PropertyType;
-import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.observation.Event;
import org.argeo.eclipse.ui.jcr.AsyncUiEventListener;
import org.argeo.eclipse.ui.jcr.utils.NodeViewerComparer;
import org.argeo.eclipse.ui.jcr.views.AbstractJcrBrowser;
-import org.argeo.jcr.ArgeoJcrConstants;
-import org.argeo.jcr.JcrUtils;
import org.argeo.jcr.RepositoryRegister;
+import org.argeo.jcr.security.JcrKeyring;
import org.argeo.jcr.ui.explorer.browser.NodeContentProvider;
import org.argeo.jcr.ui.explorer.browser.NodeLabelProvider;
import org.argeo.jcr.ui.explorer.browser.PropertiesContentProvider;
// LogFactory.getLog(GenericJcrBrowser.class);
/* DEPENDENCY INJECTION */
- private Session session;
+ private JcrKeyring jcrKeyring;
private RepositoryRegister repositoryRegister;
// This page widgets
public void createPartControl(Composite parent) {
// look for session
- Session nodeSession = session;
- if (nodeSession == null) {
- Repository nodeRepository = JcrUtils.getRepositoryByAlias(
- repositoryRegister, ArgeoJcrConstants.ALIAS_NODE);
- if (nodeRepository != null)
- try {
- nodeSession = nodeRepository.login();
- // TODO : enhance that to enable multirepository listener.
- session = nodeSession;
- } catch (RepositoryException e1) {
- throw new ArgeoException("Cannot login to node repository");
- }
- }
+ Session nodeSession = jcrKeyring != null ? jcrKeyring.getSession()
+ : null;
+ // if (nodeSession == null) {
+ // Repository nodeRepository = JcrUtils.getRepositoryByAlias(
+ // repositoryRegister, ArgeoJcrConstants.ALIAS_NODE);
+ // if (nodeRepository != null)
+ // try {
+ // nodeSession = nodeRepository.login();
+ // // TODO : enhance that to enable multirepository listener.
+ // session = nodeSession;
+ // } catch (RepositoryException e1) {
+ // throw new ArgeoException("Cannot login to node repository");
+ // }
+ // }
// Instantiate the generic object that fits for
// both RCP & RAP
GridLayout gl = new GridLayout(1, false);
top.setLayout(gl);
- nodeContentProvider = new NodeContentProvider(nodeSession,
+ nodeContentProvider = new NodeContentProvider(jcrKeyring,
repositoryRegister);
// nodes viewer
});
resultsObserver = new TreeObserver(tmpNodeViewer.getTree().getDisplay());
- try {
- ObservationManager observationManager = session.getWorkspace()
- .getObservationManager();
- observationManager.addEventListener(resultsObserver,
- Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED, "/", true,
- null, null, false);
- } catch (RepositoryException e) {
- throw new ArgeoException("Cannot register listeners", e);
- }
+ if (jcrKeyring != null)
+ try {
+ ObservationManager observationManager = jcrKeyring.getSession()
+ .getWorkspace().getObservationManager();
+ observationManager.addEventListener(resultsObserver,
+ Event.PROPERTY_ADDED | Event.PROPERTY_CHANGED, "/",
+ true, null, null, false);
+ } catch (RepositoryException e) {
+ throw new ArgeoException("Cannot register listeners", e);
+ }
tmpNodeViewer
.addDoubleClickListener(new GenericNodeDoubleClickListener(
this.repositoryRegister = repositoryRegister;
}
- public void setSession(Session session) {
- this.session = session;
+ public void setJcrKeyring(JcrKeyring jcrKeyring) {
+ this.jcrKeyring = jcrKeyring;
}
}