diff options
-rw-r--r-- | org.eclipse.debug.core/core/org/eclipse/debug/internal/core/XMLMemento.java | 119 |
1 files changed, 80 insertions, 39 deletions
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/XMLMemento.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/XMLMemento.java index a463d3e63..6f4cc83bb 100644 --- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/XMLMemento.java +++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/XMLMemento.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2015 IBM Corporation and others. + * Copyright (c) 2000, 2021 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 @@ -16,6 +16,7 @@ import java.io.PrintWriter; import java.io.Reader; import java.io.Writer; import java.util.ArrayList; +import java.util.Arrays; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -40,6 +41,8 @@ public final class XMLMemento { private Element element; + private static String FILE_STRING = "file"; //$NON-NLS-1$ + /** * Creates a <code>Document</code> from the <code>Reader</code> * and returns a memento on the first <code>Element</code> for reading @@ -57,51 +60,89 @@ public final class XMLMemento { return createReadRoot(reader, null); } - /** - * Creates a <code>Document</code> from the <code>Reader</code> - * and returns a memento on the first <code>Element</code> for reading - * the document. - * - * @param reader the <code>Reader</code> used to create the memento's document - * @param baseDir the directory used to resolve relative file names - * in the XML document. This directory must exist and include the - * trailing separator. The directory format, including the separators, - * must be valid for the platform. Can be <code>null</code> if not - * needed. - * @return a memento on the first <code>Element</code> for reading the document - * @throws Exception if IO problems, invalid format, or no element. - */ + /** + * Clients who need to use the "file" protocol can override this method to + * return the original attribute value + * + * @param attributeOldValue + * @return return the new attribute value after concatenating the "file" + * protocol restriction if does not exist already + */ + private static String getAttributeNewValue(Object attributeOldValue) { + StringBuffer strNewValue = new StringBuffer(FILE_STRING); + if (attributeOldValue instanceof String && ((String) attributeOldValue).length() != 0) { + String strOldValue = (String) attributeOldValue; + boolean exists = Arrays.asList(strOldValue.split(",")).stream().anyMatch(x -> x.trim().equals(FILE_STRING)); //$NON-NLS-1$ + if (!exists) { + strNewValue.append(", ").append(strOldValue); //$NON-NLS-1$ + } else { + strNewValue = new StringBuffer(strOldValue); + } + } + return strNewValue.toString(); + } + + /** + * Creates a <code>Document</code> from the <code>Reader</code> and returns + * a memento on the first <code>Element</code> for reading the document. + * + * @param reader the <code>Reader</code> used to create the memento's + * document + * @param baseDir the directory used to resolve relative file names in the + * XML document. This directory must exist and include the + * trailing separator. The directory format, including the + * separators, must be valid for the platform. Can be + * <code>null</code> if not needed. + * @return a memento on the first <code>Element</code> for reading the + * document + * @throws Exception if IO problems, invalid format, or no element. + */ public static XMLMemento createReadRoot(Reader reader, String baseDir) throws Exception { - String errorMessage = null; - Exception exception = null; + String errorMessage = null; + Exception exception = null; + DocumentBuilderFactory factory = null; + Object attributeDTDOldValue = null; + Object attributeSchemaOldValue = null; + try { + factory = DocumentBuilderFactory.newInstance(); + try { + attributeDTDOldValue = factory.getAttribute(javax.xml.XMLConstants.ACCESS_EXTERNAL_DTD); + attributeSchemaOldValue = factory.getAttribute(javax.xml.XMLConstants.ACCESS_EXTERNAL_SCHEMA); + } catch (NullPointerException | IllegalArgumentException e) { + // Attributes not defined + } + factory.setAttribute(javax.xml.XMLConstants.ACCESS_EXTERNAL_DTD, getAttributeNewValue(attributeDTDOldValue)); + factory.setAttribute(javax.xml.XMLConstants.ACCESS_EXTERNAL_SCHEMA, getAttributeNewValue(attributeSchemaOldValue)); - try { - DocumentBuilderFactory factory = DocumentBuilderFactory - .newInstance(); - DocumentBuilder parser = factory.newDocumentBuilder(); - InputSource source = new InputSource(reader); - if (baseDir != null) { + DocumentBuilder parser = factory.newDocumentBuilder(); + InputSource source = new InputSource(reader); + if (baseDir != null) { source.setSystemId(baseDir); } - Document document = parser.parse(source); - NodeList list = document.getChildNodes(); - for (int i = 0; i < list.getLength(); i++) { - Node node = list.item(i); - if (node instanceof Element) { + Document document = parser.parse(source); + NodeList list = document.getChildNodes(); + for (int i = 0; i < list.getLength(); i++) { + Node node = list.item(i); + if (node instanceof Element) { return new XMLMemento(document, (Element) node); } - } - } catch (ParserConfigurationException e) { - exception = e; - // errorMessage = WorkbenchMessages.XMLMemento_parserConfigError; - } catch (IOException e) { - exception = e; - // errorMessage = WorkbenchMessages.XMLMemento_ioError; - } catch (SAXException e) { - exception = e; - // errorMessage = WorkbenchMessages.XMLMemento_formatError; - } + } + } catch (ParserConfigurationException e) { + exception = e; + // errorMessage = WorkbenchMessages.XMLMemento_parserConfigError; + } catch (IOException e) { + exception = e; + // errorMessage = WorkbenchMessages.XMLMemento_ioError; + } catch (SAXException e) { + exception = e; + // errorMessage = WorkbenchMessages.XMLMemento_formatError; + } finally { + if (factory != null) { + factory.setAttribute(javax.xml.XMLConstants.ACCESS_EXTERNAL_DTD, attributeDTDOldValue); + factory.setAttribute(javax.xml.XMLConstants.ACCESS_EXTERNAL_SCHEMA, attributeSchemaOldValue); + } + } String problemText = null; if (exception != null) { |