package org.jboss.windup.config.tags; import java.util.Stack; import java.util.logging.Logger; import org.apache.commons.lang3.StringUtils; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * Expects the following XML structure: * * {tag name="foo"} * {tag name="bar" root="true"} * {tag name="baz"} * ... * {tag name="bar"} * {tag name="boo" parents="bar baz"} * ... */ public class TagsSaxHandler extends DefaultHandler { private static final Logger log = Logger.getLogger(TagsSaxHandler.class.getName() ); private final TagService tagService; private final Stack<Tag> stack = new Stack<>(); public TagsSaxHandler(TagService tagsService) { this.tagService = tagsService; } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if("tag".equals(qName)) { String tagName = attributes.getValue("name"); Tag tag = tagService.getOrCreateTag(tagName); if ("true".equals(attributes.getValue("root"))) tag.setIsRoot(true); if ("true".equals(attributes.getValue("pseudo"))) tag.setPseudo(true); tag.setTitle(attributes.getValue("title")); final String color = attributes.getValue("color"); if (color != null) { if (color.matches("#\\p{XDigit}{6}")) tag.setColor(color); else log.fine("Invalid color, not matching #\\p{XDigit}{6}: " + color); } // Add this <tag> to its parent. if(!stack.empty()) stack.peek().addContainedTag(tag); stack.push(tag); // Add the tags named in containedBy="...". String[] containedBy = StringUtils.split( StringUtils.defaultString(attributes.getValue("parents")), " ,"); for (String containingTagName : containedBy) { Tag containingTag = tagService.getOrCreateTag(containingTagName); tag.addContainingTag(containingTag); } } } public void endElement(String uri, String localName, String qName) throws SAXException { if("tag".equals(qName)) { this.stack.pop(); } } }