/* * RHQ Management Platform * Copyright (C) 2005-2009 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 2, as * published by the Free Software Foundation, and/or the GNU Lesser * General Public License, version 2.1, also as published by the Free * Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License and the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU General Public License * and the GNU Lesser General Public License along with this program; * if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.rhq.augeas.tree; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.rhq.augeas.node.AugeasNode; /** * Stores a buffer of already loaded augeas nodes. * This can be used in the {@link AugeasTree} implementations * to check whether certain nodes have already been loaded. * * @author Filip Drabek * */ public class AugeasNodeBuffer { private Map<String, AugeasNode> buffer; public AugeasNodeBuffer() { buffer = new HashMap<String, AugeasNode>(); } public boolean isNodeLoaded(String name) { return buffer.containsKey(name); } public AugeasNode getNode(String name) { return buffer.get(name); } public void addNode(AugeasNode node) { if (!isNodeLoaded(node.getFullPath())) buffer.put(node.getFullPath(), node); } public void removeNode(AugeasNode node, boolean updateSeq, boolean lazy) { if (buffer.containsKey(node.getFullPath())) buffer.remove(node.getFullPath()); if (updateSeq) if (lazy) reloadLazy(node); else reload(node); } public void reload(AugeasNode nodes) { for (String key : buffer.keySet()) { AugeasNode nd = buffer.get(key); if (!key.equals(nd.getFullPath())) { buffer.remove(key); buffer.put(nd.getFullPath(), nd); } } } public void reloadLazy(AugeasNode node) { Map<String, String> nodesToChange = new HashMap<String, String>(); List<String> nodesToChangeSeq = new ArrayList<String>(); AugeasNode parentNode = node.getParentNode(); for (String key : buffer.keySet()) { int index = key.indexOf(parentNode.getFullPath()); if ((index == 0) && (key.length() > parentNode.getFullPath().length())) { String localPath = key.substring(parentNode.getFullPath().length()); int endOfLabel = localPath.indexOf(File.separatorChar); String label; String restOfPath; if (endOfLabel != -1) { label = localPath.substring(0, endOfLabel); restOfPath = localPath.substring(endOfLabel + 1, localPath.length() - 1); } else { label = localPath.substring(0, localPath.length() - 1); restOfPath = ""; } int startOfSeq = label.indexOf('['); if (startOfSeq != -1) { String labelName = label.substring(0, startOfSeq); if (labelName.equals(node.getLabel())) { int endOfSeq = label.indexOf(']'); String seqNr = label.substring(startOfSeq, endOfSeq - 1); int seq = Integer.valueOf(seqNr).intValue(); if (seq > node.getSeq()) { if (restOfPath.equals("")) nodesToChangeSeq.add(key); else { String newPath = parentNode.getFullPath() + File.separator + labelName + "[" + String.valueOf(seq - 1) + "]" + (restOfPath.equals("") ? File.separator + restOfPath : ""); nodesToChange.put(key, newPath); } } } } } } try { for (String key : nodesToChange.keySet()) { AugeasNode nd = buffer.get(key); nd.setPath((String) nodesToChange.get(key)); } for (String key : nodesToChangeSeq) { AugeasNode nd = buffer.get(key); nd.setSeq(nd.getSeq() - 1); } } catch (Exception e) { //Exception is not thrown here because this method is called only for AugeasNodeLazy } } }