/** * Copyright (c) 2013-2016 Angelo ZERR. * 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: * Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation */ package tern.angular.modules; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.helpers.XMLReaderFactory; import tern.angular.AngularType; import tern.utils.StringUtils; /** * SAX Module to load module with XML file. * */ class SAXModuleHandler extends DefaultHandler { private Module module; private StringBuilder description = null; private Directive directive; private DirectiveParameter directiveParameter; public Module load(InputStream in) throws IOException, SAXException { XMLReader xmlReader = XMLReaderFactory.createXMLReader(); xmlReader.setContentHandler(this); xmlReader.parse(new InputSource(in)); return module; } @Override public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException { if ("module".equals(name)) { String moduleName = attributes.getValue("name"); module = new Module(moduleName); } else if ("directive".equals(name)) { String directiveName = attributes.getValue("name"); String url = attributes.getValue("url"); AngularType directiveType = AngularType.get(attributes .getValue("type")); // tags name List<String> tagsName = new ArrayList<String>(); String tags = attributes.getValue("tags"); if (!StringUtils.isEmpty(tags)) { String[] names = tags.split(","); String tagName = null; for (int i = 0; i < names.length; i++) { tagName = names[i].trim(); if (tagName.length() > 0) { tagsName.add(tagName); } } } // restrict String restrict = attributes.getValue("restrict"); // value : required|optional|none DirectiveValue directiveValue = DirectiveValue.get(attributes .getValue("value")); this.directive = new Directive(directiveName, directiveType, url, tagsName, restrict, directiveValue, false, module); } else if ("description".equals(name)) { this.description = new StringBuilder(); } else if ("parameter".equals(name)) { String parameterName = attributes.getValue("name"); boolean optional = StringUtils.asBoolean( attributes.getValue("optional"), false); this.directiveParameter = new DirectiveParameter(parameterName, optional, directive); directive.addParameter(directiveParameter); this.description = new StringBuilder(); } super.startElement(uri, localName, name, attributes); } @Override public void endElement(String uri, String localName, String name) throws SAXException { if ("directive".equals(name)) { this.directive = null; } else if ("parameter".equals(name)) { if (description != null) { directiveParameter.setDescription(description.toString()); } this.directiveParameter = null; } else if ("description".equals(name)) { this.directive.setDescription(description.toString()); this.description = null; } super.endElement(uri, localName, name); } public Module getModule() { return module; } @Override public void characters(char ch[], int start, int length) throws SAXException { if (description != null) { description.append(String.valueOf(ch, start, length)); } super.characters(ch, start, length); } }