| /******************************************************************************* |
| * Copyright (c) 2005, 2017 IBM Corporation and others. |
| * 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 |
| * |
| |
| *******************************************************************************/ |
| package org.eclipse.dltk.console; |
| |
| import java.io.IOException; |
| import java.io.StringReader; |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import javax.xml.parsers.DocumentBuilder; |
| import javax.xml.parsers.DocumentBuilderFactory; |
| import javax.xml.parsers.ParserConfigurationException; |
| |
| import org.eclipse.dltk.core.DLTKCore; |
| import org.w3c.dom.Document; |
| import org.w3c.dom.Element; |
| import org.w3c.dom.Node; |
| import org.w3c.dom.NodeList; |
| import org.xml.sax.InputSource; |
| import org.xml.sax.SAXException; |
| |
| public final class ScriptConsoleXmlHelper { |
| private ScriptConsoleXmlHelper() { |
| } |
| |
| protected static int convertState(String state) { |
| if (state.equals("new")) { //$NON-NLS-1$ |
| return IScriptConsoleInterpreter.WAIT_NEW_COMMAND; |
| } else if (state.equals("continue")) { //$NON-NLS-1$ |
| return IScriptConsoleInterpreter.WAIT_CONTINUE_COMMAND; |
| } else if (state.equals("user")) { //$NON-NLS-1$ |
| return IScriptConsoleInterpreter.WAIT_USER_INPUT; |
| } |
| |
| return -1; |
| } |
| |
| protected static boolean isElement(Node node, String name) { |
| return node.getNodeType() == Node.ELEMENT_NODE |
| && node.getNodeName().equals(name); |
| } |
| |
| protected static Document parse(String xml) { |
| if ((xml == null) || (xml.length() == 0)) |
| return null; |
| |
| try { |
| DocumentBuilderFactory factory = DocumentBuilderFactory |
| .newInstance(); |
| DocumentBuilder builder = factory.newDocumentBuilder(); |
| StringReader reader = new StringReader(xml); |
| InputSource source = new InputSource(reader); |
| source.setEncoding("UTF-8"); //$NON-NLS-1$ |
| return builder.parse(source); |
| } catch (ParserConfigurationException e) { |
| if (DLTKCore.DEBUG) { |
| e.printStackTrace(); |
| } |
| } catch (SAXException e) { |
| if (DLTKCore.DEBUG) { |
| e.printStackTrace(); |
| } |
| } catch (IOException e) { |
| if (DLTKCore.DEBUG) { |
| e.printStackTrace(); |
| } |
| } |
| |
| return null; |
| } |
| |
| protected static List<ScriptConsoleCompletionProposal> parseCompletionList(Node completionNode) { |
| NodeList children = completionNode.getChildNodes(); |
| |
| List<ScriptConsoleCompletionProposal> completions = new ArrayList<>(); |
| for (int i = 0; i < children.getLength(); ++i) { |
| Node node = children.item(i); |
| |
| if (!isElement(node, "case")) { //$NON-NLS-1$ |
| continue; |
| } |
| |
| Element element = (Element) node; |
| |
| String display = element.getAttribute("display"); //$NON-NLS-1$ |
| String insert = element.getAttribute("insert"); //$NON-NLS-1$ |
| String type = element.getAttribute("type"); //$NON-NLS-1$ |
| |
| completions.add(new ScriptConsoleCompletionProposal(insert, |
| display, type)); |
| } |
| |
| return completions; |
| } |
| |
| public static String parseInfoXml(String xml) { |
| Document doc = parse(xml); |
| |
| if (doc == null) { |
| return null; |
| } |
| |
| NodeList list = doc.getElementsByTagName("console"); //$NON-NLS-1$ |
| Node node = list.item(0); |
| |
| list = node.getChildNodes(); |
| for (int i = 0; i < list.getLength(); ++i) { |
| Node n = list.item(i); |
| if (isElement(n, "info")) { //$NON-NLS-1$ |
| return ((Element) n).getAttribute("id"); //$NON-NLS-1$ |
| } |
| } |
| |
| return null; |
| } |
| |
| public static ShellResponse parseShellXml(String xml) { |
| Document doc = parse(xml); |
| |
| if (doc == null) { |
| return null; |
| } |
| |
| NodeList list1 = doc.getElementsByTagName("console"); //$NON-NLS-1$ |
| Node node = list1.item(0); |
| |
| list1 = node.getChildNodes(); |
| for (int i = 0; i < list1.getLength(); ++i) { |
| Node n1 = list1.item(i); |
| if (isElement(n1, "shell")) { //$NON-NLS-1$ |
| NodeList list2 = n1.getChildNodes(); |
| for (int j = 0; j < list2.getLength(); ++j) { |
| Node n2 = list2.item(j); |
| if (isElement(n2, "completion")) { //$NON-NLS-1$ |
| List<ScriptConsoleCompletionProposal> completions = parseCompletionList(n2); |
| return new ShellResponse(completions); |
| } else if (isElement(n2, "description")) { //$NON-NLS-1$ |
| if (n2.getChildNodes().getLength() == 0) { |
| return new ShellResponse(""); //$NON-NLS-1$ |
| } else { |
| return new ShellResponse(n2.getFirstChild() |
| .getNodeValue()); |
| } |
| } else if (isElement(n2, "close")) { //$NON-NLS-1$ |
| return new ShellResponse(); |
| } |
| } |
| } |
| } |
| |
| return null; |
| } |
| |
| public static InterpreterResponse parseInterpreterXml(String xml) { |
| Document doc = parse(xml); |
| |
| if (doc == null) { |
| return null; |
| } |
| |
| NodeList list = doc.getElementsByTagName("console").item(0) //$NON-NLS-1$ |
| .getChildNodes(); |
| |
| for (int i = 0; i < list.getLength(); ++i) { |
| Node n = list.item(i); |
| if (isElement(n, "interpreter")) { //$NON-NLS-1$ |
| Element element = (Element) n; |
| String state = element.getAttribute("state"); //$NON-NLS-1$ |
| String response = ""; //$NON-NLS-1$ |
| |
| // Check for empty response |
| if (n.getChildNodes().getLength() > 0) { |
| response = n.getFirstChild().getNodeValue(); |
| } |
| |
| final String stream = element.getAttribute("stream"); //$NON-NLS-1$ |
| final boolean isError = "stderr".equals(stream); //$NON-NLS-1$ |
| return new InterpreterResponse(convertState(state), isError, |
| response); |
| } |
| } |
| |
| return null; |
| } |
| } |