]> git.argeo.org Git - gpl/argeo-slc.git/commitdiff
Restructure Repo Dist UI
authorMathieu Baudier <mbaudier@argeo.org>
Mon, 22 Oct 2012 15:55:27 +0000 (15:55 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Mon, 22 Oct 2012 15:55:27 +0000 (15:55 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@5634 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

plugins/org.argeo.slc.client.ui.dist/META-INF/spring/commands.xml
plugins/org.argeo.slc.client.ui.dist/META-INF/spring/jcr.xml
plugins/org.argeo.slc.client.ui.dist/META-INF/spring/osgi.xml
plugins/org.argeo.slc.client.ui.dist/META-INF/spring/views.xml
plugins/org.argeo.slc.client.ui.dist/plugin.xml
plugins/org.argeo.slc.client.ui.dist/pom.xml
plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/AddRepository.java [new file with mode: 0644]
plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/views/DistributionsView.java
pom.xml
runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoConstants.java

index 2be2c1185fbc8537608c567df42c6fc636314cfc..7ad2b6b6a467d9e5dfd44d7a3f7b713ad37be313 100644 (file)
                <property name="repository" ref="javaRepository" />
                <property name="workspace" value="org.argeo.tp-1.3.1" />
        </bean>
-       
+
        <bean id="normalizeDistribution"
                class="org.argeo.slc.client.ui.dist.commands.NormalizeDistribution"
                scope="prototype">
                <property name="repository" ref="javaRepository" />
        </bean>
-       <bean id="createWorkspace"
-               class="org.argeo.slc.client.ui.dist.commands.CreateWorkspace"
+       <bean id="createWorkspace" class="org.argeo.slc.client.ui.dist.commands.CreateWorkspace"
                scope="prototype">
                <property name="repository" ref="javaRepository" />
        </bean>
-       <bean id="copyWorkspace"
-               class="org.argeo.slc.client.ui.dist.commands.CopyWorkspace"
+       <bean id="copyWorkspace" class="org.argeo.slc.client.ui.dist.commands.CopyWorkspace"
                scope="prototype">
                <property name="repository" ref="javaRepository" />
        </bean>
-       <bean id="deleteWorkspace"
-               class="org.argeo.slc.client.ui.dist.commands.DeleteWorkspace"
+       <bean id="deleteWorkspace" class="org.argeo.slc.client.ui.dist.commands.DeleteWorkspace"
                scope="prototype">
                <property name="repository" ref="javaRepository" />
        </bean>
                class="org.argeo.slc.client.ui.dist.commands.RefreshDistributionsView"
                scope="prototype">
        </bean>
-       <bean id="org.argeo.slc.client.ui.dist.deleteArtifacts"
-               class="org.argeo.slc.client.ui.dist.commands.DeleteArtifacts"
+       <bean id="org.argeo.slc.client.ui.dist.deleteArtifacts" class="org.argeo.slc.client.ui.dist.commands.DeleteArtifacts"
                scope="prototype">
        </bean>
        <bean id="refreshDistributionOverviewPage"
                class="org.argeo.slc.client.ui.dist.commands.RefreshDistributionOverviewPage"
                scope="prototype">
        </bean>
+
+       <bean id="addRepository" class="org.argeo.slc.client.ui.dist.commands.AddRepository">
+               <property name="repositoryFactory" ref="repositoryFactory" />
+               <property name="nodeRepository" ref="nodeRepository" />
+               <property name="keyring" ref="keyring" />
+       </bean>
+
 </beans>
index 6543412d5ebeef5d6807abcd2b455e6e94dc7a0e..51c2109574450f856b920b203b22d0f2cf3dde3c 100644 (file)
@@ -9,4 +9,16 @@
                <property name="repository" ref="javaRepository" />
                <property name="workspace" value="org.argeo.tp-1.3.1" />
        </bean>
+
+       <bean id="nodeSession" class="org.argeo.jcr.spring.ThreadBoundSession">
+               <property name="repository" ref="nodeRepository" />
+       </bean>
+
+       <bean id="keyring" class="org.argeo.security.jcr.JcrKeyring">
+               <property name="session" ref="nodeSession" />
+               <property name="defaultCallbackHandler" ref="defaultCallbackHandler" />
+               <!-- <property name="secreteKeyLength" value="${argeo.keyring.secreteKeyLength}" 
+                       /> -->
+       </bean>
+
 </beans>
index c938de8de2204e7652c764dc19183fa740daf43a..48399342dfe08d629930f4791b975af2ff3179e3 100644 (file)
@@ -12,4 +12,9 @@
                filter="(argeo.jcr.repository.alias=java)" />\r
 \r
        <reference id="repositoryFactory" interface="javax.jcr.RepositoryFactory" />\r
+\r
+       <reference id="nodeRepository" interface="javax.jcr.Repository"\r
+               filter="(argeo.jcr.repository.alias=node)" />\r
+\r
+       <reference id="defaultCallbackHandler" interface="javax.security.auth.callback.CallbackHandler" />\r
 </beans:beans>
\ No newline at end of file
index cfbbf2443b013c50a315e9cb7b061182ec44de1b..684e01fa9a0511362c88e593cb306e24eb03ab69 100644 (file)
@@ -45,7 +45,8 @@
 
        <bean id="distributionsView" class="org.argeo.slc.client.ui.dist.views.DistributionsView"
                scope="prototype">
-               <property name="repository" ref="javaRepository" />
                <property name="repositoryFactory" ref="repositoryFactory" />
+               <property name="nodeRepository" ref="nodeRepository" />
+               <property name="keyring" ref="keyring" />
        </bean>
 </beans>
index 0edb2f87a82da6eb6adbdc909d7c6a38f0974bcd..cc4b39c239087a492e625d5ab6eac39155f6ff13 100644 (file)
                        name="Workspace Name">
                        </commandParameter>
        </command>
+               <command
+            id="org.argeo.slc.client.ui.dist.addRepository"
+            defaultHandler="org.argeo.eclipse.spring.SpringCommandHandler"
+            name="Add Repository">
+       </command>
        
                <!-- TO MANIPULATE WORKSPACES -->
                <command
                 tooltip="Refresh the whole browser">
             </command>
         </menuContribution>
-        <!--
                <menuContribution
                locationURI="toolbar:org.argeo.slc.client.ui.dist.distributionsView">
+            <command
+               commandId="org.argeo.slc.client.ui.dist.addRepository"
+                icon="icons/addItem.gif"
+                label="Add repository"
+                tooltip="Add a repository">
+            </command>
+               <!--
             <command
                commandId="org.argeo.slc.client.ui.dist.runInOSGi"
                 icon="icons/showSize.gif"
                 label="Run in OSGi"
                 tooltip="Run in a spearate OSGi runtime">
             </command>
+            -->
         </menuContribution>
-       -->
         <!-- Queries --> 
                <!-- <menuContribution
                 allPopups="false"
index b84a4280fe5936b651acdf29c23f040c68a0593e..ab2a90d8da7c568d283c383d04ccc5e18f4f6e17 100644 (file)
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
                <groupId>org.argeo.slc</groupId>
                </plugins>
        </build>
        <dependencies>
+               <dependency>
+                       <groupId>org.argeo.commons.base</groupId>
+                       <artifactId>org.argeo.util</artifactId>
+                       <version>${version.argeo-commons}</version>
+               </dependency>
+
                <!-- Commons UI -->
                <dependency>
                        <groupId>org.argeo.commons.base</groupId>
 
 
                <!-- SLC repo -->
+               <dependency>
+                       <groupId>org.argeo.slc</groupId>
+                       <artifactId>org.argeo.slc.specs</artifactId>
+                       <version>1.1.4-SNAPSHOT</version>
+               </dependency>
                <dependency>
                        <groupId>org.argeo.slc</groupId>
                        <artifactId>org.argeo.slc.repo</artifactId>
diff --git a/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/AddRepository.java b/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/AddRepository.java
new file mode 100644 (file)
index 0000000..18edd71
--- /dev/null
@@ -0,0 +1,237 @@
+/*
+ * Copyright (C) 2007-2012 Mathieu Baudier
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.argeo.slc.client.ui.dist.commands;
+
+import java.net.URI;
+import java.util.Hashtable;
+
+import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryFactory;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+import javax.jcr.nodetype.NodeType;
+
+import org.argeo.ArgeoException;
+import org.argeo.eclipse.ui.ErrorFeedback;
+import org.argeo.jcr.ArgeoJcrConstants;
+import org.argeo.jcr.ArgeoJcrUtils;
+import org.argeo.jcr.ArgeoNames;
+import org.argeo.jcr.ArgeoTypes;
+import org.argeo.jcr.JcrUtils;
+import org.argeo.jcr.UserJcrUtils;
+import org.argeo.slc.jcr.SlcNames;
+import org.argeo.slc.repo.RepoConstants;
+import org.argeo.util.security.Keyring;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+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;
+
+/**
+ * Connect to a remote repository.
+ */
+public class AddRepository extends AbstractHandler implements ArgeoNames,
+               SlcNames {
+
+       private RepositoryFactory repositoryFactory;
+       private Repository nodeRepository;
+       private Keyring keyring;
+
+       public Object execute(ExecutionEvent event) throws ExecutionException {
+               RemoteRepositoryLoginDialog dlg = new RemoteRepositoryLoginDialog(
+                               Display.getDefault().getActiveShell());
+               if (dlg.open() == Dialog.OK) {
+               }
+               return null;
+       }
+
+       public void setRepositoryFactory(RepositoryFactory repositoryFactory) {
+               this.repositoryFactory = repositoryFactory;
+       }
+
+       public void setKeyring(Keyring keyring) {
+               this.keyring = keyring;
+       }
+
+       public void setNodeRepository(Repository nodeRepository) {
+               this.nodeRepository = nodeRepository;
+       }
+
+       class RemoteRepositoryLoginDialog extends TitleAreaDialog {
+               private Text name;
+               private Text uri;
+               private Text username;
+               private Text password;
+               private Button saveInKeyring;
+
+               public RemoteRepositoryLoginDialog(Shell parentShell) {
+                       super(parentShell);
+               }
+
+               protected Point getInitialSize() {
+                       return new Point(600, 400);
+               }
+
+               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));
+                       setMessage("Login to remote repository", IMessageProvider.NONE);
+                       name = createLT(composite, "Name", "Argeo.org Java Repository");
+                       uri = createLT(composite, "URI",
+                                       "https://repo.argeo.org/org.argeo.jcr.webapp/remoting/java");
+                       username = createLT(composite, "User", "");
+                       password = createLP(composite, "Password");
+
+                       saveInKeyring = createLC(composite, "Remember password", false);
+                       parent.pack();
+                       return composite;
+               }
+
+               @Override
+               protected void createButtonsForButtonBar(Composite parent) {
+                       super.createButtonsForButtonBar(parent);
+                       Button test = createButton(parent, 2, "Test", false);
+                       test.addSelectionListener(new SelectionAdapter() {
+                               public void widgetSelected(SelectionEvent arg0) {
+                                       testConnection();
+                               }
+                       });
+               }
+
+               void testConnection() {
+                       Session session = null;
+                       try {
+                               if (uri.getText().startsWith("http")) {// http, https
+                                       URI checkedUri = new URI(uri.getText());
+                                       String checkedUriStr = checkedUri.toString();
+                                       Hashtable<String, String> params = new Hashtable<String, String>();
+                                       params.put(ArgeoJcrConstants.JCR_REPOSITORY_URI,
+                                                       checkedUriStr);
+                                       Repository repository = ArgeoJcrUtils.getRepositoryByUri(
+                                                       repositoryFactory, checkedUriStr);
+                                       if (username.getText().trim().equals("")) {// anonymous
+                                               session = repository.login();
+                                       } else {
+                                               // FIXME use getTextChars() when upgrading to 3.7
+                                               // see
+                                               // https://bugs.eclipse.org/bugs/show_bug.cgi?id=297412
+                                               char[] pwd = password.getText().toCharArray();
+                                               SimpleCredentials sc = new SimpleCredentials(
+                                                               username.getText(), pwd);
+                                               session = repository.login(sc);
+                                       }
+                               } else {// alias
+                                       Repository repository = ArgeoJcrUtils.getRepositoryByAlias(
+                                                       repositoryFactory, uri.getText());
+                                       session = repository.login();
+                               }
+                               MessageDialog.openInformation(getParentShell(), "Success",
+                                               "Connection to '" + uri.getText() + "' successful");
+                       } catch (Exception e) {
+                               ErrorFeedback.show(
+                                               "Connection test failed for " + uri.getText(), e);
+                       } finally {
+                               JcrUtils.logoutQuietly(session);
+                       }
+               }
+
+               @Override
+               protected void okPressed() {
+                       try {
+                               Session nodeSession = nodeRepository.login();
+                               String reposPath = UserJcrUtils.getUserHome(nodeSession)
+                                               .getPath() + RepoConstants.REPOSITORIES_BASE_PATH;
+
+                               Node repos = nodeSession.getNode(reposPath);
+                               String repoNodeName = JcrUtils.replaceInvalidChars(name
+                                               .getText());
+                               if (repos.hasNode(repoNodeName))
+                                       throw new ArgeoException(
+                                                       "There is already a remote repository named "
+                                                                       + repoNodeName);
+                               Node repoNode = repos.addNode(repoNodeName,
+                                               ArgeoTypes.ARGEO_REMOTE_REPOSITORY);
+                               repoNode.setProperty(ARGEO_URI, uri.getText());
+                               repoNode.setProperty(ARGEO_USER_ID, username.getText());
+                               repoNode.addMixin(NodeType.MIX_TITLE);
+                               repoNode.setProperty(Property.JCR_TITLE, name.getText());
+                               nodeSession.save();
+                               if (saveInKeyring.getSelection()) {
+                                       String pwdPath = repoNode.getPath() + '/' + ARGEO_PASSWORD;
+                                       keyring.set(pwdPath, password.getText().toCharArray());
+                                       nodeSession.save();
+                               }
+                               MessageDialog.openInformation(getParentShell(),
+                                               "Repository Added",
+                                               "Remote repository " + uri.getText() + "' added");
+
+                               super.okPressed();
+                       } catch (Exception e) {
+                               ErrorFeedback.show("Cannot add remote repository", e);
+                       }
+               }
+
+               /** Creates label and text. */
+               protected Text createLT(Composite parent, String label, String initial) {
+                       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, true));
+                       text.setText(initial);
+                       return text;
+               }
+
+               /** Creates label and check. */
+               protected Button createLC(Composite parent, String label,
+                               Boolean initial) {
+                       new Label(parent, SWT.NONE).setText(label);
+                       Button check = new Button(parent, SWT.CHECK);
+                       check.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+                       check.setSelection(initial);
+                       return check;
+               }
+
+               protected Text createLP(Composite parent, String label) {
+                       new Label(parent, SWT.NONE).setText(label);
+                       Text text = new Text(parent, SWT.SINGLE | SWT.LEAD | SWT.BORDER
+                                       | SWT.PASSWORD);
+                       text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+                       return text;
+               }
+       }
+}
index 8cb1746a280157899435fe2a883f51d8b1234ad8..8d046f5adbede3b1e258bf6c560e7c122b6424ab 100644 (file)
@@ -21,17 +21,24 @@ import java.util.List;
 import java.util.Map;
 
 import javax.jcr.Credentials;
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+import javax.jcr.Property;
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
 import javax.jcr.RepositoryFactory;
 import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+import javax.jcr.nodetype.NodeType;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.eclipse.ui.AbstractTreeContentProvider;
 import org.argeo.eclipse.ui.ErrorFeedback;
 import org.argeo.eclipse.ui.TreeParent;
+import org.argeo.jcr.ArgeoJcrUtils;
+import org.argeo.jcr.ArgeoNames;
+import org.argeo.jcr.ArgeoTypes;
 import org.argeo.jcr.JcrUtils;
+import org.argeo.jcr.UserJcrUtils;
+import org.argeo.slc.SlcException;
 import org.argeo.slc.client.ui.dist.DistPlugin;
 import org.argeo.slc.client.ui.dist.commands.CopyWorkspace;
 import org.argeo.slc.client.ui.dist.commands.CreateWorkspace;
@@ -42,6 +49,8 @@ import org.argeo.slc.client.ui.dist.editors.DistributionEditor;
 import org.argeo.slc.client.ui.dist.editors.DistributionEditorInput;
 import org.argeo.slc.client.ui.dist.utils.CommandHelpers;
 import org.argeo.slc.jcr.SlcNames;
+import org.argeo.slc.repo.RepoConstants;
+import org.argeo.util.security.Keyring;
 import org.eclipse.jface.action.IMenuListener;
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.MenuManager;
@@ -49,8 +58,10 @@ import org.eclipse.jface.viewers.ColumnLabelProvider;
 import org.eclipse.jface.viewers.DoubleClickEvent;
 import org.eclipse.jface.viewers.IDoubleClickListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
 import org.eclipse.jface.viewers.TreeViewer;
 import org.eclipse.jface.viewers.TreeViewerColumn;
+import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Menu;
@@ -63,17 +74,21 @@ import org.eclipse.ui.part.ViewPart;
  * Browse and manipulate distributions (like merge, rename, etc.). Only support
  * one single repository currently.
  */
-
-public class DistributionsView extends ViewPart implements SlcNames {
-       private final static Log log = LogFactory.getLog(DistributionsView.class);
+public class DistributionsView extends ViewPart implements SlcNames, ArgeoNames {
+       // private final static Log log =
+       // LogFactory.getLog(DistributionsView.class);
        public final static String ID = DistPlugin.ID + ".distributionsView";
 
-       private Repository repository;
+       private Repository nodeRepository;
        private RepositoryFactory repositoryFactory;
+       private Keyring keyring;
 
        private TreeViewer viewer;
 
-       private List<RepositoryElem> repositories = new ArrayList<DistributionsView.RepositoryElem>();
+       // private List<RepositoryElem> repositories = new
+       // ArrayList<DistributionsView.RepositoryElem>();
+
+       // private Session nodeSession = null;
 
        @Override
        public void createPartControl(Composite parent) {
@@ -83,17 +98,19 @@ public class DistributionsView extends ViewPart implements SlcNames {
 
                TreeViewerColumn col = new TreeViewerColumn(viewer, SWT.NONE);
                col.getColumn().setWidth(200);
-               col.getColumn().setText("Workspace");
+               // col.getColumn().setText("Workspace");
                col.setLabelProvider(new ColumnLabelProvider() {
                        @Override
                        public String getText(Object element) {
+                               if (element instanceof RepoElem)
+                                       return ((RepoElem) element).getLabel();
                                return element.toString();
                        }
                });
 
                final Tree table = viewer.getTree();
-               table.setHeaderVisible(true);
-               table.setLinesVisible(true);
+               table.setHeaderVisible(false);
+               table.setLinesVisible(false);
 
                viewer.setContentProvider(new DistributionsContentProvider());
                viewer.addDoubleClickListener(new DistributionsDCL());
@@ -108,39 +125,103 @@ public class DistributionsView extends ViewPart implements SlcNames {
                viewer.getTree().setMenu(menu);
                getSite().registerContextMenu(menuManager, viewer);
 
-               // Initializes repositories
-               // TODO make it more generic, with remote repositories etc.
-               repositories.add(new RepositoryElem("java", repository, null));
+               Session nodeSession = null;
+               try {
+                       nodeSession = nodeRepository.login();
+
+                       // make sure base directory is available
+                       Node repos = JcrUtils.mkdirs(nodeSession,
+                                       UserJcrUtils.getUserHome(nodeSession).getPath()
+                                                       + RepoConstants.REPOSITORIES_BASE_PATH);
+                       nodeSession.save();
+
+                       // register default local java repository
+                       String alias = RepoConstants.DEFAULT_JAVA_REPOSITORY_ALIAS;
+                       Repository javaRepository = ArgeoJcrUtils.getRepositoryByAlias(
+                                       repositoryFactory, alias);
+                       if (javaRepository != null) {
+                               if (!repos.hasNode(alias)) {
+                                       Node repoNode = repos.addNode(alias,
+                                                       ArgeoTypes.ARGEO_REMOTE_REPOSITORY);
+                                       repoNode.setProperty(ARGEO_URI, alias);
+                                       repoNode.addMixin(NodeType.MIX_TITLE);
+                                       repoNode.setProperty(Property.JCR_TITLE, "vm://" + alias);
+                                       nodeSession.save();
+                               }
+                       }
+               } catch (RepositoryException e) {
+                       throw new SlcException("Cannot register repository", e);
+               } finally {
+                       JcrUtils.logoutQuietly(nodeSession);
+               }
+               //
+               // try {
+               // nodeSession = nodeRepository.login();
+               // NodeIterator repos = JcrUtils.mkdirs(
+               // nodeSession,
+               // UserJcrUtils.getUserHome(nodeSession).getPath()
+               // + RepoConstants.REPOSITORIES_BASE_PATH).getNodes();
+               // while (repos.hasNext()) {
+               // Node repository = repos.nextNode();
+               // String label = null;
+               // if (repository.isNodeType(NodeType.MIX_TITLE)) {
+               // label = repository.getProperty(Property.JCR_TITLE)
+               // .getString();
+               // }
+               //
+               // if (repository.isNodeType(ArgeoTypes.ARGEO_REMOTE_REPOSITORY)) {
+               // String uri = repository.getProperty(ARGEO_URI).getString();
+               // Credentials credentials = null;
+               // if (repository.hasProperty(ARGEO_USER_ID)) {
+               // String userId = repository.getProperty(ARGEO_USER_ID)
+               // .getString();
+               // credentials = new SimpleCredentials(userId,
+               // "".toCharArray());
+               // }
+               // Repository remoteRepository = ArgeoJcrUtils
+               // .getRepositoryByUri(repositoryFactory, uri);
+               // if (label == null)
+               // label = repository.getName();
+               // repositories.add(new RepositoryElem(label,
+               // remoteRepository, credentials));
+               // }
+               // }
+               // } catch (RepositoryException e) {
+               // throw new ArgeoException("Cannot read registered repositories", e);
+               // }
 
                // Remote
-//             String uri = null;
-//             Credentials credentials = null;
-//             Repository remoteRepository = null;
-
-//             try {
-//                     uri = "http://dev.argeo.org/org.argeo.jcr.webapp/pub/java";
-//                     credentials = new GuestCredentials();
-//                     remoteRepository = ArgeoJcrUtils.getRepositoryByUri(repositoryFactory, uri);
-//                     repositories.add(new RepositoryElem("anonymous@dev.argeo.org//java",
-//                                     remoteRepository, credentials));
-//             } catch (Exception e) {
-//                     e.printStackTrace();
-//             }
-
-//             uri = "http://localhost:7070/org.argeo.jcr.webapp/pub/java";
-//             credentials = new GuestCredentials();
-//             remoteRepository = ArgeoJcrUtils.getRepositoryByUri(repositoryFactory, uri);
-//             repositories.add(new RepositoryElem("anonymous@localhost//java",
-//                             remoteRepository, credentials));
-
-//             uri = "http://localhost:7070/org.argeo.jcr.webapp/remoting/java";
-//             credentials = new SimpleCredentials(System.getProperty("user.name"),
-//                             "".toCharArray());
-//             remoteRepository = ArgeoJcrUtils.getRepositoryByUri(repositoryFactory, uri);
-//             repositories.add(new RepositoryElem("@localhost//java",
-//                             remoteRepository, credentials));
-
-               viewer.setInput(getSite());
+               // String uri = null;
+               // Credentials credentials = null;
+               // Repository remoteRepository = null;
+
+               // try {
+               // uri = "http://dev.argeo.org/org.argeo.jcr.webapp/pub/java";
+               // credentials = new GuestCredentials();
+               // remoteRepository =
+               // ArgeoJcrUtils.getRepositoryByUri(repositoryFactory, uri);
+               // repositories.add(new RepositoryElem("anonymous@dev.argeo.org//java",
+               // remoteRepository, credentials));
+               // } catch (Exception e) {
+               // e.printStackTrace();
+               // }
+
+               // uri = "http://localhost:7070/org.argeo.jcr.webapp/pub/java";
+               // credentials = new GuestCredentials();
+               // remoteRepository =
+               // ArgeoJcrUtils.getRepositoryByUri(repositoryFactory, uri);
+               // repositories.add(new RepositoryElem("anonymous@localhost//java",
+               // remoteRepository, credentials));
+
+               // uri = "http://localhost:7070/org.argeo.jcr.webapp/remoting/java";
+               // credentials = new SimpleCredentials(System.getProperty("user.name"),
+               // "".toCharArray());
+               // remoteRepository =
+               // ArgeoJcrUtils.getRepositoryByUri(repositoryFactory, uri);
+               // repositories.add(new RepositoryElem("@localhost//java",
+               // remoteRepository, credentials));
+
+               viewer.setInput(nodeRepository);
 
        }
 
@@ -156,14 +237,18 @@ public class DistributionsView extends ViewPart implements SlcNames {
                viewer.setContentProvider(new DistributionsContentProvider());
        }
 
-       public void setRepository(Repository repository) {
-               this.repository = repository;
+       public void setNodeRepository(Repository repository) {
+               this.nodeRepository = repository;
        }
 
        public void setRepositoryFactory(RepositoryFactory repositoryFactory) {
                this.repositoryFactory = repositoryFactory;
        }
 
+       public void setKeyring(Keyring keyring) {
+               this.keyring = keyring;
+       }
+
        /** Programatically configure the context menu */
        protected void contextMenuAboutToShow(IMenuManager menuManager) {
                IWorkbenchWindow window = DistPlugin.getDefault().getWorkbench()
@@ -190,8 +275,7 @@ public class DistributionsView extends ViewPart implements SlcNames {
                        // create workspace
                        CommandHelpers.refreshCommand(menuManager, window,
                                        CreateWorkspace.ID, CreateWorkspace.DEFAULT_LABEL,
-                                       CreateWorkspace.DEFAULT_ICON_PATH,
-                                       tp instanceof RepositoryElem);
+                                       CreateWorkspace.DEFAULT_ICON_PATH, !isDistribElem);
 
                        // Normalize workspace
                        Map<String, String> params = new HashMap<String, String>();
@@ -226,44 +310,187 @@ public class DistributionsView extends ViewPart implements SlcNames {
                }
        }
 
-       private class DistributionsContentProvider extends
-                       AbstractTreeContentProvider {
+       private class DistributionsContentProvider implements ITreeContentProvider {
+               Session nodeSession;
+               List<RepoElem> repositories = new ArrayList<RepoElem>();
 
-               public Object[] getElements(Object arg0) {
+               public Object[] getElements(Object input) {
+                       Repository nodeRepository = (Repository) input;
+                       try {
+                               if (nodeSession != null)
+                                       dispose();
+                               nodeSession = nodeRepository.login();
+
+                               String reposPath = UserJcrUtils.getUserHome(nodeSession)
+                                               .getPath() + RepoConstants.REPOSITORIES_BASE_PATH;
+                               NodeIterator repos = nodeSession.getNode(reposPath).getNodes();
+                               while (repos.hasNext()) {
+                                       Node repoNode = repos.nextNode();
+                                       if (repoNode.isNodeType(ArgeoTypes.ARGEO_REMOTE_REPOSITORY)) {
+                                               repositories.add(new RepoElem(repoNode));
+                                       }
+                               }
+                       } catch (RepositoryException e) {
+                               throw new SlcException("Cannot get base elements", e);
+                       }
                        return repositories.toArray();
                }
 
+               public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+
+               }
+
+               public Object[] getChildren(Object parentElement) {
+                       if (parentElement instanceof RepoElem) {
+                               return ((RepoElem) parentElement).getChildren();
+                       } else if (parentElement instanceof DistributionElem) {
+                               return ((DistributionElem) parentElement).getChildren();
+                       }
+                       return null;
+               }
+
+               public Object getParent(Object element) {
+                       // TODO register repo elem in distirbution elem?
+                       return null;
+               }
+
+               public boolean hasChildren(Object element) {
+                       if (element instanceof RepoElem) {
+                               return true;
+                       } else if (element instanceof DistributionElem) {
+                               return false;
+                       }
+                       return false;
+               }
+
+               public void dispose() {
+                       for (RepoElem repoElem : repositories)
+                               repoElem.dispose();
+                       repositories = new ArrayList<RepoElem>();
+                       JcrUtils.logoutQuietly(nodeSession);
+               }
+
        }
 
-       /** Wraps a repository **/
-       private static class RepositoryElem extends TreeParent {
-               // private final Repository repository;
-               private Session defaultSession;
+       // private class DistributionsContentProvider extends
+       // AbstractTreeContentProvider {
+       //
+       // public Object[] getElements(Object arg0) {
+       // return repositories.toArray();
+       // }
+       //
+       // }
 
-               public RepositoryElem(String name, Repository repository,
-                               Credentials credentials) {
-                       super(name);
+       private class RepoElem {
+               private Node repoNode;
+
+               private Repository repository;
+               private Credentials credentials;
+               private Session defaultSession = null;
+
+               public RepoElem(Node repoNode) {
+                       this.repoNode = repoNode;
+               }
+
+               /** Lazily connects to repository */
+               protected void connect() {
+                       if (defaultSession != null)
+                               return;
+
+                       try {
+                               if (repoNode.isNodeType(ArgeoTypes.ARGEO_REMOTE_REPOSITORY)) {
+                                       String uri = repoNode.getProperty(ARGEO_URI).getString();
+                                       if (uri.startsWith("http")) {// http, https
+                                               if (repoNode.hasProperty(ARGEO_USER_ID)) {
+                                                       String userId = repoNode.getProperty(ARGEO_USER_ID)
+                                                                       .getString();
+                                                       char[] password = keyring.getAsChars(repoNode
+                                                                       .getPath() + '/' + ARGEO_PASSWORD);
+                                                       credentials = new SimpleCredentials(userId,
+                                                                       password);
+                                               }
+                                               repository = ArgeoJcrUtils.getRepositoryByUri(
+                                                               repositoryFactory, uri);
+                                       } else {// alias
+                                               String alias = uri;
+                                               repository = ArgeoJcrUtils.getRepositoryByAlias(
+                                                               repositoryFactory, alias);
+                                               credentials = null;
+                                       }
+                                       defaultSession = repository.login(credentials);
+                               }
+                       } catch (RepositoryException e) {
+                               throw new SlcException("Cannot connect to repository "
+                                               + repoNode, e);
+                       }
+               }
+
+               public String getLabel() {
+                       try {
+                               if (repoNode.isNodeType(NodeType.MIX_TITLE)) {
+                                       return repoNode.getProperty(Property.JCR_TITLE).getString();
+                               } else {
+                                       return repoNode.getName();
+                               }
+                       } catch (RepositoryException e) {
+                               throw new SlcException("Cannot read label of " + repoNode, e);
+                       }
+               }
+
+               public String toString() {
+                       return repoNode.toString();
+               }
+
+               public Object[] getChildren() {
+                       connect();
                        try {
-                               defaultSession = repository.login(credentials);
                                String[] workspaceNames = defaultSession.getWorkspace()
                                                .getAccessibleWorkspaceNames();
+                               List<DistributionElem> distributionElems = new ArrayList<DistributionElem>();
                                for (String workspace : workspaceNames)
-                                       addChild(new DistributionElem(repository, workspace,
-                                                       credentials));
+                                       distributionElems.add(new DistributionElem(repository,
+                                                       workspace, credentials));
+                               return distributionElems.toArray();
                        } catch (RepositoryException e) {
-                               ErrorFeedback.show("Cannot log to repository", e);
+                               throw new SlcException(
+                                               "Cannot list workspaces for " + repoNode, e);
                        }
                }
 
-               @Override
-               public synchronized void dispose() {
-                       if (log.isTraceEnabled())
-                               log.trace("Disposing RepositoryElement");
+               public void dispose() {
                        JcrUtils.logoutQuietly(defaultSession);
-                       super.dispose();
                }
        }
 
+       /** Wraps a repository **/
+       // private static class RepositoryElem extends TreeParent {
+       // // private final Repository repository;
+       // private Session defaultSession;
+       //
+       // public RepositoryElem(String name, Repository repository,
+       // Credentials credentials) {
+       // super(name);
+       // try {
+       // defaultSession = repository.login(credentials);
+       // String[] workspaceNames = defaultSession.getWorkspace()
+       // .getAccessibleWorkspaceNames();
+       // for (String workspace : workspaceNames)
+       // addChild(new DistributionElem(repository, workspace,
+       // credentials));
+       // } catch (RepositoryException e) {
+       // ErrorFeedback.show("Cannot log to repository", e);
+       // }
+       // }
+       //
+       // @Override
+       // public synchronized void dispose() {
+       // if (log.isTraceEnabled())
+       // log.trace("Disposing RepositoryElement");
+       // JcrUtils.logoutQuietly(defaultSession);
+       // super.dispose();
+       // }
+       // }
+
        private static class DistributionElem extends TreeParent {
                private final String workspaceName;
                private final Repository repository;
@@ -292,8 +519,8 @@ public class DistributionsView extends ViewPart implements SlcNames {
 
        @Override
        public void dispose() {
-               for (RepositoryElem re : repositories)
-                       re.dispose();
+               // for (RepositoryElem re : repositories)
+               // re.dispose();
                super.dispose();
        }
 
diff --git a/pom.xml b/pom.xml
index bd52f409a05892d5fd001353f7da0481719ab4b6..c22afef3e53fed2e3475a2f895f511b992a11515 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
        <parent>
                <groupId>org.argeo.commons</groupId>
                <artifactId>argeo-commons</artifactId>
-               <version>1.1.4</version>
+               <version>1.1.5-SNAPSHOT</version>
        </parent>
        <groupId>org.argeo.slc</groupId>
        <artifactId>argeo-slc</artifactId>
index 6696bfb7bfaf1944f81e18c95ca4875934122d3d..4bba7e60f2f2d536fa7dc3c7fcad981e735a204e 100644 (file)
@@ -17,10 +17,14 @@ package org.argeo.slc.repo;
 
 /** SLC repository constants */
 public interface RepoConstants {
+       public final static String DEFAULT_JAVA_REPOSITORY_ALIAS = "java";
+
        public final static String DEFAULT_ARTIFACTS_BASE_PATH = "/";
        public final static String REPO_BASEPATH = "/slc:repo";
        public final static String PROXIED_REPOSITORIES = REPO_BASEPATH
                        + "/slc:sources";
        public final static String DISTRIBUTIONS_BASE_PATH = REPO_BASEPATH
                        + "/slc:distributions";
+       public final static String REPOSITORIES_BASE_PATH = REPO_BASEPATH
+                       + "/slc:repositories";
 }