blob: 38f3919297752e7614fda1b6abe2e91841c7b47e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 Pascal Essiembre.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Pascal Essiembre - initial API and implementation
******************************************************************************/
package org.eclipse.babel.core.message.tree;
import java.util.Arrays;
import java.util.StringTokenizer;
import org.eclipse.babel.core.message.MessagesBundleGroup;
import org.eclipse.babel.core.message.MessagesBundleGroupAdapter;
/**
* Default key tree model, using a delimiter to separate key sections
* into nodes. For instance, a dot (.) delimiter on the following key...<p>
* <code>person.address.street</code><P>
* ... will result in the following node hierarchy:<p>
* <pre>
* person
* address
* street
* </p>
* @author Pascal Essiembre
*/
public class DefaultKeyTreeModel extends AbstractKeyTreeModel {
private KeyTreeNode rootNode = new KeyTreeNode(null, null, null);
private String delimiter;
private MessagesBundleGroup messagesBundleGroup;
/**
* Defaults to ".".
*/
public DefaultKeyTreeModel(MessagesBundleGroup messagesBundleGroup) {
this(messagesBundleGroup, "."); //$NON-NLS-1$
}
/**
* Constructor.
* @param messagesBundleGroup {@link MessagesBundleGroup} instance
* @param delimiter key section delimiter
*/
public DefaultKeyTreeModel(
MessagesBundleGroup messagesBundleGroup, String delimiter) {
super();
this.messagesBundleGroup = messagesBundleGroup;
this.delimiter = delimiter;
createTree();
messagesBundleGroup.addMessagesBundleGroupListener(
new MessagesBundleGroupAdapter() {
public void keyAdded(String key) {
createTreeNodes(key);
}
public void keyRemoved(String key) {
removeTreeNodes(key);
}
});
}
/**
* Gets the delimiter.
* @return delimiter
*/
public String getDelimiter() {
return delimiter;
}
/**
* Sets the delimiter.
* @param delimiter delimiter
*/
public void setDelimiter(String delimiter) {
this.delimiter = delimiter;
}
/**
* Gets the key tree root nodes.
* @return key tree root nodes
*/
public KeyTreeNode[] getRootNodes() {
return getChildren(rootNode);
}
public KeyTreeNode getRootNode() {
return rootNode;
}
/**
* Gets the child nodes of a given key tree node.
* @param node the node from which to get children
* @return child nodes
*/
public KeyTreeNode[] getChildren(KeyTreeNode node) {
KeyTreeNode[] nodes = node.getChildren();
if (getComparator() != null) {
Arrays.sort(nodes, getComparator());
}
return nodes;
}
/**
* Gets the parent node of the given node.
* @param node node from which to get parent
* @return parent node
*/
public KeyTreeNode getParent(KeyTreeNode node) {
return node.getParent();
}
/**
* Gets the messages bundle group that this key tree represents.
* @return messages bundle group
*/
public MessagesBundleGroup getMessagesBundleGroup() {
//TODO consider moving this method (and part of constructor) to super
return messagesBundleGroup;
}
private void createTree() {
rootNode = new KeyTreeNode(null, null, null);
String[] keys = messagesBundleGroup.getMessageKeys();
for (int i = 0; i < keys.length; i++) {
String key = keys[i];
createTreeNodes(key);
}
}
private void createTreeNodes(String bundleKey) {
if (bundleKey == null) {
return;
}
StringTokenizer tokens = new StringTokenizer(bundleKey, delimiter);
KeyTreeNode node = rootNode;
String bundleKeyPart = ""; //$NON-NLS-1$
while (tokens.hasMoreTokens()) {
String name = tokens.nextToken();
bundleKeyPart += name;
KeyTreeNode child = node.getChild(name);
if (child == null) {
child = new KeyTreeNode(node, name, bundleKeyPart);
fireNodeAdded(child);
}
bundleKeyPart += delimiter;
node = child;
}
}
private void removeTreeNodes(String bundleKey) {
if (bundleKey == null) {
return;
}
StringTokenizer tokens = new StringTokenizer(bundleKey, delimiter);
KeyTreeNode node = rootNode;
while (tokens.hasMoreTokens()) {
String name = tokens.nextToken();
node = node.getChild(name);
if (node == null) {
System.err.println(
"No RegEx node matching bundleKey to remove"); //$NON-NLS-1$
return;
}
}
KeyTreeNode parentNode = node.getParent();
parentNode.removeChild(node);
fireNodeRemoved(node);
while (parentNode != rootNode) {
if (!parentNode.hasChildren() && !messagesBundleGroup.isMessageKey(
parentNode.getMessageKey())) {
parentNode.getParent().removeChild(parentNode);
fireNodeRemoved(parentNode);
}
parentNode = parentNode.getParent();
}
}
}