From: <ker...@us...> - 2013-11-09 16:27:32
|
Revision: 23328 http://jedit.svn.sourceforge.net/jedit/?rev=23328&view=rev Author: kerik-sf Date: 2013-11-09 16:27:22 +0000 (Sat, 09 Nov 2013) Log Message: ----------- fix bug in XSLT processor: encoding set in <xsl:output> was not applied This was because the result was written to a writer (with platform's default encoding), instead of letting the processor write to the file by himself. Modified Paths: -------------- plugins/XSLT/trunk/docs/users-guide.xml plugins/XSLT/trunk/test/xslt/XSLTPluginTest.java plugins/XSLT/trunk/xslt/XSLTProcessor.java Added Paths: ----------- plugins/XSLT/trunk/test_data/encoding/ plugins/XSLT/trunk/test_data/encoding/accentedchar-iso-8859-1.xsl plugins/XSLT/trunk/test_data/encoding/accentedchar-utf8.xsl Modified: plugins/XSLT/trunk/docs/users-guide.xml =================================================================== --- plugins/XSLT/trunk/docs/users-guide.xml 2013-11-09 16:26:34 UTC (rev 23327) +++ plugins/XSLT/trunk/docs/users-guide.xml 2013-11-09 16:27:22 UTC (rev 23328) @@ -464,6 +464,8 @@ <listitem><para>XPath tool: selecting node results from the Node-set summary opens the buffer if necessary and moves the caret to the location in the document. This only works with Saxon XPath engine.</para></listitem> + <listitem><para>XSLT processor: when transforming to a file, the encoding specified + in the transform's <xsl:output> is taken into account.</para></listitem> </itemizedlist> </para> <para> Modified: plugins/XSLT/trunk/test/xslt/XSLTPluginTest.java =================================================================== --- plugins/XSLT/trunk/test/xslt/XSLTPluginTest.java 2013-11-09 16:26:34 UTC (rev 23327) +++ plugins/XSLT/trunk/test/xslt/XSLTPluginTest.java 2013-11-09 16:27:22 UTC (rev 23328) @@ -18,9 +18,10 @@ import static org.gjt.sp.jedit.testframework.TestUtils.view; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; -import java.io.File; -import java.io.IOException; +import java.io.*; +import java.nio.charset.Charset; import java.util.regex.Pattern; import javax.swing.text.JTextComponent; @@ -33,6 +34,7 @@ import org.fest.swing.fixture.JPanelFixture; import org.fest.swing.fixture.JTableFixture; import org.fest.swing.timing.Pause; +import org.fest.swing.timing.Timeout; import org.gjt.sp.jedit.Buffer; import org.gjt.sp.jedit.testframework.JEditRunner; import org.gjt.sp.jedit.testframework.TestData; @@ -65,7 +67,7 @@ xsltProcessor.button("xslt.transform").click(); - Pause.pause(1000); + xsltProcessor.button("xslt.transform").requireEnabled(Timeout.timeout(1000)); Buffer b = view().getBuffer(); assertThat(b.getName().matches("Untitled-\\d+")); @@ -80,6 +82,10 @@ File xml = new File(testData.get(),"simple/source.xml"); File xsl = new File(testData.get(),"broken/transform.xsl"); + action("error-list-show"); + + FrameFixture errorlist = TestUtils.findFrameByTitle("Error List"); + final FrameFixture xsltProcessor = setupProcessor(xml,xsl,"",1); // an error will be reported @@ -88,15 +94,11 @@ xsltProcessor.button("xslt.transform").click(); - Pause.pause(1000); + xsltProcessor.button("xslt.transform").requireEnabled(Timeout.timeout(1000)); Buffer b = view().getBuffer(); assertThat(b.getName().matches("Untitled-\\d+")); - action("error-list-show"); - - FrameFixture errorlist = TestUtils.findFrameByTitle("Error List"); - errorlist.tree().selectRow(1); assertTrue(errorlist.tree().valueAt(1).startsWith("6: (XSLT error) xsl:ourrtput")); errorlist.close(); @@ -108,6 +110,9 @@ public void testXSLTBaseURIBug() throws IOException{ File xsl = new File(testData.get(),"base_uri_bug/base-uri-bug.xsl"); + action("error-list-show"); + FrameFixture errorlist = TestUtils.findFrameByTitle("Error List"); + final FrameFixture xsltProcessor = setupProcessor(xsl,xsl,"",1); // an error will be reported @@ -116,7 +121,7 @@ xsltProcessor.button("xslt.transform").click(); - Pause.pause(1000); + xsltProcessor.button("xslt.transform").requireEnabled(Timeout.timeout(1000)); Buffer b = view().getBuffer(); @@ -124,9 +129,6 @@ xsltProcessor.close(); - action("error-list-show"); - FrameFixture errorlist = TestUtils.findFrameByTitle("Error List"); - errorlist.tree().selectRow(1); assertTrue(errorlist.tree().valueAt(1).startsWith("15: (XSLT error)")); errorlist.close(); @@ -138,19 +140,19 @@ File xml = new File(testData.get(),"simple/source.xml"); File xsl = new File(testData.get(),"broken/fails_at_runtime.xsl"); + action("error-list-show"); + + FrameFixture errorlist = TestUtils.findFrameByTitle("Error List"); + final FrameFixture xsltProcessor = setupProcessor(xml,xsl,"",1); xsltProcessor.button("xslt.transform").click(); - Pause.pause(1000); + xsltProcessor.button("xslt.transform").requireEnabled(Timeout.timeout(1000)); Buffer b = view().getBuffer(); assertThat(b.getName().matches("Untitled-\\d+")); - action("error-list-show"); - - FrameFixture errorlist = TestUtils.findFrameByTitle("Error List"); - errorlist.tree().selectRow(1); assertTrue(errorlist.tree().valueAt(1).startsWith("16: (XSLT error)")); errorlist.close(); @@ -163,6 +165,9 @@ final File xml = new File(testData.get(),"broken/source.xml"); File xsl = new File(testData.get(),"simple/transform.xsl"); + action("error-list-show"); + FrameFixture errorlist = TestUtils.findFrameByTitle("Error List"); + final FrameFixture xsltProcessor = setupProcessor(xml,xsl,"",1); TestUtils.close(view(),view().getBuffer()); @@ -181,15 +186,12 @@ xsltProcessor.button("xslt.transform").click(); - Pause.pause(1000); + xsltProcessor.button("xslt.transform").requireEnabled(Timeout.timeout(1000)); Buffer b = view().getBuffer(); xsltProcessor.close(); - action("error-list-show"); - FrameFixture errorlist = TestUtils.findFrameByTitle("Error List"); - errorlist.tree().selectRow(1); assertTrue(errorlist.tree().valueAt(1).startsWith("2: (SAX error) Content is not allowed in prolog")); errorlist.close(); @@ -269,7 +271,7 @@ xsltProcessor.button("xslt.transform").click(); - Pause.pause(1000); + xsltProcessor.button("xslt.transform").requireEnabled(Timeout.timeout(1000)); xsltProcessor.close(); @@ -297,7 +299,7 @@ xsltProcessor.checkBox("open-result").requireSelected().uncheck(); xsltProcessor.button("xslt.transform").click(); - Pause.pause(1000); + xsltProcessor.button("xslt.transform").requireEnabled(Timeout.timeout(1000)); xsltProcessor.checkBox("open-result").check(); xsltProcessor.close(); @@ -318,7 +320,7 @@ xsltProcessor.button("xslt.transform").click(); - Pause.pause(1000); + xsltProcessor.button("xslt.transform").requireEnabled(Timeout.timeout(1000)); xsltProcessor.close(); @@ -344,22 +346,26 @@ xsltProcessor.button("xslt.transform").click(); - Pause.pause(1000); + xsltProcessor.button("xslt.transform").requireEnabled(Timeout.timeout(1000)); xsltProcessor.close(); - Buffer b = view().getBuffer(); + Pause.pause(1000); + Buffer b; + if(result.exists()){ + b = TestUtils.openFile(result.getPath()); + + assertEquals(0,b.getLength()); + + TestUtils.close(TestUtils.view(),b); + } - assertEquals(0,b.getLength()); - - TestUtils.close(TestUtils.view(),b); - b = TestUtils.openFile(realOutput.getPath()); assertEquals("Hello world !",b.getText(0,b.getLength())); TestUtils.close(TestUtils.view(),b); - assertTrue(result.delete()); + if(result.exists())assertTrue(result.delete()); assertTrue(realOutput.delete()); } @@ -373,7 +379,7 @@ xsltProcessor.button("xslt.transform").click(); - Pause.pause(1000); + xsltProcessor.button("xslt.transform").requireEnabled(Timeout.timeout(1000)); xsltProcessor.close(); @@ -393,7 +399,7 @@ xsltProcessor.radioButton("xslt.stylesheets.buffer").check(); xsltProcessor.button("xslt.transform").click(); - Pause.pause(1000); + xsltProcessor.button("xslt.transform").requireEnabled(Timeout.timeout(1000)); xsltProcessor.radioButton("xslt.stylesheets.file").check(); xsltProcessor.close(); @@ -450,7 +456,7 @@ xsltProcessor.button("xslt.transform").click(); - Pause.pause(1000); + xsltProcessor.button("xslt.transform").requireEnabled(Timeout.timeout(1000)); Buffer b = view().getBuffer(); @@ -470,7 +476,7 @@ xsltProcessor.button("xslt.transform").click(); - Pause.pause(1000); + xsltProcessor.button("xslt.transform").requireEnabled(Timeout.timeout(1000)); Buffer b = view().getBuffer(); @@ -489,7 +495,7 @@ xsltProcessor.button("xslt.transform").click(); - Pause.pause(1000); + xsltProcessor.button("xslt.transform").requireEnabled(Timeout.timeout(1000)); Buffer b = view().getBuffer(); @@ -497,6 +503,46 @@ TestUtils.close(TestUtils.view(),b); xsltProcessor.close(); } + + @Test + public void testOutputEncoding() throws IOException{ + File dest = new File(testData.get(),"encoding/result.xml"); + File xsl; + String encoding; + + if(Charset.defaultCharset().name().equals("UTF-8")){ + xsl = new File(testData.get(),"encoding/accentedchar-iso-8859-1.xsl"); + encoding="ISO-8859-1"; + }else{ + xsl = new File(testData.get(),"encoding/accentedchar-utf8.xsl"); + encoding="UTF-8"; + } + + final FrameFixture xsltProcessor = setupProcessor(xsl,xsl,dest.getPath(),1); + + xsltProcessor.button("xslt.transform").click(); + + xsltProcessor.button("xslt.transform").requireEnabled(Timeout.timeout(1000)); + + xsltProcessor.close(); + + try{ + BufferedReader rd = new BufferedReader(new InputStreamReader(new FileInputStream(dest), encoding)); + boolean found = false; + for(String line=rd.readLine(); line != null ; line=rd.readLine()){ + if(line.contains("<test>")){ + assertTrue("encoding error (should contain r\u00e9ussi)? "+line, line.contains("r\u00e9ussi")); + found = true; + } + } + rd.close(); + assertTrue(found); + + assertTrue(dest.delete()); + }catch(IOException e){ + fail("Exception should not happen: "+e); + } + } public FrameFixture setupProcessor(File xml, File xsl, final String dest,int version){ PluginOptionsFixture optionsF = TestUtils.pluginOptions(); Added: plugins/XSLT/trunk/test_data/encoding/accentedchar-iso-8859-1.xsl =================================================================== --- plugins/XSLT/trunk/test_data/encoding/accentedchar-iso-8859-1.xsl (rev 0) +++ plugins/XSLT/trunk/test_data/encoding/accentedchar-iso-8859-1.xsl 2013-11-09 16:27:22 UTC (rev 23328) @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!-- This XSLT template demonstrates that the encoding of the output is + taken into account, since we write an accented character in non + platform default encoding and will be able to load it afterward. + --> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> + <xsl:param name="encoding"/> + + <xsl:output method="xml" encoding="ISO-8859-1"/> + <xsl:template match="/"> + <test>réussi !</test> + </xsl:template> + +</xsl:stylesheet> Property changes on: plugins/XSLT/trunk/test_data/encoding/accentedchar-iso-8859-1.xsl ___________________________________________________________________ Added: svn:keywords + Id Author Revision Date Head Added: plugins/XSLT/trunk/test_data/encoding/accentedchar-utf8.xsl =================================================================== --- plugins/XSLT/trunk/test_data/encoding/accentedchar-utf8.xsl (rev 0) +++ plugins/XSLT/trunk/test_data/encoding/accentedchar-utf8.xsl 2013-11-09 16:27:22 UTC (rev 23328) @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!-- This XSLT template demonstrates that the encoding of the output is + taken into account, since we write an accented character in non + platform default encoding and will be able to load it afterward. + --> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> + <xsl:param name="encoding"/> + + <xsl:output method="xml" encoding="UTF-8"/> + <xsl:template match="/"> + <test>réussi !</test> + </xsl:template> + +</xsl:stylesheet> Property changes on: plugins/XSLT/trunk/test_data/encoding/accentedchar-utf8.xsl ___________________________________________________________________ Added: svn:keywords + Id Author Revision Date Head Modified: plugins/XSLT/trunk/xslt/XSLTProcessor.java =================================================================== --- plugins/XSLT/trunk/xslt/XSLTProcessor.java 2013-11-09 16:26:34 UTC (rev 23327) +++ plugins/XSLT/trunk/xslt/XSLTProcessor.java 2013-11-09 16:27:22 UTC (rev 23328) @@ -1,662 +1,659 @@ -/* - * XSLTProcessor.java - GUI for performing XSL Transformations - * - * Copyright 2002 Greg Merrill - * 2002, 2003 Robert McKinnon - * 2010 Eric Le Lay - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ -package xslt; - -import java.awt.BorderLayout; -import java.awt.Cursor; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.GridLayout; -import java.awt.GridBagLayout; -import java.awt.GridBagConstraints; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.Writer; -import java.io.FileWriter; -import java.io.StringWriter; -import java.io.IOException; -import java.util.Date; -import java.util.Map; - -import javax.swing.BorderFactory; -import javax.swing.JButton; -import javax.swing.JComponent; -import javax.swing.JPanel; -import javax.swing.JSplitPane; -import javax.swing.JToolBar; -import javax.swing.JCheckBox; -import javax.swing.SwingUtilities; - -import org.gjt.sp.jedit.Buffer; -import org.gjt.sp.jedit.View; -import org.gjt.sp.jedit.EditPane; -import org.gjt.sp.jedit.jEdit; -import org.gjt.sp.jedit.gui.DockableWindowManager; -import org.gjt.sp.jedit.gui.DefaultFocusComponent; -import org.gjt.sp.util.Log; -import org.gjt.sp.util.Task; -import org.gjt.sp.util.ThreadUtilities; - -import errorlist.*; - -import org.xml.sax.InputSource; -import org.xml.sax.SAXParseException; - -import javax.xml.transform.Result; -import javax.xml.transform.stream.StreamResult; - -/** - * GUI for performing XSL Transformations. - * - * @author Greg Merrill - * @author Robert McKinnon - rob...@us... - * @author Eric Le Lay - */ -public class XSLTProcessor extends JPanel implements DefaultFocusComponent { - public static final String DOCKABLE_NAME = "xslt-processor"; - private static final String OPEN_RESULT = "xslt.open-result"; - private static final String THREE_WAY = "xslt.three-way"; - - private View view; - private BufferOrFileVFSSelector resultPanel; - private XsltAction saveSettingsAction = new SaveSettingsAction(); - private XsltAction loadSettingsAction = new LoadSettingsAction(); - private XsltAction transformAction = new TransformAction(); - - private BufferOrFileVFSSelector inputSelectionPanel; - private StylesheetPanel stylesheetPanel; - private KeyValuePanel parameterPanel; - private JButton transformButton; - private JCheckBox openResultCheckBox; - private JCheckBox threeWayCheckBox; - - /** - * Constructor for the XSLTProcessor object. - * - */ - public XSLTProcessor(View theView, String position) { - super(); - - this.view = theView; - boolean sideBySide = position.equals(DockableWindowManager.TOP) || position.equals(DockableWindowManager.BOTTOM); - - initThreeWayCheckBox(); - initOpenResultCheckBox(); - this.resultPanel = new BufferOrFileVFSSelector(view,"xslt.result"); - this.inputSelectionPanel = new BufferOrFileVFSSelector(view,"xslt.source"); - this.stylesheetPanel = new StylesheetPanel(view, this); - this.parameterPanel = new KeyValuePanel("xslt.parameters"); - - JComponent transformPanel = initTransformToolBar(); - - if (sideBySide) { - createHorizontalLayout(inputSelectionPanel, transformPanel); - } else { - createVerticalLayout(inputSelectionPanel, transformPanel); - } - - setThreeWay(threeWayCheckBox.isSelected()); - - } - - public void focusOnDefaultComponent() { - if(transformButton != null) { - transformButton.requestFocus(); - } - } - - private void createVerticalLayout(JComponent sourcePanel, JComponent transformPanel) { - setLayout(new GridBagLayout()); - - sourcePanel.setBorder(BorderFactory.createEmptyBorder(8,0,0,0)); - stylesheetPanel.setBorder(BorderFactory.createEmptyBorder(8,0,0,0)); - transformPanel.setBorder(BorderFactory.createEmptyBorder(8,0,0,0)); - resultPanel.setBorder(BorderFactory.createEmptyBorder(8,0,0,0)); - openResultCheckBox.setBorder(BorderFactory.createEmptyBorder(8,0,0,0)); - - GridBagConstraints c = new GridBagConstraints(); - - c.gridx = 0; - c.gridy = 0; - c.gridwidth = 1; - c.gridheight = 1; - c.weightx = 1; - c.weighty = 0; - c.fill = GridBagConstraints.BOTH; - - add(threeWayCheckBox,c); - - c.gridy += c.gridheight; - c.gridheight = 4; - add(sourcePanel,c); - - JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, stylesheetPanel, parameterPanel); - splitPane.setOneTouchExpandable(true); - - c.gridy += c.gridheight; - c.gridheight = 10; - c.weighty = 1; - add(splitPane,c); - - c.gridy += c.gridheight; - c.gridheight = 1; - c.weighty = 0; - c.fill = GridBagConstraints.NONE; - c.anchor = GridBagConstraints.CENTER; - add(transformPanel,c); - c.gridy += c.gridheight; - c.gridheight = 4; - c.fill = GridBagConstraints.BOTH; - add(resultPanel,c); - c.gridy += c.gridheight; - c.gridheight = 1; - c.fill = GridBagConstraints.NONE; - add(openResultCheckBox,c); - } - - - private void createHorizontalLayout(JComponent sourcePanel, JComponent transformPanel) { - sourcePanel.setBorder(BorderFactory.createEmptyBorder(6,0,0,0)); - stylesheetPanel.setBorder(BorderFactory.createEmptyBorder(6,0,0,0)); - transformPanel.setBorder(BorderFactory.createEmptyBorder(6,0,0,0)); - resultPanel.setBorder(BorderFactory.createEmptyBorder(6,0,0,0)); - openResultCheckBox.setBorder(BorderFactory.createEmptyBorder(6,0,0,0)); - - JPanel sourceAndResultPanel = new JPanel(new BorderLayout()); - sourceAndResultPanel.add(sourcePanel, BorderLayout.NORTH); - sourceAndResultPanel.add(resultPanel, BorderLayout.CENTER); - sourceAndResultPanel.add(openResultCheckBox, BorderLayout.SOUTH); - - JPanel extraParameterPanel = new JPanel(new BorderLayout()); - extraParameterPanel.add(threeWayCheckBox,BorderLayout.NORTH); - extraParameterPanel.add(parameterPanel, BorderLayout.CENTER); - extraParameterPanel.add(transformPanel, BorderLayout.SOUTH); - - JSplitPane split1 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,stylesheetPanel,extraParameterPanel); - split1.setDividerLocation(0.5); - split1.setResizeWeight(0.5); - split1.setOneTouchExpandable(true); - JSplitPane split2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,split1,sourceAndResultPanel); - split2.setDividerLocation(0.66); - split2.setResizeWeight(0.66); - split2.setOneTouchExpandable(true); - -// setLayout(new GridBagLayout()); -// add(stylesheetPanel); -// add(extraParameterPanel); -// add(panel); - setLayout(new BorderLayout()); - add(split2,BorderLayout.CENTER); - } - - - /** - * Performs the transform action. - */ - public void clickTransformButton() { - transformAction.actionPerformed(null); - } - - - /** - * Performs the load settings action. - */ - public void clickLoadSettingsButton() { - loadSettingsAction.actionPerformed(null); - } - - - /** - * Performs the save settings action. - */ - public void clickSaveSettingsButton() { - saveSettingsAction.actionPerformed(null); - } - - - public boolean isThreeWay() { - return threeWayCheckBox.isSelected(); - } - - public void setThreeWay(boolean threeWay) { - inputSelectionPanel.setEnabled(!threeWay); - stylesheetPanel.setEnabled(!threeWay); - resultPanel.setEnabled(!threeWay); - openResultCheckBox.setEnabled(!threeWay); - if(threeWayCheckBox.isSelected() != threeWay) { - threeWayCheckBox.setSelected(threeWay); - } - } - - private void initThreeWayCheckBox(){ - - threeWayCheckBox = new JCheckBox(jEdit.getProperty("xslt.three-way.label")); - threeWayCheckBox.setSelected(jEdit.getBooleanProperty(THREE_WAY)); - threeWayCheckBox.setName("three-way"); - threeWayCheckBox.setToolTipText("xslt.three-way.tooltip"); - - // save preference for next time - threeWayCheckBox.addActionListener(new ActionListener(){ - public void actionPerformed(ActionEvent e){ - setThreeWay(threeWayCheckBox.isSelected()); - jEdit.setBooleanProperty(THREE_WAY,threeWayCheckBox.isSelected()); - } - }); - } - - private void initOpenResultCheckBox() { - - openResultCheckBox = new JCheckBox(jEdit.getProperty("xslt.result.open-result.label")); - openResultCheckBox.setSelected(jEdit.getBooleanProperty(OPEN_RESULT)); - openResultCheckBox.setName("open-result"); - openResultCheckBox.setToolTipText("xslt.result.open-result.tooltip"); - - // save preference for next time - openResultCheckBox.addActionListener(new ActionListener(){ - public void actionPerformed(ActionEvent e){ - jEdit.setBooleanProperty(OPEN_RESULT,openResultCheckBox.isSelected()); - } - }); - } - - - private JComponent initTransformToolBar() { - - JToolBar toolBar = new JToolBar(JToolBar.HORIZONTAL); - toolBar.setFloatable(false); - - toolBar.add(loadSettingsAction.getButton()); - toolBar.add(saveSettingsAction.getButton()); - toolBar.addSeparator(); - transformButton = transformAction.getButton(); - toolBar.add(transformButton); - - return toolBar; - } - - - public View getView() { - return view; - } - - public BufferOrFileVFSSelector getInputSelectionPanel() { - return inputSelectionPanel; - } - - public StylesheetPanel getStylesheetPanel() { - return stylesheetPanel; - } - - - public KeyValuePanel getParameterPanel() { - return parameterPanel; - } - - public BufferOrFileVFSSelector getResult() { - return this.resultPanel; - } - - public String getResultFile() { - if(isThreeWay()){ - int[] iBuffers = getThreeWayBuffers(); - return view.getEditPanes()[iBuffers[2]].getBuffer().getPath(); - } else if(getResult().isFileSelected()) { - return getInputSelectionPanel().getSourceFile(); - } else { - Buffer b = jEdit.newFile(view); - String path = b.getPath(); - jEdit.closeBuffer(view,b); - return path; - } - } - - public void setStylesheets(String[] stylesheets) { - this.stylesheetPanel.setStylesheets(stylesheets); - } - - - public void setStylesheetParameters(String[] names, String[] values) { - this.parameterPanel.setKeyValues(names, values); - } - - - /** - * Attempts to load settings from a user specified file. - */ - private void loadSettings() { - try { - XsltSettings settings = new XsltSettings(this); - settings.loadFromFile(); - } catch (Exception e) { - Log.log(Log.ERROR, this, e.toString()); - } - } - - - /** - * Attempts to save settings to a user specified file. - */ - private void saveSettings() { - try { - XsltSettings settings = new XsltSettings(this); - settings.writeToFile(); - } catch (IOException e) { - Log.log(Log.ERROR, this, e.toString()); - } - } - - public boolean shouldOpenResult() { - return openResultCheckBox.isSelected(); - } - - private void transform() { - if(isThreeWay()) { - if(view.getEditPanes().length != 3) { - XSLTPlugin.showMessageDialog("xslt.transform.message.three-edit-panes", this); - } else { - doTransform(); - } - } else if (!getStylesheetPanel().stylesheetsExist()) { - XSLTPlugin.showMessageDialog("xslt.transform.message.no-stylesheets", this); - } else if (!inputSelectionPanel.isSourceFileDefined()) { - XSLTPlugin.showMessageDialog("xslt.transform.message.no-source", this); - } else if (!resultPanel.isSourceFileDefined()) { - XSLTPlugin.showMessageDialog("xslt.transform.message.no-result", this); - } else { - doTransform(); - } - } - - - /** - * do the transform asynchronously. - * 3 stages: - * - (EDT, quick) prepare transform - * - (Task, maybe long) run transform - * - (EDT, async) process result - * - */ - private void doTransform() { - setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - - final Date start = new Date(); - - final String path; - final boolean outputToBuffer; - final Result result; - final File resultFile; - final Object[] stylesheets; - final Writer outputWriter; - - Buffer outputBuffer = null; - - if (isThreeWay()) { - EditPane[] editPanes = view.getEditPanes(); - int[] iBuffers = getThreeWayBuffers(); - - // input - path = editPanes[iBuffers[0]].getBuffer().getPath(); - - // stylesheet - stylesheets = new Object[]{editPanes[iBuffers[1]].getBuffer().getPath()}; - - // output - outputBuffer = editPanes[iBuffers[2]].getBuffer(); - - if(outputBuffer.isReadOnly()){ - //put the result in the correct edit pane - outputBuffer = jEdit.newFile(editPanes[iBuffers[2]]); - } - - outputToBuffer = true; - outputWriter = new StringWriter(); - result = new StreamResult(outputWriter); - result.setSystemId(xml.PathUtilities.pathToURL(outputBuffer.getPath())); - resultFile = null; - - } else { - if (inputSelectionPanel.isFileSelected()) { - path = inputSelectionPanel.getSourceFile(); - } else { - Buffer buffer = view.getBuffer(); - path = buffer.getPath(); - } - - // get the stylesheets now, before the current buffer has changed - stylesheets = getStylesheets(); - - outputToBuffer = !resultPanel.isFileSelected(); - if(outputToBuffer) { - resultFile = null; - outputBuffer = jEdit.newFile(view); - outputWriter = new StringWriter(); - result = new StreamResult(outputWriter); - result.setSystemId(xml.PathUtilities.pathToURL(outputBuffer.getPath())); - } else { - resultFile = new File(resultPanel.getSourceFile()); - outputBuffer = jEdit.getBuffer(resultFile.getAbsolutePath()); - try { - outputWriter = new FileWriter(resultFile); - } catch (IOException e) { - String message = jEdit.getProperty("xslt.transform.message.failure"); - XSLTPlugin.processException(e, message, XSLTProcessor.this); - return; - } - result = new StreamResult(outputWriter); - result.setSystemId(resultFile.toURI().toString()); - } - } - - // clear any existing error - XSLTPlugin.getErrorSource(view).clear(); - - final Buffer fOutputBuffer = outputBuffer; - - Task t = new Task() { - - @Override - public void _run() { - ErrorListenerToErrorList listener = new ErrorListenerToErrorList(view, ""); - try { - - - InputSource inputSource = xml.Resolver.instance().resolveEntity(/*publicId*/null,path); - - XSLTUtilities.transform(inputSource, stylesheets , getStylesheetParameters(), result, listener); - - } catch(SAXParseException spe){ - listener.sendSAXError(spe); - String message = jEdit.getProperty("xslt.transform.message.failure"); - XSLTPlugin.processException(spe, message, XSLTProcessor.this); - - } catch (Exception e) { - String message = jEdit.getProperty("xslt.transform.message.failure"); - XSLTPlugin.processException(e, message, XSLTProcessor.this); - } finally { - // close the output - try { - outputWriter.flush(); - } catch (IOException e) { - Log.log(Log.WARNING, XSLTProcessor.class, "unable to flush transform output"); - } - try { - outputWriter.close(); - } catch (IOException e) { - Log.log(Log.WARNING, XSLTProcessor.class, "unable to close transform output"); - } - - SwingUtilities.invokeLater(new Runnable(){ - @Override - public void run() { - if(outputToBuffer){ - // pull the content to the Untitled buffer - fOutputBuffer.remove(0,fOutputBuffer.getLength()); - fOutputBuffer.insert(0,outputWriter.toString()); - }else if (fOutputBuffer == null) { - // output to file, which wasn't open before - if(shouldOpenResult()) { - jEdit.openFile(view, resultFile.getAbsolutePath()); - } - } else { - // output to file, which was already open - fOutputBuffer.reload(view); - } - logTimeTaken(start); - setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - } - }); - } - } - }; - ThreadUtilities.runInBackground(t); - } - - - public int[] getThreeWayBuffers(){ - int[] res = new int[3]; - - Buffer[] buffers = new Buffer[3]; - EditPane[] editPanes = view.getEditPanes(); - int iXML = -1,iXSLT=-1, iResult = -1; - - for(int i=0;i<3;i++) { - buffers[i] = editPanes[i].getBuffer(); - if("xsl".equals(buffers[i].getMode().getName())) { - // why should it be Source XSL -> XSL Transform -> result - // and not Source XML -> XSL Transform -> XSL result ? - // So the canonical ordering is used when there are 2 XSL - if(iXSLT == -1){ - iXSLT = i; - }else{ - iXSLT = 3; - } - } else if(iXML == -1 && "xml".equals(buffers[i].getMode().getName())) { - // only the first XML buffer will be seen as input - iXML = i; - } else { - iResult = i; - } - } - - if(iXML == -1 || iXSLT == -1 || iXSLT == 3) { - //ambiguous, so resort to default positioning - iXML = 0; - iXSLT = 1; - iResult = 2; - } - - // input - res[0] = iXML; - - // stylesheet - res[1] = iXSLT; - - // output - res[2] = iResult; - - return res; - } - - - public String getInput() { - if(isThreeWay()){ - int[] iBuffers = getThreeWayBuffers(); - return view.getEditPanes()[iBuffers[0]].getBuffer().getPath(); - } else if(getInputSelectionPanel().isFileSelected()) { - return getInputSelectionPanel().getSourceFile(); - } else { - return view.getBuffer().getPath(); - } - } - - public Object[] getStylesheets() { - if(isThreeWay()){ - int[] iBuffers = getThreeWayBuffers(); - return new Object[]{ (view.getEditPanes()[iBuffers[1]]).getBuffer().getPath()}; - } else if (getStylesheetPanel().isFileSelected()) { - return getStylesheetPanel().getStylesheets(); - } else { - Buffer buffer = view.getBuffer(); - return new Object[]{buffer.getPath()}; - } - } - - - private Map getStylesheetParameters() { - return getParameterPanel().getMap(); - } - - - private void logTimeTaken(Date start) { - Date end = new Date(); - long timeTaken = end.getTime() - start.getTime(); - long secondsTaken = timeTaken / 1000; - long partialSecondsTaken = timeTaken % 1000; - Object[] param = {secondsTaken + "." + partialSecondsTaken}; - String status = jEdit.getProperty("xslt.transform.message.success", param); - Log.log(Log.MESSAGE, this, status); - } - - private class TransformAction extends XsltAction { - - TransformAction() { - super("xslt.transform"); - } - - public void actionPerformed(ActionEvent e) { - transform(); - } - - protected Dimension getButtonDimension() { - Dimension dimension = new Dimension(74, 30); - return dimension; - } - } - - - private class SaveSettingsAction extends XsltAction { - - SaveSettingsAction() { - super("xslt.settings.save"); - } - - public void actionPerformed(ActionEvent e) { - saveSettings(); - } - - } - - - private class LoadSettingsAction extends XsltAction { - - LoadSettingsAction() { - super("xslt.settings.load"); - } - - public void actionPerformed(ActionEvent e) { - loadSettings(); - } - - } - +/* + * XSLTProcessor.java - GUI for performing XSL Transformations + * + * Copyright 2002 Greg Merrill + * 2002, 2003 Robert McKinnon + * 2010 Eric Le Lay + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ +package xslt; + +import java.awt.BorderLayout; +import java.awt.Cursor; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.GridLayout; +import java.awt.GridBagLayout; +import java.awt.GridBagConstraints; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.Writer; +import java.io.FileWriter; +import java.io.StringWriter; +import java.io.IOException; +import java.util.Date; +import java.util.Map; + +import javax.swing.BorderFactory; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JPanel; +import javax.swing.JSplitPane; +import javax.swing.JToolBar; +import javax.swing.JCheckBox; +import javax.swing.SwingUtilities; + +import org.gjt.sp.jedit.Buffer; +import org.gjt.sp.jedit.View; +import org.gjt.sp.jedit.EditPane; +import org.gjt.sp.jedit.jEdit; +import org.gjt.sp.jedit.gui.DockableWindowManager; +import org.gjt.sp.jedit.gui.DefaultFocusComponent; +import org.gjt.sp.util.Log; +import org.gjt.sp.util.Task; +import org.gjt.sp.util.ThreadUtilities; + +import errorlist.*; + +import org.xml.sax.InputSource; +import org.xml.sax.SAXParseException; + +import javax.xml.transform.Result; +import javax.xml.transform.stream.StreamResult; + +/** + * GUI for performing XSL Transformations. + * + * @author Greg Merrill + * @author Robert McKinnon - rob...@us... + * @author Eric Le Lay + */ +public class XSLTProcessor extends JPanel implements DefaultFocusComponent { + public static final String DOCKABLE_NAME = "xslt-processor"; + private static final String OPEN_RESULT = "xslt.open-result"; + private static final String THREE_WAY = "xslt.three-way"; + + private View view; + private BufferOrFileVFSSelector resultPanel; + private XsltAction saveSettingsAction = new SaveSettingsAction(); + private XsltAction loadSettingsAction = new LoadSettingsAction(); + private XsltAction transformAction = new TransformAction(); + + private BufferOrFileVFSSelector inputSelectionPanel; + private StylesheetPanel stylesheetPanel; + private KeyValuePanel parameterPanel; + private JButton transformButton; + private JCheckBox openResultCheckBox; + private JCheckBox threeWayCheckBox; + + /** + * Constructor for the XSLTProcessor object. + * + */ + public XSLTProcessor(View theView, String position) { + super(); + + this.view = theView; + boolean sideBySide = position.equals(DockableWindowManager.TOP) || position.equals(DockableWindowManager.BOTTOM); + + initThreeWayCheckBox(); + initOpenResultCheckBox(); + this.resultPanel = new BufferOrFileVFSSelector(view,"xslt.result"); + this.inputSelectionPanel = new BufferOrFileVFSSelector(view,"xslt.source"); + this.stylesheetPanel = new StylesheetPanel(view, this); + this.parameterPanel = new KeyValuePanel("xslt.parameters"); + + JComponent transformPanel = initTransformToolBar(); + + if (sideBySide) { + createHorizontalLayout(inputSelectionPanel, transformPanel); + } else { + createVerticalLayout(inputSelectionPanel, transformPanel); + } + + setThreeWay(threeWayCheckBox.isSelected()); + + } + + public void focusOnDefaultComponent() { + if(transformButton != null) { + transformButton.requestFocus(); + } + } + + private void createVerticalLayout(JComponent sourcePanel, JComponent transformPanel) { + setLayout(new GridBagLayout()); + + sourcePanel.setBorder(BorderFactory.createEmptyBorder(8,0,0,0)); + stylesheetPanel.setBorder(BorderFactory.createEmptyBorder(8,0,0,0)); + transformPanel.setBorder(BorderFactory.createEmptyBorder(8,0,0,0)); + resultPanel.setBorder(BorderFactory.createEmptyBorder(8,0,0,0)); + openResultCheckBox.setBorder(BorderFactory.createEmptyBorder(8,0,0,0)); + + GridBagConstraints c = new GridBagConstraints(); + + c.gridx = 0; + c.gridy = 0; + c.gridwidth = 1; + c.gridheight = 1; + c.weightx = 1; + c.weighty = 0; + c.fill = GridBagConstraints.BOTH; + + add(threeWayCheckBox,c); + + c.gridy += c.gridheight; + c.gridheight = 4; + add(sourcePanel,c); + + JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, stylesheetPanel, parameterPanel); + splitPane.setOneTouchExpandable(true); + + c.gridy += c.gridheight; + c.gridheight = 10; + c.weighty = 1; + add(splitPane,c); + + c.gridy += c.gridheight; + c.gridheight = 1; + c.weighty = 0; + c.fill = GridBagConstraints.NONE; + c.anchor = GridBagConstraints.CENTER; + add(transformPanel,c); + c.gridy += c.gridheight; + c.gridheight = 4; + c.fill = GridBagConstraints.BOTH; + add(resultPanel,c); + c.gridy += c.gridheight; + c.gridheight = 1; + c.fill = GridBagConstraints.NONE; + add(openResultCheckBox,c); + } + + + private void createHorizontalLayout(JComponent sourcePanel, JComponent transformPanel) { + sourcePanel.setBorder(BorderFactory.createEmptyBorder(6,0,0,0)); + stylesheetPanel.setBorder(BorderFactory.createEmptyBorder(6,0,0,0)); + transformPanel.setBorder(BorderFactory.createEmptyBorder(6,0,0,0)); + resultPanel.setBorder(BorderFactory.createEmptyBorder(6,0,0,0)); + openResultCheckBox.setBorder(BorderFactory.createEmptyBorder(6,0,0,0)); + + JPanel sourceAndResultPanel = new JPanel(new BorderLayout()); + sourceAndResultPanel.add(sourcePanel, BorderLayout.NORTH); + sourceAndResultPanel.add(resultPanel, BorderLayout.CENTER); + sourceAndResultPanel.add(openResultCheckBox, BorderLayout.SOUTH); + + JPanel extraParameterPanel = new JPanel(new BorderLayout()); + extraParameterPanel.add(threeWayCheckBox,BorderLayout.NORTH); + extraParameterPanel.add(parameterPanel, BorderLayout.CENTER); + extraParameterPanel.add(transformPanel, BorderLayout.SOUTH); + + JSplitPane split1 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,stylesheetPanel,extraParameterPanel); + split1.setDividerLocation(0.5); + split1.setResizeWeight(0.5); + split1.setOneTouchExpandable(true); + JSplitPane split2 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,true,split1,sourceAndResultPanel); + split2.setDividerLocation(0.66); + split2.setResizeWeight(0.66); + split2.setOneTouchExpandable(true); + +// setLayout(new GridBagLayout()); +// add(stylesheetPanel); +// add(extraParameterPanel); +// add(panel); + setLayout(new BorderLayout()); + add(split2,BorderLayout.CENTER); + } + + + /** + * Performs the transform action. + */ + public void clickTransformButton() { + transformAction.actionPerformed(null); + } + + + /** + * Performs the load settings action. + */ + public void clickLoadSettingsButton() { + loadSettingsAction.actionPerformed(null); + } + + + /** + * Performs the save settings action. + */ + public void clickSaveSettingsButton() { + saveSettingsAction.actionPerformed(null); + } + + + public boolean isThreeWay() { + return threeWayCheckBox.isSelected(); + } + + public void setThreeWay(boolean threeWay) { + inputSelectionPanel.setEnabled(!threeWay); + stylesheetPanel.setEnabled(!threeWay); + resultPanel.setEnabled(!threeWay); + openResultCheckBox.setEnabled(!threeWay); + if(threeWayCheckBox.isSelected() != threeWay) { + threeWayCheckBox.setSelected(threeWay); + } + } + + private void initThreeWayCheckBox(){ + + threeWayCheckBox = new JCheckBox(jEdit.getProperty("xslt.three-way.label")); + threeWayCheckBox.setSelected(jEdit.getBooleanProperty(THREE_WAY)); + threeWayCheckBox.setName("three-way"); + threeWayCheckBox.setToolTipText("xslt.three-way.tooltip"); + + // save preference for next time + threeWayCheckBox.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent e){ + setThreeWay(threeWayCheckBox.isSelected()); + jEdit.setBooleanProperty(THREE_WAY,threeWayCheckBox.isSelected()); + } + }); + } + + private void initOpenResultCheckBox() { + + openResultCheckBox = new JCheckBox(jEdit.getProperty("xslt.result.open-result.label")); + openResultCheckBox.setSelected(jEdit.getBooleanProperty(OPEN_RESULT)); + openResultCheckBox.setName("open-result"); + openResultCheckBox.setToolTipText("xslt.result.open-result.tooltip"); + + // save preference for next time + openResultCheckBox.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent e){ + jEdit.setBooleanProperty(OPEN_RESULT,openResultCheckBox.isSelected()); + } + }); + } + + + private JComponent initTransformToolBar() { + + JToolBar toolBar = new JToolBar(JToolBar.HORIZONTAL); + toolBar.setFloatable(false); + + toolBar.add(loadSettingsAction.getButton()); + toolBar.add(saveSettingsAction.getButton()); + toolBar.addSeparator(); + transformButton = transformAction.getButton(); + toolBar.add(transformButton); + + return toolBar; + } + + + public View getView() { + return view; + } + + public BufferOrFileVFSSelector getInputSelectionPanel() { + return inputSelectionPanel; + } + + public StylesheetPanel getStylesheetPanel() { + return stylesheetPanel; + } + + + public KeyValuePanel getParameterPanel() { + return parameterPanel; + } + + public BufferOrFileVFSSelector getResult() { + return this.resultPanel; + } + + public String getResultFile() { + if(isThreeWay()){ + int[] iBuffers = getThreeWayBuffers(); + return view.getEditPanes()[iBuffers[2]].getBuffer().getPath(); + } else if(getResult().isFileSelected()) { + return getInputSelectionPanel().getSourceFile(); + } else { + Buffer b = jEdit.newFile(view); + String path = b.getPath(); + jEdit.closeBuffer(view,b); + return path; + } + } + + public void setStylesheets(String[] stylesheets) { + this.stylesheetPanel.setStylesheets(stylesheets); + } + + + public void setStylesheetParameters(String[] names, String[] values) { + this.parameterPanel.setKeyValues(names, values); + } + + + /** + * Attempts to load settings from a user specified file. + */ + private void loadSettings() { + try { + XsltSettings settings = new XsltSettings(this); + settings.loadFromFile(); + } catch (Exception e) { + Log.log(Log.ERROR, this, e.toString()); + } + } + + + /** + * Attempts to save settings to a user specified file. + */ + private void saveSettings() { + try { + XsltSettings settings = new XsltSettings(this); + settings.writeToFile(); + } catch (IOException e) { + Log.log(Log.ERROR, this, e.toString()); + } + } + + public boolean shouldOpenResult() { + return openResultCheckBox.isSelected(); + } + + private void transform() { + if(isThreeWay()) { + if(view.getEditPanes().length != 3) { + XSLTPlugin.showMessageDialog("xslt.transform.message.three-edit-panes", this); + } else { + doTransform(); + } + } else if (!getStylesheetPanel().stylesheetsExist()) { + XSLTPlugin.showMessageDialog("xslt.transform.message.no-stylesheets", this); + } else if (!inputSelectionPanel.isSourceFileDefined()) { + XSLTPlugin.showMessageDialog("xslt.transform.message.no-source", this); + } else if (!resultPanel.isSourceFileDefined()) { + XSLTPlugin.showMessageDialog("xslt.transform.message.no-result", this); + } else { + doTransform(); + } + } + + + /** + * do the transform asynchronously. + * 3 stages: + * - (EDT, quick) prepare transform + * - (Task, maybe long) run transform + * - (EDT, async) process result + * + */ + private void doTransform() { + setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + + final Date start = new Date(); + + final String path; + final boolean outputToBuffer; + final Result result; + final File resultFile; + final Object[] stylesheets; + final Writer outputWriter; + + Buffer outputBuffer = null; + + if (isThreeWay()) { + EditPane[] editPanes = view.getEditPanes(); + int[] iBuffers = getThreeWayBuffers(); + + // input + path = editPanes[iBuffers[0]].getBuffer().getPath(); + + // stylesheet + stylesheets = new Object[]{editPanes[iBuffers[1]].getBuffer().getPath()}; + + // output + outputBuffer = editPanes[iBuffers[2]].getBuffer(); + + if(outputBuffer.isReadOnly()){ + //put the result in the correct edit pane + outputBuffer = jEdit.newFile(editPanes[iBuffers[2]]); + } + + outputToBuffer = true; + outputWriter = new StringWriter(); + result = new StreamResult(outputWriter); + result.setSystemId(xml.PathUtilities.pathToURL(outputBuffer.getPath())); + resultFile = null; + + } else { + if (inputSelectionPanel.isFileSelected()) { + path = inputSelectionPanel.getSourceFile(); + } else { + Buffer buffer = view.getBuffer(); + path = buffer.getPath(); + } + + // get the stylesheets now, before the current buffer has changed + stylesheets = getStylesheets(); + + outputToBuffer = !resultPanel.isFileSelected(); + if(outputToBuffer) { + resultFile = null; + outputBuffer = jEdit.newFile(view); + outputWriter = new StringWriter(); + result = new StreamResult(outputWriter); + result.setSystemId(xml.PathUtilities.pathToURL(outputBuffer.getPath())); + } else { + // let transformer write directly to file, if an encoding was chosen + // in the transform. + resultFile = new File(resultPanel.getSourceFile()); + outputBuffer = jEdit.getBuffer(resultFile.getAbsolutePath()); + result = new StreamResult(resultFile.toURI().toString()); + outputWriter = null; + } + } + + // clear any existing error + XSLTPlugin.getErrorSource(view).clear(); + + final Buffer fOutputBuffer = outputBuffer; + + Task t = new Task() { + + @Override + public void _run() { + ErrorListenerToErrorList listener = new ErrorListenerToErrorList(view, ""); + try { + + + InputSource inputSource = xml.Resolver.instance().resolveEntity(/*publicId*/null,path); + + XSLTUtilities.transform(inputSource, stylesheets , getStylesheetParameters(), result, listener); + + } catch(SAXParseException spe){ + listener.sendSAXError(spe); + String message = jEdit.getProperty("xslt.transform.message.failure"); + XSLTPlugin.processException(spe, message, XSLTProcessor.this); + + } catch (Exception e) { + String message = jEdit.getProperty("xslt.transform.message.failure"); + XSLTPlugin.processException(e, message, XSLTProcessor.this); + } finally { + // close the output + if(outputWriter!=null) { + try { + outputWriter.flush(); + } catch (IOException e) { + Log.log(Log.WARNING, XSLTProcessor.class, "unable to flush transform output"); + } + try { + outputWriter.close(); + } catch (IOException e) { + Log.log(Log.WARNING, XSLTProcessor.class, "unable to close transform output"); + } + } + + SwingUtilities.invokeLater(new Runnable(){ + @Override + public void run() { + if(outputToBuffer){ + // pull the content to the Untitled buffer + fOutputBuffer.remove(0,fOutputBuffer.getLength()); + fOutputBuffer.insert(0,outputWriter.toString()); + }else if (fOutputBuffer == null) { + // output to file, which wasn't open before + if(shouldOpenResult()) { + jEdit.openFile(view, resultFile.getAbsolutePath()); + } + } else { + // output to file, which was already open + fOutputBuffer.reload(view); + } + logTimeTaken(start); + setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + } + }); + } + } + }; + ThreadUtilities.runInBackground(t); + } + + + public int[] getThreeWayBuffers(){ + int[] res = new int[3]; + + Buffer[] buffers = new Buffer[3]; + EditPane[] editPanes = view.getEditPanes(); + int iXML = -1,iXSLT=-1, iResult = -1; + + for(int i=0;i<3;i++) { + buffers[i] = editPanes[i].getBuffer(); + if("xsl".equals(buffers[i].getMode().getName())) { + // why should it be Source XSL -> XSL Transform -> result + // and not Source XML -> XSL Transform -> XSL result ? + // So the canonical ordering is used when there are 2 XSL + if(iXSLT == -1){ + iXSLT = i; + }else{ + iXSLT = 3; + } + } else if(iXML == -1 && "xml".equals(buffers[i].getMode().getName())) { + // only the first XML buffer will be seen as input + iXML = i; + } else { + iResult = i; + } + } + + if(iXML == -1 || iXSLT == -1 || iXSLT == 3) { + //ambiguous, so resort to default positioning + iXML = 0; + iXSLT = 1; + iResult = 2; + } + + // input + res[0] = iXML; + + // stylesheet + res[1] = iXSLT; + + // output + res[2] = iResult; + + return res; + } + + + public String getInput() { + if(isThreeWay()){ + int[] iBuffers = getThreeWayBuffers(); + return view.getEditPanes()[iBuffers[0]].getBuffer().getPath(); + } else if(getInputSelectionPanel().isFileSelected()) { + return getInputSelectionPanel().getSourceFile(); + } else { + return view.getBuffer().getPath(); + } + } + + public Object[] getStylesheets() { + if(isThreeWay()){ + int[] iBuffers = getThreeWayBuffers(); + return new Object[]{ (view.getEditPanes()[iBuffers[1]]).getBuffer().getPath()}; + } else if (getStylesheetPanel().isFileSelected()) { + return getStylesheetPanel().getStylesheets(); + } else { + Buffer buffer = view.getBuffer(); + return new Object[]{buffer.getPath()}; + } + } + + + private Map getStylesheetParameters() { + return getParameterPanel().getMap(); + } + + + private void logTimeTaken(Date start) { + Date end = new Date(); + long timeTaken = end.getTime() - start.getTime(); + long secondsTaken = timeTaken / 1000; + long partialSecondsTaken = timeTaken % 1000; + Object[] param = {secondsTaken + "." + partialSecondsTaken}; + String status = jEdit.getProperty("xslt.transform.message.success", param); + Log.log(Log.MESSAGE, this, status); + } + + private class TransformAction extends XsltAction { + + TransformAction() { + super("xslt.transform"); + } + + public void actionPerformed(ActionEvent e) { + transform(); + } + + protected Dimension getButtonDimension() { + Dimension dimension = new Dimension(74, 30); + return dimension; + } + } + + + private class SaveSettingsAction extends XsltAction { + + SaveSettingsAction() { + super("xslt.settings.save"); + } + + public void actionPerformed(ActionEvent e) { + saveSettings(); + } + + } + + + private class LoadSettingsAction extends XsltAction { + + LoadSettingsAction() { + super("xslt.settings.load"); + } + + public void actionPerformed(ActionEvent e) { + loadSettings(); + } + + } + } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |