1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
package tim.prune.save.xml;
import java.util.ArrayList;
import java.util.List;
/**
* For GPX 1.1, the extensions appear in a tree of categories, so this tree
* needs to be rebuilt for export depending on which categories are present
*/
public class ExtensionTree
{
/** Single category containing tags and subcategories */
private static class Category
{
private final String _name;
private final ArrayList<Category> _subcategories = new ArrayList<>();
private final ArrayList<String> _tags = new ArrayList<>();
Category(String inName) {
_name = inName;
}
Category getSubcategory(String inName)
{
for (Category subcat : _subcategories)
{
if (subcat._name.equals(inName)) {
return subcat;
}
}
Category subcat = new Category(inName);
_subcategories.add(subcat);
return subcat;
}
void addTag(String inTag) {
_tags.add(inTag);
}
}
/** Root category of tree */
private final Category _root = new Category(null);
/**
* Add a tag to the tree
* @param inCategories array of category strings
* @param inTag xml tag inside category
*/
public void addTag(String[] inCategories, String inTag)
{
if (inTag == null || inTag.equals("")) {
return;
}
Category category = _root;
if (inCategories != null)
{
for (String catName : inCategories) {
category = category.getSubcategory(catName);
}
}
category.addTag(inTag);
}
/**
* @return a list of all the tags, including categories and subcategories
*/
public List<String> getAllTags(int inStartIndent)
{
ArrayList<String> tags = new ArrayList<>();
addTags(_root, tags, inStartIndent);
return tags;
}
/** Recursively add the tags and subcategories to the given list */
private static void addTags(Category inCategory, ArrayList<String> inTags, int inIndent)
{
for (String tag : inCategory._tags) {
inTags.add("\t".repeat(inIndent) + tag);
}
for (Category subcat : inCategory._subcategories)
{
inTags.add("\t".repeat(inIndent) + "<" + subcat._name + ">");
addTags(subcat, inTags, inIndent + 1);
inTags.add("\t".repeat(inIndent) + "</" + subcat._name + ">");
}
}
}
|