]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - cms/org.argeo.slc.client.ui.dist/src/org/argeo/slc/client/ui/dist/controllers/DistTreeContentProvider.java
Clarify SLC project structure.
[gpl/argeo-slc.git] / cms / org.argeo.slc.client.ui.dist / src / org / argeo / slc / client / ui / dist / controllers / DistTreeContentProvider.java
diff --git a/cms/org.argeo.slc.client.ui.dist/src/org/argeo/slc/client/ui/dist/controllers/DistTreeContentProvider.java b/cms/org.argeo.slc.client.ui.dist/src/org/argeo/slc/client/ui/dist/controllers/DistTreeContentProvider.java
new file mode 100644 (file)
index 0000000..b7e25d1
--- /dev/null
@@ -0,0 +1,140 @@
+package org.argeo.slc.client.ui.dist.controllers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+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.nodetype.NodeType;
+
+import org.argeo.api.NodeConstants;
+import org.argeo.api.NodeUtils;
+import org.argeo.api.security.Keyring;
+import org.argeo.cms.ArgeoNames;
+import org.argeo.cms.ArgeoTypes;
+import org.argeo.eclipse.ui.TreeParent;
+import org.argeo.jcr.JcrUtils;
+import org.argeo.slc.SlcException;
+import org.argeo.slc.client.ui.dist.model.RepoElem;
+import org.argeo.slc.repo.RepoConstants;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+/**
+ * Enables browsing in local and remote SLC software repositories. Keyring and
+ * repository factory must be injected
+ */
+public class DistTreeContentProvider implements ITreeContentProvider {
+       private static final long serialVersionUID = -7640840211717811421L;
+
+       /* DEPENDENCY INJECTION */
+       private RepositoryFactory repositoryFactory;
+       private Keyring keyring;
+
+       // Context
+       private Session nodeSession;
+       List<RepoElem> repositories = new ArrayList<RepoElem>();
+
+       public Object[] getElements(Object input) {
+               Repository nodeRepository = (Repository) input;
+               try {
+                       if (nodeSession != null)
+                               dispose();
+                       nodeSession = nodeRepository.login(NodeConstants.HOME_WORKSPACE);
+
+                       String reposPath = NodeUtils.getUserHome(nodeSession).getPath() + RepoConstants.REPOSITORIES_BASE_PATH;
+
+                       if (!nodeSession.itemExists(reposPath))
+                               initializeModel(nodeSession);
+
+                       NodeIterator repos = nodeSession.getNode(reposPath).getNodes();
+                       while (repos.hasNext()) {
+                               Node repoNode = repos.nextNode();
+                               if (repoNode.isNodeType(ArgeoTypes.ARGEO_REMOTE_REPOSITORY)) {
+                                       String label = repoNode.isNodeType(NodeType.MIX_TITLE)
+                                                       ? repoNode.getProperty(Property.JCR_TITLE).getString()
+                                                       : repoNode.getName();
+                                       repositories.add(new RepoElem(repositoryFactory, keyring, repoNode, label));
+                               }
+                       }
+               } catch (RepositoryException e) {
+                       throw new SlcException("Cannot get base elements", e);
+               }
+               return repositories.toArray();
+       }
+
+       public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+       }
+
+       // @Override
+       public Object[] getChildren(Object parentElement) {
+               if (parentElement instanceof TreeParent)
+                       return ((TreeParent) parentElement).getChildren();
+               else
+                       return null;
+       }
+
+       // @Override
+       public Object getParent(Object element) {
+               if (element instanceof TreeParent)
+                       return ((TreeParent) element).getParent();
+               return null;
+       }
+
+       // @Override
+       public boolean hasChildren(Object element) {
+               if (element instanceof TreeParent)
+                       return ((TreeParent) element).hasChildren();
+               else
+                       return false;
+       }
+
+       public void dispose() {
+               for (RepoElem repoElem : repositories)
+                       repoElem.dispose();
+               repositories = new ArrayList<RepoElem>();
+               JcrUtils.logoutQuietly(nodeSession);
+       }
+
+       private void initializeModel(Session nodeSession) {
+               try {
+                       Node homeNode = NodeUtils.getUserHome(nodeSession);
+                       if (homeNode == null) // anonymous
+                               throw new SlcException("User must be authenticated.");
+
+                       // make sure base directory is available
+                       Node repos = JcrUtils.mkdirs(homeNode, RepoConstants.REPOSITORIES_BASE_PATH, null);
+                       if (nodeSession.hasPendingChanges())
+                               nodeSession.save();
+
+                       // register default local java repository
+                       String alias = RepoConstants.DEFAULT_JAVA_REPOSITORY_ALIAS;
+                       Repository javaRepository = NodeUtils.getRepositoryByAlias(repositoryFactory, alias);
+                       if (javaRepository != null) {
+                               if (!repos.hasNode(alias)) {
+                                       Node repoNode = repos.addNode(alias, ArgeoTypes.ARGEO_REMOTE_REPOSITORY);
+                                       repoNode.setProperty(ArgeoNames.ARGEO_URI, "vm:///" + alias);
+                                       repoNode.addMixin(NodeType.MIX_TITLE);
+                                       repoNode.setProperty(Property.JCR_TITLE, RepoConstants.DEFAULT_JAVA_REPOSITORY_LABEL);
+                                       nodeSession.save();
+                               }
+                       }
+               } catch (RepositoryException e) {
+                       throw new SlcException("Cannot initialize model", e);
+               }
+       }
+
+       /* DEPENDENCY INJECTION */
+       public void setRepositoryFactory(RepositoryFactory repositoryFactory) {
+               this.repositoryFactory = repositoryFactory;
+       }
+
+       public void setKeyring(Keyring keyring) {
+               this.keyring = keyring;
+       }
+}
\ No newline at end of file