+ /**
+ * Exposes some Repository and workspace information about the selected
+ * element without exposing the UI model
+ */
+ public class DistributionViewSelectedElement {
+ public boolean isRepository = false;
+ public boolean isWorkspaceGroup = false;
+ public boolean isWorkspace = false;
+ public String repositoryDescription;
+ public Node repoNode;
+ public String wkspName;
+ public String wkspPrefix;
+ public Repository repository;
+ public Credentials credentials;
+ }
+
+ /**
+ * Returns a {@see DistributionViewSelectedElement} if one and only one
+ * valid element is currently selected.
+ *
+ */
+ public DistributionViewSelectedElement getSelectedElement() {
+
+ IStructuredSelection iss = (IStructuredSelection) viewer.getSelection();
+ if (iss.isEmpty() || iss.size() > 1)
+ return null;
+
+ DistributionViewSelectedElement dvse = new DistributionViewSelectedElement();
+ Object obj = iss.getFirstElement();
+ if (obj instanceof RepoElem) {
+ RepoElem re = (RepoElem) obj;
+ dvse.isRepository = true;
+ dvse.repository = re.getRepository();
+ dvse.repoNode = re.getRepoNode();
+ dvse.credentials = re.getCredentials();
+ dvse.repositoryDescription = getRepositoryDescription(re);
+ } else if (obj instanceof DistribGroupElem) {
+ DistribGroupElem dge = (DistribGroupElem) obj;
+ dvse.isWorkspaceGroup = true;
+ dvse.repository = dge.getRepoElem().getRepository();
+ dvse.repoNode = dge.getRepoElem().getRepoNode();
+ dvse.credentials = dge.getRepoElem().getCredentials();
+ dvse.wkspPrefix = dge.getLabel();
+ dvse.repositoryDescription = getRepositoryDescription(dge
+ .getRepoElem());
+ } else if (obj instanceof DistributionElem) {
+ DistributionElem de = (DistributionElem) obj;
+ dvse.isWorkspace = true;
+ dvse.repository = de.getRepoElem().getRepository();
+ dvse.repoNode = de.getRepoElem().getRepoNode();
+ dvse.credentials = de.getRepoElem().getCredentials();
+ dvse.wkspName = de.getName();
+ dvse.repositoryDescription = getRepositoryDescription(de
+ .getRepoElem());
+ }
+ return dvse;
+ }
+
+ private String getRepositoryDescription(RepoElem repo) {
+ StringBuffer repoDesc = new StringBuffer();
+ repoDesc.append(repo.getLabel());
+ repoDesc.append(" (");
+ repoDesc.append(JcrUtils.get(repo.getRepoNode(), ARGEO_URI));
+ repoDesc.append(")");
+ return repoDesc.toString();
+ }
+
+ @Override
+ public void setFocus() {
+ viewer.getTree().setFocus();
+ }
+
+ /**
+ * Force refresh of the whole view
+ */
+ public void refresh() {
+ viewer.setContentProvider(new DistributionsContentProvider());
+ }
+
+ /*
+ * INTERNAL CLASSES
+ */
+ /** Content provider */
+ private class DistributionsContentProvider implements ITreeContentProvider {
+ 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();
+
+ 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)) {
+ if (RepoConstants.DEFAULT_JAVA_REPOSITORY_ALIAS
+ .equals(repoNode.getName()))
+ repositories
+ .add(new RepoElem(repoNode, true, false));
+ else if (repoNode.hasNode(ARGEO_PASSWORD))
+ repositories.add(new RepoElem(repoNode));
+ else
+ repositories
+ .add(new RepoElem(repoNode, false, true));
+ }
+ }
+ } 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 BrowserElem) {
+ return ((BrowserElem) parentElement).getChildren();
+ } else if (parentElement instanceof DistributionElem) {
+ return ((DistributionElem) parentElement).getChildren();
+ }
+ return null;
+ }
+
+ public Object getParent(Object element) {
+ // TODO register repo elem in distribution elem?
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ if (element instanceof BrowserElem) {
+ 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);