BUG-5917: validate TransformerFactory 12/39312/5
authorIgor Foltin <ifoltin@cisco.com>
Tue, 24 May 2016 11:51:22 +0000 (13:51 +0200)
committerRobert Varga <nite@hq.sk>
Tue, 24 May 2016 21:22:07 +0000 (21:22 +0000)
Karaf-3.0.6 ships with Xalan as the default javax.xml.transform implementation.
Unfortunately it does not support StAXResult as the target of transformation,
rendering the writer useless.

Add a fallback to JVM-internal implementation if we detect that the default
factory cannot support StAXResult

Change-Id: I7151b0df8068c85ca53a85edd4894ac1ba70eece
Signed-off-by: Robert Varga <rovarga@cisco.com>
Signed-off-by: Igor Foltin <ifoltin@cisco.com>
yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/XMLStreamNormalizedNodeStreamWriter.java

index 4c1e1cf1b1fb30e3d17428ba2723b33ec7176f23..d426f033578d158ccae0a1dd25ca185b2a8d0068 100644 (file)
@@ -34,6 +34,8 @@ import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStre
 import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.w3c.dom.Element;
 
 /**
@@ -44,9 +46,23 @@ import org.w3c.dom.Element;
  * where doesn't have a SchemaContext available and isn't meant for production use.
  */
 public abstract class XMLStreamNormalizedNodeStreamWriter<T> implements NormalizedNodeStreamAttributeWriter {
+    private static final Logger LOG = LoggerFactory.getLogger(XMLStreamNormalizedNodeStreamWriter.class);
+    private static final String COM_SUN_TRANSFORMER = "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl";
+
+    private static final TransformerFactory TRANSFORMER_FACTORY;
+    static {
+        TransformerFactory f = TransformerFactory.newInstance();
+        if (!f.getFeature(StAXResult.FEATURE)) {
+            LOG.warn("Platform-default TransformerFactory {} does not support StAXResult, attempting fallback to {}",
+                     f, COM_SUN_TRANSFORMER);
+            f = TransformerFactory.newInstance(COM_SUN_TRANSFORMER, null);
+            if (!f.getFeature(StAXResult.FEATURE)) {
+                throw new TransformerFactoryConfigurationError("No TransformerFactory supporting StAXResult found.");
+            }
+        }
 
-    private static final TransformerFactory TRANSFORMER_FACTORY =
-            TransformerFactory.newInstance("com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl", null);
+        TRANSFORMER_FACTORY = f;
+    }
 
     private final XMLStreamWriter writer;
     private final RandomPrefix randomPrefix;