diff --git a/src/tests/junit/org/apache/tools/ant/taskdefs/optional/TraXLiaisonTest.java b/src/tests/junit/org/apache/tools/ant/taskdefs/optional/TraXLiaisonTest.java
index 1444141..52605b4 100644
--- a/src/tests/junit/org/apache/tools/ant/taskdefs/optional/TraXLiaisonTest.java
+++ b/src/tests/junit/org/apache/tools/ant/taskdefs/optional/TraXLiaisonTest.java
@@ -1,129 +1,129 @@
-package org.apache.tools.ant.taskdefs.optional;
-
-import static org.junit.Assert.assertTrue;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.InputStream;
-import java.security.Permission;
-
-import junit.framework.AssertionFailedError;
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.taskdefs.XSLTLiaison;
-import org.apache.tools.ant.taskdefs.XSLTLogger;
-import org.apache.tools.ant.util.JAXPUtils;
-import org.junit.After;
-import org.junit.Assume;
-import org.junit.Test;
-
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- *
- */
-
-/**
- * TraX XSLTLiaison testcase
- */
-public class TraXLiaisonTest extends AbstractXSLTLiaisonTest
-    implements XSLTLogger {
-
-
-	@After
-    public void tearDown() {
-        File f = new File("xalan2-redirect-out.tmp");
-        if (f.exists()) {
-            f.delete();
-        }
-    }
-
-    public XSLTLiaison createLiaison() throws Exception {
-        TraXLiaison l = new TraXLiaison();
-        l.setLogger(this);
-        return l;
-    }
-
-    @Test
-    public void testXalan2Redirect() throws Exception {
-    	try {
-    		getClass().getClassLoader().loadClass("org.apache.xalan.lib.Redirect");
-    	} catch (Exception exc) {
-    		Assume.assumeNoException("xalan redirect is not on the classpath", exc);
-    	}
-        File xsl = getFile("/taskdefs/optional/xalan-redirect-in.xsl");
-        liaison.setStylesheet(xsl);
-        File out = new File("xalan2-redirect-out-dummy.tmp");
-        File in = getFile("/taskdefs/optional/xsltliaison-in.xsl");
-        ClassLoader orig = Thread.currentThread().getContextClassLoader();
-        try {
-            liaison.addParam("xalan-version", "2");
-            // Use the JRE's Xerces, not lib/optional/xerces.jar:
-            Thread.currentThread().setContextClassLoader(new ClassLoader(ClassLoader.getSystemClassLoader().getParent()) {
-                public InputStream getResourceAsStream(String name) {
-                    if (name.startsWith("META-INF/services/")) {
-                        // work around JAXP #6723276 in JDK 6
-                        return new ByteArrayInputStream(new byte[0]);
-                    }
-                    return super.getResourceAsStream(name);
-                }
-            });
-            // Tickle #52382:
-            System.setSecurityManager(new SecurityManager() {public void checkPermission(Permission perm) {}});
-            liaison.transform(in, out);
-        } finally {
-            out.delete();
-            Thread.currentThread().setContextClassLoader(orig);
-            System.setSecurityManager(null);
-        }
-    }
-
-    @Test
-    public void testMultipleTransform() throws Exception {
-        File xsl = getFile("/taskdefs/optional/xsltliaison-in.xsl");
-        liaison.setStylesheet(xsl);
-        liaison.addParam("param", "value");
-        File in = getFile("/taskdefs/optional/xsltliaison-in.xml");
-        // test for 10 consecutives transform
-        for (int i = 0; i < 50; i++){
-            File out = new File("xsltliaison" + i + ".tmp");
-            try {
-                liaison.transform(in, out);
-            } catch (Exception e){
-                throw new BuildException("failed in transform " + i, e);
-            } finally {
-                out.delete();
-            }
-        }
-    }
-
-    @Test
-    public void testSystemId(){
-        File file = null;
-        if ( File.separatorChar == '\\' ){
-            file = new File("d:\\jdk");
-        } else {
-            file = new File("/user/local/bin");
-        }
-        String systemid = JAXPUtils.getSystemId(file);
-        assertTrue("SystemIDs should start by file:/", systemid.startsWith("file:/"));
-        assertTrue("SystemIDs should not start with file:////", !systemid.startsWith("file:////"));
-    }
-
-    public void log(String message) {
-        throw new AssertionFailedError("Liaison sent message: "+message);
-    }
-
-}
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+package org.apache.tools.ant.taskdefs.optional;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.InputStream;
+import java.security.Permission;
+
+import junit.framework.AssertionFailedError;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.XSLTLiaison;
+import org.apache.tools.ant.taskdefs.XSLTLogger;
+import org.apache.tools.ant.util.JAXPUtils;
+import org.junit.After;
+import org.junit.Assume;
+import org.junit.Test;
+
+/**
+ * TraX XSLTLiaison testcase
+ */
+public class TraXLiaisonTest extends AbstractXSLTLiaisonTest
+    implements XSLTLogger {
+
+
+    @After
+    public void tearDown() {
+        File f = new File("xalan2-redirect-out.tmp");
+        if (f.exists()) {
+            f.delete();
+        }
+    }
+
+    public XSLTLiaison createLiaison() throws Exception {
+        TraXLiaison l = new TraXLiaison();
+        l.setLogger(this);
+        return l;
+    }
+
+    @Test
+    public void testXalan2Redirect() throws Exception {
+        try {
+            getClass().getClassLoader().loadClass("org.apache.xalan.lib.Redirect");
+        } catch (Exception exc) {
+            Assume.assumeNoException("xalan redirect is not on the classpath", exc);
+        }
+        File xsl = getFile("/taskdefs/optional/xalan-redirect-in.xsl");
+        liaison.setStylesheet(xsl);
+        File out = new File("xalan2-redirect-out-dummy.tmp");
+        File in = getFile("/taskdefs/optional/xsltliaison-in.xsl");
+        ClassLoader orig = Thread.currentThread().getContextClassLoader();
+        try {
+            liaison.addParam("xalan-version", "2");
+            // Use the JRE's Xerces, not lib/optional/xerces.jar:
+            Thread.currentThread().setContextClassLoader(new ClassLoader(ClassLoader.getSystemClassLoader().getParent()) {
+                public InputStream getResourceAsStream(String name) {
+                    if (name.startsWith("META-INF/services/")) {
+                        // work around JAXP #6723276 in JDK 6
+                        return new ByteArrayInputStream(new byte[0]);
+                    }
+                    return super.getResourceAsStream(name);
+                }
+            });
+            // Tickle #52382:
+            System.setSecurityManager(new SecurityManager() {public void checkPermission(Permission perm) {}});
+            liaison.transform(in, out);
+        } finally {
+            out.delete();
+            Thread.currentThread().setContextClassLoader(orig);
+            System.setSecurityManager(null);
+        }
+    }
+
+    @Test
+    public void testMultipleTransform() throws Exception {
+        File xsl = getFile("/taskdefs/optional/xsltliaison-in.xsl");
+        liaison.setStylesheet(xsl);
+        liaison.addParam("param", "value");
+        File in = getFile("/taskdefs/optional/xsltliaison-in.xml");
+        // test for 10 consecutives transform
+        for (int i = 0; i < 50; i++){
+            File out = new File("xsltliaison" + i + ".tmp");
+            try {
+                liaison.transform(in, out);
+            } catch (Exception e){
+                throw new BuildException("failed in transform " + i, e);
+            } finally {
+                out.delete();
+            }
+        }
+    }
+
+    @Test
+    public void testSystemId(){
+        File file = null;
+        if ( File.separatorChar == '\\' ){
+            file = new File("d:\\jdk");
+        } else {
+            file = new File("/user/local/bin");
+        }
+        String systemid = JAXPUtils.getSystemId(file);
+        assertTrue("SystemIDs should start by file:/", systemid.startsWith("file:/"));
+        assertTrue("SystemIDs should not start with file:////", !systemid.startsWith("file:////"));
+    }
+
+    public void log(String message) {
+        throw new AssertionFailedError("Liaison sent message: "+message);
+    }
+
+}
