| @@ -83,6 +83,9 @@ Other changes: | |||
| nativeheaderdir attribute. | |||
| Bugzilla Report 59905 | |||
| * it is now possible to set features of the TraX factory used by <xslt> | |||
| and <junitreport>. | |||
| Changes from Ant 1.9.6 TO Ant 1.9.7 | |||
| =================================== | |||
| @@ -395,7 +395,7 @@ Used to specify factory settings. | |||
| </tr> | |||
| </table> | |||
| <h3>Parameters specified as nested elements</h3> | |||
| <h4>attribute </h4> | |||
| <h4>attribute</h4> | |||
| <p>Used to specify settings of the processor factory. | |||
| The attribute names and values are entirely processor specific | |||
| so you must be aware of the implementation to figure them out. | |||
| @@ -435,6 +435,35 @@ And in Saxon 7.x: | |||
| </tr> | |||
| </table> | |||
| </blockquote> | |||
| <h4>feature</h4> | |||
| <p><em>since Ant 1.9.8</em></p> | |||
| <p>Used to specify settings of the processor factory. The feature | |||
| names are mostly processor specific so you must be aware of the | |||
| implementation to figure them out. Read the documentation of your | |||
| processor. The only feature all implementations are required to | |||
| support | |||
| is <code>http://javax.xml.XMLConstants/feature/secure-processing</code>. | |||
| <blockquote> | |||
| <h4>Parameters</h4> | |||
| <table width="60%" border="1" cellpadding="2" cellspacing="0"> | |||
| <tr> | |||
| <td valign="top"><b>Attribute</b></td> | |||
| <td valign="top"><b>Description</b></td> | |||
| <td align="center" valign="top"><b>Required</b></td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">name</td> | |||
| <td valign="top">Name of the feature</td> | |||
| <td align="center" valign="top">Yes</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">value</td> | |||
| <td valign="top">value of the feature. A boolean value | |||
| (i.e. permitted values are true,false,yes,no,on,off).</td> | |||
| <td align="center" valign="top">No, defaults to false</td> | |||
| </tr> | |||
| </table> | |||
| </blockquote> | |||
| </blockquote> | |||
| <h4>mapper</h4> | |||
| @@ -1462,7 +1462,12 @@ public class XSLTProcess extends MatchingTask implements XSLTLogger { | |||
| /** | |||
| * the list of factory attributes to use for TraXLiaison | |||
| */ | |||
| private final Vector attributes = new Vector(); | |||
| private final List<Attribute> attributes = new ArrayList<Attribute>(); | |||
| /** | |||
| * the list of factory features to use for TraXLiaison | |||
| */ | |||
| private final List<Feature> features = new ArrayList<Feature>(); | |||
| /** | |||
| * @return the name of the factory. | |||
| @@ -1484,7 +1489,7 @@ public class XSLTProcess extends MatchingTask implements XSLTLogger { | |||
| * @param attr the newly created factory attribute | |||
| */ | |||
| public void addAttribute(final Attribute attr) { | |||
| attributes.addElement(attr); | |||
| attributes.add(attr); | |||
| } | |||
| /** | |||
| @@ -1492,7 +1497,24 @@ public class XSLTProcess extends MatchingTask implements XSLTLogger { | |||
| * @return the enumeration of attributes | |||
| */ | |||
| public Enumeration getAttributes() { | |||
| return attributes.elements(); | |||
| return Collections.enumeration(attributes); | |||
| } | |||
| /** | |||
| * Create an instance of a factory feature. | |||
| * @param feature the newly created feature | |||
| * @since Ant 1.9.8 | |||
| */ | |||
| public void addFeature(final Feature feature) { | |||
| features.add(feature); | |||
| } | |||
| /** | |||
| * The configured features. | |||
| * @since Ant 1.9.8 | |||
| */ | |||
| public Iterable<Feature> getFeatures() { | |||
| return features; | |||
| } | |||
| /** | |||
| @@ -1519,7 +1541,7 @@ public class XSLTProcess extends MatchingTask implements XSLTLogger { | |||
| } | |||
| /** | |||
| * @return the output property value. | |||
| * @return the attribute value. | |||
| */ | |||
| public Object getValue() { | |||
| return value; | |||
| @@ -1565,6 +1587,49 @@ public class XSLTProcess extends MatchingTask implements XSLTLogger { | |||
| } | |||
| } | |||
| } // -- class Attribute | |||
| /** | |||
| * A feature for the TraX factory. | |||
| * @since Ant 1.9.8 | |||
| */ | |||
| public static class Feature { | |||
| private String name; | |||
| private boolean value; | |||
| public Feature() { } | |||
| public Feature(String name, boolean value) { | |||
| this.name = name; | |||
| this.value = value; | |||
| } | |||
| /** | |||
| * @param name the feature name. | |||
| */ | |||
| public void setName(String name) { | |||
| this.name = name; | |||
| } | |||
| /** | |||
| * @param value the feature value. | |||
| */ | |||
| public void setValue(boolean value) { | |||
| this.value = value; | |||
| } | |||
| /** | |||
| * @return the feature name. | |||
| */ | |||
| public String getName() { | |||
| return name; | |||
| } | |||
| /** | |||
| * @return the feature value. | |||
| */ | |||
| public boolean getValue() { | |||
| return value; | |||
| } | |||
| } | |||
| } // -- class Factory | |||
| /** | |||
| @@ -28,8 +28,12 @@ import java.io.InputStream; | |||
| import java.io.OutputStream; | |||
| import java.lang.reflect.Field; | |||
| import java.net.URL; | |||
| import java.util.ArrayList; | |||
| import java.util.Enumeration; | |||
| import java.util.HashMap; | |||
| import java.util.Hashtable; | |||
| import java.util.List; | |||
| import java.util.Map; | |||
| import java.util.Vector; | |||
| import javax.xml.parsers.ParserConfigurationException; | |||
| @@ -123,7 +127,10 @@ public class TraXLiaison implements XSLTLiaison4, ErrorListener, XSLTLoggerAware | |||
| private final Hashtable<String, Object> params = new Hashtable<String, Object>(); | |||
| /** factory attributes */ | |||
| private final Vector attributes = new Vector(); | |||
| private final List<Object[]> attributes = new ArrayList<Object[]>(); | |||
| /** factory features */ | |||
| private final Map<String, Boolean> features = new HashMap<String, Boolean>(); | |||
| /** whether to suppress warnings */ | |||
| private boolean suppressWarnings = false; | |||
| @@ -436,10 +443,18 @@ public class TraXLiaison implements XSLTLiaison4, ErrorListener, XSLTLoggerAware | |||
| // specific attributes for the transformer | |||
| final int size = attributes.size(); | |||
| for (int i = 0; i < size; i++) { | |||
| final Object[] pair = (Object[]) attributes.elementAt(i); | |||
| final Object[] pair = attributes.get(i); | |||
| tfactory.setAttribute((String) pair[0], pair[1]); | |||
| } | |||
| for (Map.Entry<String, Boolean> feature : features.entrySet()) { | |||
| try { | |||
| tfactory.setFeature(feature.getKey(), feature.getValue()); | |||
| } catch (TransformerConfigurationException ex) { | |||
| throw new BuildException(ex); | |||
| } | |||
| } | |||
| if (uriResolver != null) { | |||
| tfactory.setURIResolver(uriResolver); | |||
| } | |||
| @@ -466,7 +481,17 @@ public class TraXLiaison implements XSLTLiaison4, ErrorListener, XSLTLoggerAware | |||
| */ | |||
| public void setAttribute(final String name, final Object value) { | |||
| final Object[] pair = new Object[]{name, value}; | |||
| attributes.addElement(pair); | |||
| attributes.add(pair); | |||
| } | |||
| /** | |||
| * Set a custom feature for the JAXP factory implementation. | |||
| * @param name the feature name. | |||
| * @param value the value of the feature | |||
| * @since Ant 1.9.8 | |||
| */ | |||
| public void setFeature(final String name, final boolean value) { | |||
| features.put(name, value); | |||
| } | |||
| /** | |||
| @@ -625,6 +650,10 @@ public class TraXLiaison implements XSLTLiaison4, ErrorListener, XSLTLoggerAware | |||
| (XSLTProcess.Factory.Attribute) attrs.nextElement(); | |||
| setAttribute(attr.getName(), attr.getValue()); | |||
| } | |||
| for (final XSLTProcess.Factory.Feature feature | |||
| : factory.getFeatures()) { | |||
| setFeature(feature.getName(), feature.getValue()); | |||
| } | |||
| } | |||
| final XMLCatalog xmlCatalog = xsltTask.getXMLCatalog(); | |||