IVY-1647 better check whether properties/features can be set
diff --git a/asciidoc/release-notes.adoc b/asciidoc/release-notes.adoc
index 7de155a..782e75d 100644
--- a/asciidoc/release-notes.adoc
+++ b/asciidoc/release-notes.adoc
@@ -19,7 +19,7 @@
= Ivy Release Announcement
-XXXX Date XXXX - The Apache Ivy project is pleased to announce its 2.6.0 release.
+XXXX Date XXXX - The Apache Ivy project is pleased to announce its 2.5.3 release.
== What is Ivy?
Apache Ivy is a tool for managing (recording, tracking, resolving and reporting) project dependencies, characterized by flexibility,
@@ -34,7 +34,7 @@
== Key features in this release
-Key features of this 2.6.0 release are:
+Key features of this 2.5.3 release are:
== List of Changes in this Release
@@ -42,6 +42,8 @@
*List of changes since Ivy 2.5.2:*
+- FIX: trying to set safe XML features causes SAXExceptions when used with certain XML parsers (jira:IVY-1647[])
+
////
Samples :
- NEW: bla bla bla (jira:IVY-1234[]) (Thanks to Jane Doe)
diff --git a/src/java/org/apache/ivy/util/XMLHelper.java b/src/java/org/apache/ivy/util/XMLHelper.java
index e5bfa7b..9fc740a 100644
--- a/src/java/org/apache/ivy/util/XMLHelper.java
+++ b/src/java/org/apache/ivy/util/XMLHelper.java
@@ -88,9 +88,11 @@
}
}
final XMLReader reader = parser.getXMLReader();
- reader.setFeature(XML_NAMESPACE_PREFIXES, true);
- reader.setProperty(XML_ACCESS_EXTERNAL_SCHEMA, externalResources.getAllowedProtocols());
- reader.setProperty(XML_ACCESS_EXTERNAL_DTD, externalResources.getAllowedProtocols());
+ trySetFeature(reader, XML_NAMESPACE_PREFIXES, true);
+ trySetProperty(reader, XML_ACCESS_EXTERNAL_SCHEMA,
+ externalResources.getAllowedProtocols());
+ trySetProperty(reader, XML_ACCESS_EXTERNAL_DTD,
+ externalResources.getAllowedProtocols());
return parser;
}
@@ -425,6 +427,15 @@
}
}
+ private static boolean isFeatureSupported(final XMLReader reader, final String feature) {
+ try {
+ reader.getFeature(feature);
+ return true;
+ } catch (SAXException e) {
+ return false;
+ }
+ }
+
private static boolean isAttributeSupported(final TransformerFactory factory, final String attribute) {
try {
factory.getAttribute(attribute);
@@ -434,6 +445,15 @@
}
}
+ private static boolean isPropertySupported(final XMLReader reader, final String property) {
+ try {
+ reader.getProperty(property);
+ return true;
+ } catch (SAXException e) {
+ return false;
+ }
+ }
+
private static boolean trySetFeature(final DocumentBuilderFactory factory,
final String feature, final boolean val) {
if (!isFeatureSupported(factory, feature)) {
@@ -472,6 +492,21 @@
}
}
+ private static boolean trySetFeature(final XMLReader reader,
+ final String feature, final boolean val) {
+ if (!isFeatureSupported(reader, feature)) {
+ return false;
+ }
+ try {
+ reader.setFeature(feature, val);
+ return true;
+ } catch (SAXException e) {
+ // log and continue
+ Message.warn("Failed to set feature " + feature + " on XMLReader", e);
+ return false;
+ }
+ }
+
private static boolean trySetAttribute(final TransformerFactory factory,
final String attribute, final String val) {
if (!isAttributeSupported(factory, attribute)) {
@@ -487,6 +522,21 @@
}
}
+ private static boolean trySetProperty(final XMLReader reader,
+ final String property, final Object val) {
+ if (!isPropertySupported(reader, property)) {
+ return false;
+ }
+ try {
+ reader.setProperty(property, val);
+ return true;
+ } catch (SAXException e) {
+ // log and continue
+ Message.warn("Failed to set property " + property + " on XMLReader", e);
+ return false;
+ }
+ }
+
private static final InputSource EMPTY_INPUT_SOURCE = new InputSource(new StringReader(""));
private static class NoopEntityResolver implements EntityResolver {
diff --git a/version.properties b/version.properties
index 57a0493..e1f7821 100644
--- a/version.properties
+++ b/version.properties
@@ -16,9 +16,9 @@
# * specific language governing permissions and limitations
# * under the License.
# ***************************************************************
-target.ivy.version=2.6.0
+target.ivy.version=2.5.3
# Following OSGi spec: have to be 3 numbers separated by dots
-target.ivy.bundle.version=2.6.0
+target.ivy.bundle.version=2.5.3
# in case we want to add a qualifier such as alpha, beta, etc...
# if non empty, add a '_' at the end of the qualifier, so the version would look like 1.2.3.alpha_200901011200
# NB: be careful with naming, OSGi orders version alphabetically. Suggested values: alpha_, beta_, cr1_ (for RC-1), final_