// License: GPL. For details, see LICENSE file. package CommandLine; import java.io.File; import java.util.ArrayList; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.openstreetmap.josm.Main; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import org.xml.sax.helpers.DefaultHandler; public class Loader extends DefaultHandler { private final String dirToScan; private String currentFile; // For debug XML-files private String currentTag; private Command currentCommand; private Parameter currentParameter; private final ArrayList<Command> loadingCommands; public Loader(String dir) { dirToScan = dir; currentTag = ""; loadingCommands = new ArrayList<>(); } public ArrayList<Command> load() { try { // Creating parser SAXParser sp = SAXParserFactory.newInstance().newSAXParser(); // Files loading String[] list = new File(dirToScan + "/").list(); if (list != null) { for (int i = 0; i < list.length; i++) { if (list[i].endsWith(".xml")) { currentFile = dirToScan + "/" + list[i]; loadFile(sp, currentFile); } } } } catch (Exception e) { Main.error(e); } return loadingCommands; } private void loadFile(SAXParser parser, String fileName) { try { String a = new File(fileName).toURI().toString().replace("file:/", "file:///"); Main.info(a); parser.parse(a, this); } catch (Exception e) { Main.error(e); } // TODO: Create links for each argument } @Override public void startElement(String namespaceURI, String localName, String rawName, Attributes attrs) { int len = attrs.getLength(); String Name, Value; currentTag = rawName; if (rawName.equals("command")) { currentCommand = new Command(); for (int i = 0; i < len; i++) { Name = attrs.getQName(i); Value = attrs.getValue(i); if (Name.equals("name")) currentCommand.name = Value; else if (Name.equals("run")) currentCommand.run = Value; else if (Name.equals("tracks")) { if (Value.equals("bbox")) currentCommand.tracks = true; } else if (Name.equals("icon")) { currentCommand.icon = Value; } else if (Name.equals("asynchronous")) { currentCommand.asynchronous = Value.equals("true") ? true : false; } } } else if (rawName.equals("parameter")) { currentParameter = new Parameter(); for (int i = 0; i < len; i++) { Name = attrs.getQName(i); Value = attrs.getValue(i); if (Name.equals("required")) { currentParameter.required = Value.equals("true") ? true : false; } else if (Name.equals("type")) { if (Value.equals("node")) currentParameter.type = Type.NODE; else if (Value.equals("way")) currentParameter.type = Type.WAY; else if (Value.equals("relation")) currentParameter.type = Type.RELATION; else if (Value.equals("point")) currentParameter.type = Type.POINT; else if (Value.equals("length")) currentParameter.type = Type.LENGTH; else if (Value.equals("natural")) currentParameter.type = Type.NATURAL; else if (Value.equals("any")) currentParameter.type = Type.ANY; else if (Value.equals("string")) currentParameter.type = Type.STRING; else if (Value.equals("relay")) currentParameter.type = Type.RELAY; else if (Value.equals("username")) currentParameter.type = Type.USERNAME; else if (Value.equals("imageryurl")) currentParameter.type = Type.IMAGERYURL; else if (Value.equals("imageryoffset")) currentParameter.type = Type.IMAGERYOFFSET; } else if (Name.equals("maxinstances")) { currentParameter.maxInstances = Integer.parseInt(Value); } else if (Name.equals("maxvalue")) { currentParameter.maxVal = Float.parseFloat(Value); } else if (Name.equals("minvalue")) { currentParameter.minVal = Float.parseFloat(Value); } } } } @Override public void characters(char[] ch, int start, int length) { String text = (new String(ch, start, length)).trim(); if (currentParameter != null) { if (currentTag.equals("name")) { currentParameter.name = text; } else if (currentTag.equals("description")) { currentParameter.description = text; } else if (currentTag.equals("value")) { if (currentParameter.type == Type.RELAY) { if (!(currentParameter.getRawValue() instanceof Relay)) currentParameter.setValue(new Relay()); ((Relay) currentParameter.getRawValue()).addValue(text); } else { currentParameter.setValue(text); } } } } @Override public void endElement(String namespaceURI, String localName, String rawName) { if (rawName.equals("command")) { loadingCommands.add(currentCommand); currentCommand = null; } else if (rawName.equals("parameter")) { if (currentParameter.required) currentCommand.parameters.add(currentParameter); else currentCommand.optParameters.add(currentParameter); currentParameter = null; } else { currentTag = ""; } } @Override public void warning(SAXParseException ex) { Main.warn("Warning in command xml file " + currentFile + ": " + ex.getMessage()); } @Override public void error(SAXParseException ex) { Main.error("Error in command xml file " + currentFile + ": " + ex.getMessage()); } @Override public void fatalError(SAXParseException ex) throws SAXException { Main.error("Error in command xml file " + currentFile + ": " + ex.getMessage()); throw ex; } }