/* * 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 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; // } // } }