filter: make LibXSLTTransformer init backward compatible
As reported by Fernand Vanrie, initializing the XSLT service can fail
because the LibXSLTTransformer::initialize was changed to require
the parameters as a nested Sequence; accept previous parameter
convention as a fall-back.
(regression from ca0ea73a4a)
Change-Id: I136e6e6338f11ffecf9f856f0736d1d0e6b17c3f
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
|
||||
#
|
||||
# This file is part of the LibreOffice project.
|
||||
#
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
#
|
||||
|
||||
$(eval $(call gb_CppunitTest_CppunitTest,filter_xslt))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_api,filter_xslt,\
|
||||
offapi \
|
||||
udkapi \
|
||||
))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_ure,filter_xslt))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_configuration,filter_xslt))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_libraries,filter_xslt, \
|
||||
comphelper \
|
||||
test \
|
||||
unotest \
|
||||
cppuhelper \
|
||||
cppu \
|
||||
sal \
|
||||
$(gb_UWINAPI) \
|
||||
))
|
||||
|
||||
$(eval $(call gb_CppunitTest_use_components,filter_xslt,\
|
||||
configmgr/source/configmgr \
|
||||
filter/source/xsltfilter/xsltfilter \
|
||||
i18npool/util/i18npool \
|
||||
ucb/source/core/ucb1 \
|
||||
ucb/source/ucp/file/ucpfile1 \
|
||||
))
|
||||
|
||||
$(eval $(call gb_CppunitTest_add_exception_objects,filter_xslt, \
|
||||
filter/qa/cppunit/xslt-test \
|
||||
))
|
||||
|
||||
# vim: set noet sw=4 ts=4:
|
||||
@@ -77,6 +77,10 @@ $(eval $(call gb_Module_add_targets,filter,\
|
||||
))
|
||||
endif
|
||||
|
||||
$(eval $(call gb_Module_add_check_targets,filter,\
|
||||
CppunitTest_filter_xslt \
|
||||
))
|
||||
|
||||
ifneq ($(DISABLE_CVE_TESTS),TRUE)
|
||||
$(eval $(call gb_Module_add_check_targets,filter,\
|
||||
CppunitTest_filter_pict_test \
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<xsl:stylesheet version="1.0"
|
||||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
||||
|
||||
<xsl:template match="/">
|
||||
<xsl:copy-of select="/"/>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
||||
@@ -0,0 +1,190 @@
|
||||
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
||||
/*
|
||||
* This file is part of the LibreOffice project.
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
#include <limits>
|
||||
|
||||
#include <cppunit/TestAssert.h>
|
||||
#include <cppunit/TestFixture.h>
|
||||
#include <cppunit/extensions/HelperMacros.h>
|
||||
#include <cppunit/plugin/TestPlugIn.h>
|
||||
|
||||
#include <sal/types.h>
|
||||
|
||||
#include <rtl/ref.hxx>
|
||||
|
||||
#include <osl/file.hxx>
|
||||
#include <osl/thread.h>
|
||||
|
||||
#include <com/sun/star/beans/NamedValue.hpp>
|
||||
#include <com/sun/star/io/XStreamListener.hpp>
|
||||
#include <com/sun/star/uno/XComponentContext.hpp>
|
||||
#include <com/sun/star/ucb/SimpleFileAccess.hpp>
|
||||
#include <com/sun/star/xml/xslt/XSLTTransformer.hpp>
|
||||
|
||||
#include <cppuhelper/implbase1.hxx>
|
||||
|
||||
#include <test/bootstrapfixture.hxx>
|
||||
|
||||
|
||||
using namespace std;
|
||||
using namespace ::com::sun::star;
|
||||
|
||||
|
||||
namespace {
|
||||
|
||||
class XsltFilterTest
|
||||
: public test::BootstrapFixture
|
||||
{
|
||||
public:
|
||||
void testXsltCopyOld();
|
||||
void testXsltCopyNew();
|
||||
|
||||
CPPUNIT_TEST_SUITE(XsltFilterTest);
|
||||
CPPUNIT_TEST(testXsltCopyOld);
|
||||
CPPUNIT_TEST(testXsltCopyNew);
|
||||
CPPUNIT_TEST_SUITE_END();
|
||||
};
|
||||
|
||||
struct Listener : public ::cppu::WeakImplHelper1<io::XStreamListener>
|
||||
{
|
||||
bool m_bDone;
|
||||
|
||||
Listener() : m_bDone(false) {}
|
||||
|
||||
virtual void disposing(const lang::EventObject&) throw() SAL_OVERRIDE {}
|
||||
virtual void SAL_CALL started() throw() SAL_OVERRIDE { m_bDone = false; }
|
||||
virtual void SAL_CALL closed() throw() SAL_OVERRIDE { m_bDone = true; }
|
||||
virtual void SAL_CALL terminated() throw() SAL_OVERRIDE { m_bDone = true; }
|
||||
virtual void SAL_CALL error(const uno::Any& e) throw() SAL_OVERRIDE
|
||||
{
|
||||
SAL_WARN("filter.xslt", "exception " << e);
|
||||
CPPUNIT_FAIL("exception while in XSLT");
|
||||
}
|
||||
};
|
||||
|
||||
void XsltFilterTest::testXsltCopyNew()
|
||||
{
|
||||
OUString tempDirURL;
|
||||
osl_getTempDirURL(&tempDirURL.pData);
|
||||
oslFileHandle tempFile;
|
||||
OUString tempURL;
|
||||
osl::File::RC rc = osl::File::createTempFile(0, &tempFile, &tempURL);
|
||||
CPPUNIT_ASSERT(osl::FileBase::E_None == rc);
|
||||
|
||||
OUString source(
|
||||
getURLFromSrc("/filter/source/xsltfilter/xsltfilter.component"));
|
||||
uno::Sequence<uno::Any> args(7);
|
||||
args[0] <<= beans::NamedValue("StylesheetURL",
|
||||
uno::makeAny(getURLFromSrc("/filter/qa/cppunit/data/xslt/copy.xslt")));
|
||||
args[1] <<= beans::NamedValue("SourceURL", uno::makeAny(source));
|
||||
args[2] <<= beans::NamedValue("TargetURL", uno::makeAny(tempURL));
|
||||
args[3] <<= beans::NamedValue("SourceBaseURL",
|
||||
uno::makeAny(getURLFromSrc("/filter/source/xsltfilter/")));
|
||||
args[4] <<= beans::NamedValue("TargetBaseURL", uno::makeAny(tempDirURL));
|
||||
args[5] <<= beans::NamedValue("SystemType", uno::makeAny(OUString()));
|
||||
args[6] <<= beans::NamedValue("PublicType", uno::makeAny(OUString()));
|
||||
|
||||
uno::Reference<ucb::XSimpleFileAccess3> xSFA =
|
||||
ucb::SimpleFileAccess::create(getComponentContext());
|
||||
|
||||
uno::Reference<io::XInputStream> xIn = xSFA->openFileRead(source);
|
||||
uno::Reference<io::XOutputStream> xOut = xSFA->openFileWrite(tempURL);
|
||||
|
||||
rtl::Reference<Listener> xListener = new Listener();
|
||||
|
||||
uno::Reference<xml::xslt::XXSLTTransformer> xXslt(
|
||||
xml::xslt::XSLTTransformer::create(getComponentContext(), args));
|
||||
|
||||
xXslt->addListener(uno::Reference<io::XStreamListener>(xListener.get()));
|
||||
xXslt->setInputStream(xIn);
|
||||
xXslt->setOutputStream(xOut);
|
||||
|
||||
xXslt->start();
|
||||
|
||||
TimeValue delay;
|
||||
delay.Seconds = 0;
|
||||
delay.Nanosec = 1000000;
|
||||
while (!xListener->m_bDone) { osl_waitThread(&delay); }
|
||||
|
||||
xIn->closeInput();
|
||||
xOut->closeOutput();
|
||||
|
||||
osl::File foo(tempURL); // apparently it's necessary to open it again?
|
||||
foo.open(osl_File_OpenFlag_Read);
|
||||
sal_uInt64 size(0);
|
||||
foo.getSize(size);
|
||||
CPPUNIT_ASSERT(size > 1000); // check that something happened
|
||||
}
|
||||
|
||||
void XsltFilterTest::testXsltCopyOld()
|
||||
{
|
||||
OUString tempDirURL;
|
||||
osl_getTempDirURL(&tempDirURL.pData);
|
||||
oslFileHandle tempFile;
|
||||
OUString tempURL;
|
||||
osl::File::RC rc = osl::File::createTempFile(0, &tempFile, &tempURL);
|
||||
CPPUNIT_ASSERT(osl::FileBase::E_None == rc);
|
||||
|
||||
OUString source(
|
||||
getURLFromSrc("/filter/source/xsltfilter/xsltfilter.component"));
|
||||
uno::Sequence<uno::Any> args(7);
|
||||
args[0] <<= beans::NamedValue("StylesheetURL",
|
||||
uno::makeAny(getURLFromSrc("/filter/qa/cppunit/data/xslt/copy.xslt")));
|
||||
args[1] <<= beans::NamedValue("SourceURL", uno::makeAny(source));
|
||||
args[2] <<= beans::NamedValue("TargetURL", uno::makeAny(tempURL));
|
||||
args[3] <<= beans::NamedValue("SourceBaseURL",
|
||||
uno::makeAny(getURLFromSrc("/filter/source/xsltfilter/")));
|
||||
args[4] <<= beans::NamedValue("TargetBaseURL", uno::makeAny(tempDirURL));
|
||||
args[5] <<= beans::NamedValue("SystemType", uno::makeAny(OUString()));
|
||||
args[6] <<= beans::NamedValue("PublicType", uno::makeAny(OUString()));
|
||||
|
||||
|
||||
uno::Reference<ucb::XSimpleFileAccess3> xSFA =
|
||||
ucb::SimpleFileAccess::create(getComponentContext());
|
||||
|
||||
uno::Reference<io::XInputStream> xIn = xSFA->openFileRead(source);
|
||||
uno::Reference<io::XOutputStream> xOut = xSFA->openFileWrite(tempURL);
|
||||
|
||||
rtl::Reference<Listener> xListener = new Listener();
|
||||
|
||||
uno::Reference<xml::xslt::XXSLTTransformer> xXslt(
|
||||
getMultiServiceFactory()->createInstance(
|
||||
"com.sun.star.comp.documentconversion.LibXSLTTransformer"),
|
||||
uno::UNO_QUERY_THROW);
|
||||
|
||||
uno::Reference<lang::XInitialization> xInit(xXslt, uno::UNO_QUERY_THROW);
|
||||
xInit->initialize(args);
|
||||
xXslt->addListener(uno::Reference<io::XStreamListener>(xListener.get()));
|
||||
xXslt->setInputStream(xIn);
|
||||
xXslt->setOutputStream(xOut);
|
||||
|
||||
xXslt->start();
|
||||
|
||||
TimeValue delay;
|
||||
delay.Seconds = 0;
|
||||
delay.Nanosec = 1000000;
|
||||
while (!xListener->m_bDone) { osl_waitThread(&delay); }
|
||||
|
||||
xIn->closeInput();
|
||||
xOut->closeOutput();
|
||||
|
||||
osl::File foo(tempURL); // apparently it's necessary to open it again?
|
||||
foo.open(osl_File_OpenFlag_Read);
|
||||
sal_uInt64 size(0);
|
||||
foo.getSize(size);
|
||||
CPPUNIT_ASSERT(size > 1000); // check that something happened
|
||||
}
|
||||
|
||||
CPPUNIT_TEST_SUITE_REGISTRATION(XsltFilterTest);
|
||||
|
||||
}
|
||||
|
||||
CPPUNIT_PLUGIN_IMPLEMENT();
|
||||
|
||||
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|
||||
@@ -478,7 +478,10 @@ namespace XSLT
|
||||
throw (RuntimeException, std::exception)
|
||||
{
|
||||
Sequence<Any> params;
|
||||
args[0] >>= params;
|
||||
if (!(args[0] >>= params))
|
||||
{ // backward compatibility for old clients using createInstance
|
||||
params = args;
|
||||
}
|
||||
xmlSubstituteEntitiesDefault(0);
|
||||
m_parameters.clear();
|
||||
for (int i = 0; i < params.getLength(); i++)
|
||||
|
||||
Reference in New Issue
Block a user