blob: 68226e505501233b3647ab366c170fe1cfcc5682 [file] [log] [blame]
package com.atlassian.uwc.hierarchies;
import java.util.Collection;
import java.util.Properties;
import org.apache.log4j.Logger;
import com.atlassian.uwc.converters.IllegalLinkNameConverter;
import com.atlassian.uwc.ui.Page;
/**
* NOTE: This hierarchy will truncate the page name to the leaf node of the filename with a settable delimiter property
* for identifying nodes. It presumes all leaf nodes are unique. Any naming collisions MUST be dealt with prior to
* this hierarchy being applied.
*/
public class FilenameHierarchy implements HierarchyBuilder {
private static final String DEFAULT_DELIM = "%2F";
public static final String PROPKEY_DELIM = "filename-hierarchy-delimiter";
Properties props = new Properties();
Logger log = Logger.getLogger(this.getClass());
private String delim = DEFAULT_DELIM;
private IllegalLinkNameConverter decoder;
@Override
public HierarchyNode buildHierarchy(Collection<Page> pages) {
log.info("Building Filename Hierarchy");
if (pages == null || pages.isEmpty()) {
log.error("Cannot build hierarchy. Pages object is null or empty.");
return null;
}
initProperties();
return getAllNodes(pages);
}
private void initProperties() {
if (getProperties().containsKey(PROPKEY_DELIM))
delim = getProperties().getProperty(PROPKEY_DELIM, DEFAULT_DELIM);
}
public HierarchyNode getAllNodes(Collection<Page> pages) {
HierarchyNode root = new HierarchyNode();
for (Page page : pages) {
if (page != null) {
log.debug("Page [name, filename, abspath]: [" + page.getName() + ", " + page.getFile().getName() + ", " + page.getFile().getAbsolutePath()+"]");
root = buildRelationships(page, root);
}
}
log.debug("Hierarchy: " + root.toString());
return root;
}
private HierarchyNode buildRelationships(Page page, HierarchyNode root) {
//get the original filename of the page
String origFilename = page.getFile().getName();
//construct the set of Strings that will represent page names and nodes
String[] names = origFilename.split(this.delim);
//for each, if the node exists, get it, if not create a placeholder
HierarchyNode current = root;
for (int i = 0; i < names.length; i++) {
String name = names[i];
HierarchyNode node = getNode(current, name);
current.addChild(node);
current = node;
}
page.setName(current.getName());
current.setPage(page);
return root;
}
private HierarchyNode getNode(HierarchyNode node, String name) {
for (HierarchyNode child : node.getChildren()) {
if (child.getName().equalsIgnoreCase(name)) return child;
}
HierarchyNode newnode = new HierarchyNode();
newnode.setName(urldecode(name));
return newnode;
}
private String urldecode(String name) {
if (this.decoder == null) this.decoder = new IllegalLinkNameConverter();
return this.decoder.decodeUrl(name);
}
@Override
public void setProperties(Properties properties) {
this.props = properties;
}
@Override
public Properties getProperties() {
return this.props;
}
}