[405223] Processing and file name/type doesn't match output type from
XSL
diff --git a/bundles/org.eclipse.wst.xsl.debug.ui/src/org/eclipse/wst/xsl/internal/debug/ui/XSLLaunchShortcut.java b/bundles/org.eclipse.wst.xsl.debug.ui/src/org/eclipse/wst/xsl/internal/debug/ui/XSLLaunchShortcut.java
index a852d7a..cebf156 100644
--- a/bundles/org.eclipse.wst.xsl.debug.ui/src/org/eclipse/wst/xsl/internal/debug/ui/XSLLaunchShortcut.java
+++ b/bundles/org.eclipse.wst.xsl.debug.ui/src/org/eclipse/wst/xsl/internal/debug/ui/XSLLaunchShortcut.java
@@ -11,11 +11,12 @@
*******************************************************************************/
package org.eclipse.wst.xsl.internal.debug.ui;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -393,10 +394,11 @@
ILaunchConfiguration config = null;
try {
ILaunchConfigurationType configType = getConfigurationType();
+ String lastSegment = xmlFile != null ? xmlFile.getName() : xmlFilePath != null ? xmlFilePath.lastSegment() : "XSLTransformation"; //$NON-NLS-1$
ILaunchConfigurationWorkingCopy wc = configType.newInstance(null,
getLaunchManager()
.generateUniqueLaunchConfigurationNameFrom(
- xmlFilePath.lastSegment()));
+ lastSegment));
if (xmlFile != null)
wc
.setAttribute(
@@ -424,6 +426,16 @@
pipeline.addTransformDef(new LaunchTransform(xslFilePath,
LaunchTransform.EXTERNAL_TYPE));
}
+ if (! pipeline.getTransformDefs().isEmpty()) {
+ LaunchTransform lastDef = pipeline.getTransformDefs().get(pipeline.getTransformDefs().size()-1);
+ String outputFormat = guessOutputMethod(lastDef);
+ if (outputFormat != null) {
+ wc
+ .setAttribute(
+ XSLLaunchConfigurationConstants.ATTR_DEFAULT_OUTPUT_METHOD,
+ outputFormat);
+ }
+ }
wc.setAttribute(XSLLaunchConfigurationConstants.ATTR_PIPELINE,
pipeline.toXML());
if (xmlFile != null)
@@ -436,6 +448,25 @@
return config;
}
+ private String guessOutputMethod(LaunchTransform lastDef) {
+ try {
+ XslOutputMethodSniffer xofs = new XslOutputMethodSniffer();
+ xofs.parseContents(new InputSource(new FileInputStream(lastDef.getLocation().toFile())));
+ return xofs.getOutputMethod();
+ } catch (FileNotFoundException e) {
+ // It's OK
+ } catch (IOException e) {
+ // It's OK
+ } catch (ParserConfigurationException e) {
+ // It's OK
+ } catch (SAXException e) {
+ // It's OK
+ } catch (CoreException e) {
+ // It really is OK!
+ }
+ return null;
+ }
+
protected Shell getShell() {
return XSLDebugUIPlugin.getActiveWorkbenchShell();
}
diff --git a/bundles/org.eclipse.wst.xsl.debug.ui/src/org/eclipse/wst/xsl/internal/debug/ui/XslOutputMethodSniffer.java b/bundles/org.eclipse.wst.xsl.debug.ui/src/org/eclipse/wst/xsl/internal/debug/ui/XslOutputMethodSniffer.java
new file mode 100644
index 0000000..4fd4908
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsl.debug.ui/src/org/eclipse/wst/xsl/internal/debug/ui/XslOutputMethodSniffer.java
@@ -0,0 +1,160 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Jesper Steen Moller 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Jesper Steen Moller - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.xsl.internal.debug.ui;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXNotRecognizedException;
+import org.xml.sax.SAXNotSupportedException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * @since 3.5
+ */
+public final class XslOutputMethodSniffer extends DefaultHandler {
+ private static final String XSL_NAMESPACE = "http://www.w3.org/1999/XSL/Transform"; //$NON-NLS-1$
+ private static final String OUTPUT_ELEMENT_NAME = "output"; //$NON-NLS-1$
+ private static final String METHOD_ATTR_NAME = "method"; //$NON-NLS-1$
+
+ /**
+ * An exception indicating that the parsing should stop. This is usually
+ * triggered when the top-level element has been found.
+ */
+ private class StopParsingException extends SAXException {
+ /**
+ * All serializable objects should have a stable serialVersionUID
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Constructs an instance of <code>StopParsingException</code> with a
+ * <code>null</code> detail message.
+ */
+ public StopParsingException() {
+ super((String) null);
+ }
+ }
+
+ private String outputMethod = null;
+
+ public String getOutputMethod() {
+ return this.outputMethod;
+ }
+
+ /**
+ * Creates a new SAX parser for use within this instance.
+ *
+ * @return The newly created parser.
+ *
+ * @throws ParserConfigurationException
+ * If a parser of the given configuration cannot be created.
+ * @throws SAXException
+ * If something in general goes wrong when creating the parser.
+ * @throws SAXNotRecognizedException
+ * If the <code>XMLReader</code> does not recognize the
+ * lexical handler configuration option.
+ * @throws SAXNotSupportedException
+ * If the <code>XMLReader</code> does not support the lexical
+ * handler configuration option.
+ */
+ private final SAXParser createParser(SAXParserFactory parserFactory) throws ParserConfigurationException, SAXException, SAXNotRecognizedException, SAXNotSupportedException {
+ // Initialize the parser.
+ final SAXParser parser = parserFactory.newSAXParser();
+ final XMLReader reader = parser.getXMLReader();
+ try {
+ // be sure validation is "off" or the feature to ignore DTD's will not apply
+ reader.setFeature("http://xml.org/sax/features/validation", false); //$NON-NLS-1$
+ reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); //$NON-NLS-1$
+ } catch (SAXNotRecognizedException e) {
+ // not a big deal if the parser does not recognize the features
+ } catch (SAXNotSupportedException e) {
+ // not a big deal if the parser does not support the features
+ }
+ return parser;
+ }
+
+ public boolean parseContents(InputSource contents) throws IOException, ParserConfigurationException, SAXException {
+ // Parse the file into we have what we need (or an error occurs).
+
+ try {
+ SAXParserFactory parserFactory = SAXParserFactory.newInstance();
+ parserFactory.setValidating(false);
+ parserFactory.setNamespaceAware(true);
+ final SAXParser parser = createParser(parserFactory);
+ // to support external entities specified as relative URIs (see bug 63298)
+ contents.setSystemId("/"); //$NON-NLS-1$
+ parser.parse(contents, this);
+ } catch (StopParsingException e) {
+ // Abort the parsing normally. Fall through...
+ }
+ return true;
+ }
+
+ /*
+ * Resolve external entity definitions to an empty string. This is to speed
+ * up processing of files with external DTDs. Not resolving the contents
+ * of the DTD is ok, as only the System ID of the DTD declaration is used.
+ * @see org.xml.sax.helpers.DefaultHandler#resolveEntity(java.lang.String, java.lang.String)
+ */
+ public InputSource resolveEntity(String publicId, String systemId) throws SAXException {
+ return new InputSource(new StringReader("")); //$NON-NLS-1$
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.xml.sax.ContentHandler#startElement(java.lang.String,
+ * java.lang.String, java.lang.String, org.xml.sax.Attributes)
+ */
+ public final void startElement(final String uri, final String elementName, final String qualifiedName, final Attributes attributes) throws SAXException {
+ if (XSL_NAMESPACE.equals(uri) && OUTPUT_ELEMENT_NAME.equals(elementName)) {
+ this.outputMethod = attributes.getValue(METHOD_ATTR_NAME);
+ throw new StopParsingException();
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.xml.sax.ext.LexicalHandler#startEntity(java.lang.String)
+ */
+ public final void startEntity(final String name) {
+ // Not interested.
+ }
+
+ @Override
+ public void processingInstruction(String target, String data)
+ throws SAXException {
+ }
+
+// public static void main(String[] args) throws IOException, ParserConfigurationException, SAXException {
+// String xml = "<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'><xsl:output method='fish'/><xsl:template name='nameib1'></xsl:template></xsl:stylesheet>"; //$NON-NLS-1$
+// XslOutputFormatSniffer sniffer = new XslOutputFormatSniffer();
+// sniffer.parseContents(new InputSource(new StringReader(xml)));
+// System.out.println(sniffer.getOutputMethod());
+// }
+}
diff --git a/bundles/org.eclipse.wst.xsl.debug.ui/src/org/eclipse/wst/xsl/internal/debug/ui/tabs/main/XSLMainTab.java b/bundles/org.eclipse.wst.xsl.debug.ui/src/org/eclipse/wst/xsl/internal/debug/ui/tabs/main/XSLMainTab.java
index a9db14f..98d5096 100644
--- a/bundles/org.eclipse.wst.xsl.debug.ui/src/org/eclipse/wst/xsl/internal/debug/ui/tabs/main/XSLMainTab.java
+++ b/bundles/org.eclipse.wst.xsl.debug.ui/src/org/eclipse/wst/xsl/internal/debug/ui/tabs/main/XSLMainTab.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007,2008 Chase Technology Ltd - http://www.chasetechnology.co.uk and others
+ * Copyright (c) 2007,2013 Chase Technology Ltd - http://www.chasetechnology.co.uk 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
@@ -8,6 +8,7 @@
* Contributors:
* Doug Satchwell (Chase Technology Ltd) - initial API and implementation
* David Carver - STAR - bug 223557 - Added Images contributed by Holger Voorman
+ * Jesper S Moller - 405223 - Processing and file name/type doesn't match output type from XSL
*******************************************************************************/
package org.eclipse.wst.xsl.internal.debug.ui.tabs.main;
@@ -124,6 +125,14 @@
configuration.setAttribute(
XSLLaunchConfigurationConstants.ATTR_PIPELINE, pipeline
.toXML());
+
+ String method = pipeline.getOutputProperties().getProperty("method", null); //$NON-NLS-1$
+
+ if (method != null) {
+ configuration.setAttribute(
+ XSLLaunchConfigurationConstants.ATTR_DEFAULT_OUTPUT_METHOD,
+ method);
+ }
} catch (CoreException e) {
XSLDebugUIPlugin.log(e);
}
diff --git a/bundles/org.eclipse.wst.xsl.debug.ui/src/org/eclipse/wst/xsl/internal/debug/ui/tabs/output/OutputFileBlock.java b/bundles/org.eclipse.wst.xsl.debug.ui/src/org/eclipse/wst/xsl/internal/debug/ui/tabs/output/OutputFileBlock.java
index ff99b65..ee31db8 100644
--- a/bundles/org.eclipse.wst.xsl.debug.ui/src/org/eclipse/wst/xsl/internal/debug/ui/tabs/output/OutputFileBlock.java
+++ b/bundles/org.eclipse.wst.xsl.debug.ui/src/org/eclipse/wst/xsl/internal/debug/ui/tabs/output/OutputFileBlock.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007 Chase Technology Ltd - http://www.chasetechnology.co.uk
+ * Copyright (c) 2007, 2013 Chase Technology Ltd - http://www.chasetechnology.co.uk
* 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
@@ -7,6 +7,7 @@
*
* Contributors:
* Doug Satchwell (Chase Technology Ltd) - initial API and implementation
+ * Jesper S Moller - 405223 - Processing and file name/type doesn't match output type from XSL
*******************************************************************************/
package org.eclipse.wst.xsl.internal.debug.ui.tabs.output;
@@ -39,6 +40,7 @@
private String inputFilename;
private Text fileNameText;
private String defaultOutputFileName;
+ private String defaultOutputFileMethod;
private String outputFileName;
public OutputFileBlock() {
@@ -196,6 +198,10 @@
public void initializeFrom(ILaunchConfiguration configuration) {
try {
+ defaultOutputFileMethod = configuration.getAttribute(
+ XSLLaunchConfigurationConstants.ATTR_DEFAULT_OUTPUT_METHOD,
+ "xml"); //$NON-NLS-1$
+
inputFilename = configuration.getAttribute(
XSLLaunchConfigurationConstants.ATTR_INPUT_FILE, ""); //$NON-NLS-1$
updateDefaultOutputFile();
@@ -284,7 +290,7 @@
private void updateDefaultOutputFile() {
try {
IPath path = XSLTRuntime
- .defaultOutputFileForInputFile(inputFilename);
+ .defaultOutputFileForInputFile(inputFilename, defaultOutputFileMethod);
// determine whether this path exists in the workspace
IFile[] files = ResourcesPlugin.getWorkspace().getRoot()
.findFilesForLocation(path);
diff --git a/bundles/org.eclipse.wst.xsl.launching/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.xsl.launching/META-INF/MANIFEST.MF
index 6e18cea..82c18ea 100644
--- a/bundles/org.eclipse.wst.xsl.launching/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.wst.xsl.launching/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name.0
Bundle-SymbolicName: org.eclipse.wst.xsl.launching;singleton:=true
-Bundle-Version: 1.0.200.qualifier
+Bundle-Version: 1.1.0.qualifier
Bundle-Activator: org.eclipse.wst.xsl.internal.launching.LaunchingPlugin
Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)",
org.eclipse.core.expressions;bundle-version="[3.4.0,4.0.0)",
diff --git a/bundles/org.eclipse.wst.xsl.launching/src/org/eclipse/wst/xsl/launching/XSLLaunchConfigurationConstants.java b/bundles/org.eclipse.wst.xsl.launching/src/org/eclipse/wst/xsl/launching/XSLLaunchConfigurationConstants.java
index 1c226a4..8cc3beb 100644
--- a/bundles/org.eclipse.wst.xsl.launching/src/org/eclipse/wst/xsl/launching/XSLLaunchConfigurationConstants.java
+++ b/bundles/org.eclipse.wst.xsl.launching/src/org/eclipse/wst/xsl/launching/XSLLaunchConfigurationConstants.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007 Chase Technology Ltd - http://www.chasetechnology.co.uk
+ * Copyright (c) 2007, 2013 Chase Technology Ltd - http://www.chasetechnology.co.uk
* 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
@@ -7,6 +7,7 @@
*
* Contributors:
* Doug Satchwell (Chase Technology Ltd) - initial API and implementation
+ * Jesper S Moller - 405223 - Processing and file name/type doesn't match output type from XSL
*******************************************************************************/
package org.eclipse.wst.xsl.launching;
@@ -38,4 +39,11 @@
* @since 1.0
*/
public static final String ATTR_WORKING_DIR = LaunchingPlugin.PLUGIN_ID + ".ATTR_WORKING_DIR"; //$NON-NLS-1$;
+
+ /**
+ * @since 1.1
+ */
+ public static final String ATTR_DEFAULT_OUTPUT_METHOD = LaunchingPlugin.PLUGIN_ID + ".ATTR_DEFAULT_OUTPUT_METHOD"; //$NON-NLS-1$;
+
+
}
diff --git a/bundles/org.eclipse.wst.xsl.launching/src/org/eclipse/wst/xsl/launching/XSLTRuntime.java b/bundles/org.eclipse.wst.xsl.launching/src/org/eclipse/wst/xsl/launching/XSLTRuntime.java
index 1164cbd..92bf426 100644
--- a/bundles/org.eclipse.wst.xsl.launching/src/org/eclipse/wst/xsl/launching/XSLTRuntime.java
+++ b/bundles/org.eclipse.wst.xsl.launching/src/org/eclipse/wst/xsl/launching/XSLTRuntime.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2010 Chase Technology Ltd - http://www.chasetechnology.co.uk
+ * Copyright (c) 2007, 2013 Chase Technology Ltd - http://www.chasetechnology.co.uk
* 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
@@ -8,6 +8,7 @@
* Contributors:
* Doug Satchwell (Chase Technology Ltd) - initial API and implementation
* David Carver (Intalio) - clean up find bugs
+ * Jesper S Moller - 405223 - Processing and file name/type doesn't match output type from XSL
*******************************************************************************/
package org.eclipse.wst.xsl.launching;
@@ -35,11 +36,27 @@
*/
public static IPath defaultOutputFileForInputFile(String inputFileExpression)
throws CoreException {
+ return defaultOutputFileForInputFile(inputFileExpression, "xml"); //$NON-NLS-1$
+ }
+
+ /**
+ * Creates a default Output File for the given input file string.
+ *
+ * @return Returns an IPath for the Output File.
+ * @since 1.0
+ */
+ public static IPath defaultOutputFileForInputFile(String inputFileExpression, String method)
+ throws CoreException {
String file = VariablesPlugin.getDefault().getStringVariableManager()
.performStringSubstitution(inputFileExpression);
IPath inputFilePath = new Path(file);
inputFilePath = inputFilePath.removeFileExtension();
- inputFilePath = inputFilePath.addFileExtension("out.xml"); //$NON-NLS-1$
+ String extension = "xml"; //$NON-NLS-1$
+ if ("text".equals(method)) extension = "txt"; //$NON-NLS-1$//$NON-NLS-2$
+ else if ("html".equals(method)) extension = "html"; //$NON-NLS-1$ //$NON-NLS-2$
+ else if ("xhtml".equals(method)) extension = "xhtml"; //$NON-NLS-1$ //$NON-NLS-2$
+
+ inputFilePath = inputFilePath.addFileExtension("out." + extension); //$NON-NLS-1$
return inputFilePath;
}
diff --git a/bundles/org.eclipse.wst.xsl.launching/src/org/eclipse/wst/xsl/launching/config/BaseLaunchHelper.java b/bundles/org.eclipse.wst.xsl.launching/src/org/eclipse/wst/xsl/launching/config/BaseLaunchHelper.java
index 8c2eb6e..73b9ab7 100644
--- a/bundles/org.eclipse.wst.xsl.launching/src/org/eclipse/wst/xsl/launching/config/BaseLaunchHelper.java
+++ b/bundles/org.eclipse.wst.xsl.launching/src/org/eclipse/wst/xsl/launching/config/BaseLaunchHelper.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007 Chase Technology Ltd - http://www.chasetechnology.co.uk
+ * Copyright (c) 2007, 2013 Chase Technology Ltd - http://www.chasetechnology.co.uk
* 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
@@ -7,6 +7,7 @@
*
* Contributors:
* Doug Satchwell (Chase Technology Ltd) - initial API and implementation
+ * Jesper S Moller - 405223 - Processing and file name/type doesn't match output type from XSL
*******************************************************************************/
package org.eclipse.wst.xsl.launching.config;
@@ -137,6 +138,10 @@
public static File hydrateOutputFile(ILaunchConfiguration configuration)
throws CoreException {
IPath outputFile = null;
+
+ String method = configuration.getAttribute(
+ XSLLaunchConfigurationConstants.ATTR_DEFAULT_OUTPUT_METHOD, "xml"); //$NON-NLS-1$
+
boolean useDefaultOutputFile = configuration.getAttribute(
XSLLaunchConfigurationConstants.ATTR_USE_DEFAULT_OUTPUT_FILE,
true);
@@ -153,7 +158,7 @@
outputFile = XSLTRuntime
.defaultOutputFileForInputFile(configuration.getAttribute(
XSLLaunchConfigurationConstants.ATTR_INPUT_FILE,
- (String) null));
+ (String) null), method);
}
return outputFile.toFile();
}