]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/utils/JcrUiUtils.java
Move to the root the bundles which will be part of v1.4 and v2.2
[lgpl/argeo-commons.git] / org.argeo.jcr.ui.explorer / src / main / java / org / argeo / jcr / ui / explorer / utils / JcrUiUtils.java
diff --git a/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/utils/JcrUiUtils.java b/org.argeo.jcr.ui.explorer/src/main/java/org/argeo/jcr/ui/explorer/utils/JcrUiUtils.java
new file mode 100644 (file)
index 0000000..ca32113
--- /dev/null
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2007-2012 Argeo GmbH
+ *
+ * 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.jcr.ui.explorer.utils;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.ArgeoException;
+import org.argeo.eclipse.ui.TreeParent;
+import org.argeo.jcr.ui.explorer.model.RepositoriesElem;
+import org.argeo.jcr.ui.explorer.model.RepositoryElem;
+import org.argeo.jcr.ui.explorer.model.SingleJcrNodeElem;
+import org.argeo.jcr.ui.explorer.model.WorkspaceElem;
+
+/** Centralizes some useful methods to build UIs with JCR */
+public class JcrUiUtils {
+
+       /** Insure that the UI component is not stale, refresh if needed */
+       public static void forceRefreshIfNeeded(TreeParent element) {
+               Node curNode = null;
+
+               boolean doRefresh = false;
+
+               try {
+                       if (element instanceof SingleJcrNodeElem) {
+                               curNode = ((SingleJcrNodeElem) element).getNode();
+                       } else if (element instanceof WorkspaceElem) {
+                               curNode = ((WorkspaceElem) element).getRootNode();
+                       }
+
+                       if (curNode != null
+                                       && element.getChildren().length != curNode.getNodes()
+                                                       .getSize())
+                               doRefresh = true;
+                       else if (element instanceof RepositoryElem) {
+                               RepositoryElem rn = (RepositoryElem) element;
+                               if (rn.isConnected()) {
+                                       String[] wkpNames = rn.getAccessibleWorkspaceNames();
+                                       if (element.getChildren().length != wkpNames.length)
+                                               doRefresh = true;
+                               }
+                       } else if (element instanceof RepositoriesElem) {
+                               doRefresh = true;
+                               // Always force refresh for RepositoriesElem : the condition
+                               // below does not take remote repository into account and it is
+                               // not trivial to do so.
+
+                               // RepositoriesElem rn = (RepositoriesElem) element;
+                               // if (element.getChildren().length !=
+                               // rn.getRepositoryRegister()
+                               // .getRepositories().size())
+                               // doRefresh = true;
+                       }
+                       if (doRefresh) {
+                               element.clearChildren();
+                               element.getChildren();
+                       }
+               } catch (RepositoryException re) {
+                       throw new ArgeoException(
+                                       "Unexpected error while synchronising the UI with the JCR repository",
+                                       re);
+               }
+       }
+
+       /**
+        * Insure that a model element is inline with the underlying data by
+        * cleaning the corresponding subtree and building it again.
+        */
+       public static void forceRebuild(TreeParent element) {
+               // TODO implement this method if needed.
+       }
+       /**
+        * Workaround to get the alias of the repository that contains the given
+        * element. As we cannot browse the UI tree upward we recursively browse it
+        * downward until we find the given element
+        * */
+       // public static String getRepositoryAliasFromITreeElement(
+       // NodeContentProvider ncp, Object element) {
+       // RepositoryNode repositoryNode = null;
+       // if (element instanceof RepositoryNode)
+       // return ((RepositoryNode) element).getName();
+       // else if (element instanceof RepositoryRegister)
+       // throw new ArgeoException(
+       // "Cannot get alias for a repository register");
+       //
+       // // Get root elements
+       // Object[] elements = ncp.getElements(null);
+       //
+       // try {
+       // for (int i = 0; i < elements.length; i++) {
+       // if (elements[i] instanceof Node) {
+       // Node curNode = (Node) elements[i];
+       // if (curNode.isNodeType(ArgeoTypes.ARGEO_USER_HOME)) {
+       // // Do nothing, we'll find the node in the "normal" tree
+       // // and
+       // // get corresponding alias this way round
+       // } else
+       // throw new ArgeoException(
+       // "Normal nodes should not be at the root of NodeTreeViewer");
+       // } else if (elements[i] instanceof RepositoryRegister) {
+       // RepositoryRegister repositoryRegister = (RepositoryRegister) elements[i];
+       // Map<String, Repository> repositories = repositoryRegister
+       // .getRepositories();
+       //
+       // for (String name : repositories.keySet()) {
+       // boolean found = isElementInCurrentTreePart(
+       // ncp,
+       // new RepositoryNode(name, repositories.get(name)),
+       // (Node) element);
+       // if (found)
+       // return name;
+       // }
+       // } else
+       // throw new ArgeoException(
+       // "Unexpected object class at the root of NodeTreeViewer");
+       // }
+       // } catch (RepositoryException re) {
+       // throw new ArgeoException(
+       // "Unexpected error while retrieving Alias name", re);
+       // }
+       // return null;
+       // }
+       //
+       // /** implements the recursivity */
+       // private static boolean isElementInCurrentTreePart(NodeContentProvider
+       // ncp,
+       // Object parentElement, NodParente searchedElement) {
+       // boolean found = false;
+       // if (parentElement instanceof WorkspaceNode) {
+       // WorkspaceNode wn = (WorkspaceNode) parentElement;
+       // Object[] children = wn.getChildren();
+       // int i = children.length - 1;
+       // while (!found && i >= 0) {
+       // found = isElementInCurrentTreePart(ncp, children[i],
+       // searchedElement);
+       // }
+       // return found;
+       // } else if (parentElement instanceof RepositoryNode) {
+       // RepositoryNode rn = (RepositoryNode) parentElement;
+       // Object[] children = rn.getChildren();
+       // int i = children.length - 1;
+       // while (!found && i >= 0) {
+       // found = isElementInCurrentTreePart(ncp, children[i],
+       // searchedElement);
+       // }
+       // return found;
+       // } else {
+       // Node node = (Node) parentElement;
+       // if (node.equals(searchedElement))
+       // return true;
+       // NodeIterator ni;
+       // try {
+       // ni = node.getNodes();
+       // while (!found && ni.hasNext()) {
+       // found = isElementInCurrentTreePart(ncp, ni.nextNode(),
+       // searchedElement);
+       // }
+       // } catch (RepositoryException e) {
+       // throw new ArgeoException("unexpected erreur while recursively"
+       // + " recovering RepositoryNode for selected object", e);
+       // }
+       //
+       // return found;
+       // }
+       // }
+}