[libreoffice] Resolves: rhbz#824035 do not bundle saxon
David Tardon
dtardon at fedoraproject.org
Fri Oct 26 07:38:49 UTC 2012
commit b1beb92031b4c04f1db8da8f4426d657d010b25b
Author: David Tardon <dtardon at redhat.com>
Date: Fri Oct 26 09:27:31 2012 +0200
Resolves: rhbz#824035 do not bundle saxon
...nvert-java-XSL-transformer-into-extension.patch | 214 ++
...lection-of-transformer-for-an-XSLT-filter.patch | 730 +++++
0003-drop-saxon-based-XSLT-transformer.patch | 3001 ++++++++++++++++++++
0004-remove-all-traces-of-saxon.patch | 1650 +++++++++++
libreoffice.spec | 21 +-
sources | 1 -
6 files changed, 5610 insertions(+), 7 deletions(-)
---
diff --git a/0001-convert-java-XSL-transformer-into-extension.patch b/0001-convert-java-XSL-transformer-into-extension.patch
new file mode 100644
index 0000000..1662751
--- /dev/null
+++ b/0001-convert-java-XSL-transformer-into-extension.patch
@@ -0,0 +1,214 @@
+From db698b1878a38c732e73bf0e5ab06368b1a5f29a Mon Sep 17 00:00:00 2001
+From: David Tardon <dtardon at redhat.com>
+Date: Wed, 19 Sep 2012 12:54:24 +0200
+Subject: [PATCH 1/4] convert java XSL transformer into extension
+
+Change-Id: Ided6c480969764073056830722c8996e0df52285
+(cherry picked from commit 25113cd050d931b0e195fda6d6da9864a575070e)
+---
+ filter/Extension_xslt2_transformer.mk | 18 +++++++++++++++++
+ filter/Module_filter.mk | 1 +
+ filter/source/xsltfilter/components.rdb | 8 ++++++++
+ filter/source/xsltfilter/description-en-US.txt | 1 +
+ filter/source/xsltfilter/description.xml | 28 ++++++++++++++++++++++++++
+ filter/source/xsltfilter/manifest.xml | 6 ++++++
+ postprocess/packcomponents/makefile.mk | 1 -
+ scp2/InstallModule_ooo.mk | 3 ---
+ scp2/source/ooo/common_brand.scp | 3 ---
+ scp2/source/ooo/file_library_ooo.scp | 1 -
+ scp2/source/ooo/file_ooo.scp | 6 ------
+ scp2/source/ooo/module_hidden_ooo.scp | 1 -
+ 12 files changed, 62 insertions(+), 15 deletions(-)
+ create mode 100644 filter/Extension_xslt2_transformer.mk
+ create mode 100644 filter/source/xsltfilter/components.rdb
+ create mode 100644 filter/source/xsltfilter/description-en-US.txt
+ create mode 100644 filter/source/xsltfilter/description.xml
+ create mode 100644 filter/source/xsltfilter/manifest.xml
+
+diff --git a/filter/Extension_xslt2_transformer.mk b/filter/Extension_xslt2_transformer.mk
+new file mode 100644
+index 0000000..ab239d8
+--- /dev/null
++++ b/filter/Extension_xslt2_transformer.mk
+@@ -0,0 +1,18 @@
++# -*- 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_Extension_Extension,xslt2-transformer,filter/source/xsltfilter))
++
++$(eval $(call gb_Extension_add_files,xslt2-transformer,,\
++ $(call gb_Jar_get_outdir_target,saxon9) \
++ $(call gb_Jar_get_outdir_target,XSLTFilter) \
++ $(SRCDIR)/filter/source/xsltfilter/components.rdb \
++))
++
++# vim: set noet sw=4 ts=4:
+diff --git a/filter/Module_filter.mk b/filter/Module_filter.mk
+index 922d4f5..9c18157 100644
+--- a/filter/Module_filter.mk
++++ b/filter/Module_filter.mk
+@@ -72,6 +72,7 @@ $(eval $(call gb_Module_add_targets,filter,\
+
+ ifneq ($(SOLAR_JAVA),)
+ $(eval $(call gb_Module_add_targets,filter,\
++ Extension_xslt2_transformer \
+ Jar_XSLTFilter \
+ Jar_XSLTValidate \
+ ))
+diff --git a/filter/source/xsltfilter/components.rdb b/filter/source/xsltfilter/components.rdb
+new file mode 100644
+index 0000000..080cb7a
+--- /dev/null
++++ b/filter/source/xsltfilter/components.rdb
+@@ -0,0 +1,8 @@
++<?xml version="1.0"?>
++<components xmlns="http://openoffice.org/2010/uno-components">
++ <component loader="com.sun.star.loader.Java2" uri="./XSLTFilter.jar">
++ <implementation name="XSLTransformer">
++ <service name="com.sun.star.comp.JAXTHelper"/>
++ </implementation>
++ </component>
++</components>
+diff --git a/filter/source/xsltfilter/description-en-US.txt b/filter/source/xsltfilter/description-en-US.txt
+new file mode 100644
+index 0000000..88c8abf
+--- /dev/null
++++ b/filter/source/xsltfilter/description-en-US.txt
+@@ -0,0 +1 @@
++The xslt2-transformer implements a transformer for XSLT import/export filters with support for XSLT 2.0.
+diff --git a/filter/source/xsltfilter/description.xml b/filter/source/xsltfilter/description.xml
+new file mode 100644
+index 0000000..ae6abcb
+--- /dev/null
++++ b/filter/source/xsltfilter/description.xml
+@@ -0,0 +1,28 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<description
++
++ xmlns="http://openoffice.org/extensions/description/2006"
++ xmlns:dep="http://libreoffice.org/extensions/description/2011"
++ xmlns:xlink="http://www.w3.org/1999/xlink">
++
++ <identifier value="org.libreoffice.JavaXSLT2Transformer"/>
++
++ <dependencies>
++ <dep:LibreOffice-minimal-version value="3.7"/>
++ </dependencies>
++
++ <version value="1.0.0"/>
++
++ <publisher>
++ <name xlink:href="http://www.documentfoundation.org" lang="en-US">The Document Foundation</name>
++ </publisher>
++
++ <display-name>
++ <name lang="en-US">XSLT 2.0 transformer</name>
++ </display-name>
++
++ <extension-description>
++ <src xlink:href="description-en-US.txt" lang="en-US" />
++ </extension-description>
++
++</description>
+diff --git a/filter/source/xsltfilter/manifest.xml b/filter/source/xsltfilter/manifest.xml
+new file mode 100644
+index 0000000..a443e65
+--- /dev/null
++++ b/filter/source/xsltfilter/manifest.xml
+@@ -0,0 +1,6 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<!DOCTYPE manifest:manifest PUBLIC "-//OpenOffice.org//DTD Manifest 1.0//EN" "Manifest.dtd">
++<manifest:manifest xmlns:manifest="http://openoffice.org/2001/manifest">
++ <manifest:file-entry manifest:media-type="application/vnd.sun.star.uno-components"
++ manifest:full-path="components.rdb"/>
++</manifest:manifest>
+diff --git a/postprocess/packcomponents/makefile.mk b/postprocess/packcomponents/makefile.mk
+index 09e296b..ccb87f0 100644
+--- a/postprocess/packcomponents/makefile.mk
++++ b/postprocess/packcomponents/makefile.mk
+@@ -288,7 +288,6 @@ my_components += component/framework/util/lomenubar
+ .IF "$(SOLAR_JAVA)" == "TRUE"
+ my_components += \
+ component/xmerge/source/bridge/XMergeBridge \
+- component/filter/source/xsltfilter/XSLTFilter.jar \
+ component/filter/source/xsltvalidate/XSLTValidate \
+ component/scripting/java/ScriptFramework \
+ component/scripting/java/ScriptProviderForJava \
+diff --git a/scp2/InstallModule_ooo.mk b/scp2/InstallModule_ooo.mk
+index 0c49414..640ea3a 100644
+--- a/scp2/InstallModule_ooo.mk
++++ b/scp2/InstallModule_ooo.mk
+@@ -158,9 +158,6 @@ $(eval $(call gb_InstallModule_add_defs,scp2/ooo,\
+ $(if $(filter YES,$(SYSTEM_HSQLDB)),\
+ -DHSQLDB_JAR=\""$(call gb_Helper_make_path,$(HSQLDB_JAR))"\" \
+ ) \
+- $(if $(filter YES,$(SYSTEM_SAXON)),\
+- -DSAXON_JAR=\""$(call gb_Helper_make_path,$(SAXON_JAR))"\" \
+- ) \
+ $(if $(filter-out YES,$(WITH_MOZILLA)),\
+ -DWITHOUT_MOZILLA \
+ ) \
+diff --git a/scp2/source/ooo/common_brand.scp b/scp2/source/ooo/common_brand.scp
+index 997a142..83c5c21 100644
+--- a/scp2/source/ooo/common_brand.scp
++++ b/scp2/source/ooo/common_brand.scp
+@@ -1259,9 +1259,6 @@ ProfileItem gid_Brand_Profileitem_Fundamental_Ure_Java_Classpath_Urls
+ #ifdef SYSTEM_HSQLDB
+ ValueList1 = HSQLDB_JAR;
+ #endif
+-#ifdef SYSTEM_SAXON
+- ValueList2 = SAXON_JAR;
+-#endif
+ End
+
+ ProfileItem gid_Brand_Profileitem_Fundamental_Ure_Bin_Dir
+diff --git a/scp2/source/ooo/file_library_ooo.scp b/scp2/source/ooo/file_library_ooo.scp
+index 66c50e2..f3448e5 100644
+--- a/scp2/source/ooo/file_library_ooo.scp
++++ b/scp2/source/ooo/file_library_ooo.scp
+@@ -1382,7 +1382,6 @@ STD_LIB_FILE( gid_File_Lib_Textfd, textfd )
+ STD_LIB_FILE( gid_File_Lib_Odfflatxml, odfflatxml )
+
+ #ifdef SOLAR_JAVA
+-STD_JAR_FILE( gid_File_Jar_Xsltfilter, XSLTFilter )
+ STD_JAR_FILE( gid_File_Jar_Xsltvalidate, XSLTValidate )
+ #endif
+
+diff --git a/scp2/source/ooo/file_ooo.scp b/scp2/source/ooo/file_ooo.scp
+index ebdcf25..e274fc3 100644
+--- a/scp2/source/ooo/file_ooo.scp
++++ b/scp2/source/ooo/file_ooo.scp
+@@ -469,12 +469,6 @@ End
+
+ #endif
+
+-#ifdef SOLAR_JAVA
+-#ifndef SYSTEM_SAXON
+-STD_JAR_FILE( gid_File_Jar_Saxon, saxon9 )
+-#endif
+-#endif
+-
+ #ifndef AIX
+ #ifndef DISABLE_PYUNO
+
+diff --git a/scp2/source/ooo/module_hidden_ooo.scp b/scp2/source/ooo/module_hidden_ooo.scp
+index 76e062b..e00a38b 100644
+--- a/scp2/source/ooo/module_hidden_ooo.scp
++++ b/scp2/source/ooo/module_hidden_ooo.scp
+@@ -129,7 +129,6 @@ Module gid_Module_Root_Files_3
+ Default = YES;
+ Styles = (HIDDEN_ROOT);
+ Files = (gid_File_Dat_Root3,
+- gid_File_Jar_Saxon,
+ gid_File_Jar_Unoil,
+ gid_File_Jar_Hsqldb,
+ gid_File_Jar_Hsqldb_Sdbc,
+--
+1.7.11.7
+
diff --git a/0002-rework-selection-of-transformer-for-an-XSLT-filter.patch b/0002-rework-selection-of-transformer-for-an-XSLT-filter.patch
new file mode 100644
index 0000000..3ddfbf4
--- /dev/null
+++ b/0002-rework-selection-of-transformer-for-an-XSLT-filter.patch
@@ -0,0 +1,730 @@
+From f05438dda954965651f332b2f7ee97dbdd951b98 Mon Sep 17 00:00:00 2001
+From: David Tardon <dtardon at redhat.com>
+Date: Thu, 20 Sep 2012 10:28:56 +0200
+Subject: [PATCH 2/4] rework selection of transformer for an XSLT filter
+
+(cherry picked from commit ca0ea73a4ab104031a16b5bac7a9bb6e57c77ba0)
+
+Conflicts:
+ filter/source/xsltdialog/xmlfiltersettingsdialog.cxx
+
+Change-Id: I765762f11813c6b612416a8db2707bf94114c876
+---
+ filter/source/xsltdialog/typedetectionexport.cxx | 2 +-
+ filter/source/xsltdialog/typedetectionimport.cxx | 2 +-
+ filter/source/xsltdialog/xmlfiltercommon.hxx | 2 +-
+ filter/source/xsltdialog/xmlfilterhelpids.hrc | 3 +-
+ .../source/xsltdialog/xmlfiltersettingsdialog.cxx | 19 ++----
+ filter/source/xsltdialog/xmlfiltertabpagexslt.cxx | 20 ++-----
+ filter/source/xsltdialog/xmlfiltertabpagexslt.hrc | 5 +-
+ filter/source/xsltdialog/xmlfiltertabpagexslt.hxx | 5 +-
+ filter/source/xsltdialog/xmlfiltertabpagexslt.src | 23 +++----
+ filter/source/xsltfilter/LibXSLTTransformer.cxx | 4 +-
+ filter/source/xsltfilter/LibXSLTTransformer.hxx | 18 +++---
+ filter/source/xsltfilter/XSLTFilter.cxx | 70 +++++++++++++++-------
+ .../sun/star/comp/xsltfilter/XSLTransformer.java | 13 ++--
+ filter/source/xsltfilter/components.rdb | 4 +-
+ filter/source/xsltfilter/xsltfilter.component | 2 +-
+ offapi/UnoApi_offapi.mk | 9 +++
+ offapi/com/sun/star/xml/xslt/XSLT2Transformer.idl | 30 ++++++++++
+ offapi/com/sun/star/xml/xslt/XSLTTransformer.idl | 32 ++++++++++
+ offapi/com/sun/star/xml/xslt/XXSLTTransformer.idl | 36 +++++++++++
+ 19 files changed, 204 insertions(+), 95 deletions(-)
+ create mode 100644 offapi/com/sun/star/xml/xslt/XSLT2Transformer.idl
+ create mode 100644 offapi/com/sun/star/xml/xslt/XSLTTransformer.idl
+ create mode 100644 offapi/com/sun/star/xml/xslt/XXSLTTransformer.idl
+
+diff --git a/filter/source/xsltdialog/typedetectionexport.cxx b/filter/source/xsltdialog/typedetectionexport.cxx
+index a01b462..83bf7fa 100644
+--- a/filter/source/xsltdialog/typedetectionexport.cxx
++++ b/filter/source/xsltdialog/typedetectionexport.cxx
+@@ -192,7 +192,7 @@ void TypeDetectionExporter::doExport( Reference< XOutputStream > xOS, const XML
+ sValue += sComma;
+ sValue += sXSLTFilterService;
+ sValue += sDelim;
+- sValue += pFilter->maXSLTTransformerImpl;
++ sValue += OUString::valueOf( pFilter->mbNeedsXSLT2 );
+ sValue += sDelim;
+
+ const application_info_impl* pAppInfo = getApplicationInfo( pFilter->maExportService );
+diff --git a/filter/source/xsltdialog/typedetectionimport.cxx b/filter/source/xsltdialog/typedetectionimport.cxx
+index 3d3b937..50428e7 100644
+--- a/filter/source/xsltdialog/typedetectionimport.cxx
++++ b/filter/source/xsltdialog/typedetectionimport.cxx
+@@ -180,7 +180,7 @@ filter_info_impl* TypeDetectionImporter::createFilterForNode( Node * pNode )
+
+ OUString aAdapterService( getSubdata( 0, aDelim, aFilterUserData ) );
+ //Import/ExportService
+- pFilter->maXSLTTransformerImpl = getSubdata( 1, aDelim, aFilterUserData );
++ pFilter->mbNeedsXSLT2 = getSubdata( 1, aDelim, aFilterUserData ).toBoolean();
+ pFilter->maImportService = getSubdata( 2, aDelim, aFilterUserData );
+ pFilter->maExportService = getSubdata( 3, aDelim, aFilterUserData );
+ pFilter->maImportXSLT = getSubdata( 4, aDelim, aFilterUserData );
+diff --git a/filter/source/xsltdialog/xmlfiltercommon.hxx b/filter/source/xsltdialog/xmlfiltercommon.hxx
+index cdb767e..41be2c7 100644
+--- a/filter/source/xsltdialog/xmlfiltercommon.hxx
++++ b/filter/source/xsltdialog/xmlfiltercommon.hxx
+@@ -77,7 +77,7 @@ public:
+
+ sal_Bool mbReadonly;
+
+- rtl::OUString maXSLTTransformerImpl;
++ sal_Bool mbNeedsXSLT2;
+
+ filter_info_impl();
+ filter_info_impl( const filter_info_impl& rInfo );
+diff --git a/filter/source/xsltdialog/xmlfilterhelpids.hrc b/filter/source/xsltdialog/xmlfilterhelpids.hrc
+index 558a274..a22fa52 100644
+--- a/filter/source/xsltdialog/xmlfilterhelpids.hrc
++++ b/filter/source/xsltdialog/xmlfilterhelpids.hrc
+@@ -50,8 +50,7 @@
+ #define HID_XML_FILTER_DOCTYPE "FILTER_HID_XML_FILTER_DOCTYPE"
+ #define HID_XML_FILTER_DTD "FILTER_HID_XML_FILTER_DTD"
+ #define HID_XML_FILTER_DTD_BROWSE "FILTER_HID_XML_FILTER_DTD_BROWSE"
+-#define HID_XML_FILTER_TRANSFORM_SERVICE_SAXON_J "FILTER_HID_XML_FILTER_TRANSFORM_SERVICE_SAXON_J"
+-#define HID_XML_FILTER_TRANSFORM_SERVICE_LIBXSLT "FILTER_HID_XML_FILTER_TRANSFORM_SERVICE_LIBXSLT"
++#define HID_XML_FILTER_NEEDS_XSLT2 "FILTER_HID_XML_FILTER_NEEDS_XSLT2"
+ #define HID_XML_FILTER_EXPORT_XSLT "FILTER_HID_XML_FILTER_EXPORT_XSLT"
+ #define HID_XML_FILTER_EXPORT_XSLT_BROWSE "FILTER_HID_XML_FILTER_EXPORT_XSLT_BROWSE"
+ #define HID_XML_FILTER_IMPORT_XSLT "FILTER_HID_XML_FILTER_IMPORT_XSLT"
+diff --git a/filter/source/xsltdialog/xmlfiltersettingsdialog.cxx b/filter/source/xsltdialog/xmlfiltersettingsdialog.cxx
+index 558ac0d..a54b520 100644
+--- a/filter/source/xsltdialog/xmlfiltersettingsdialog.cxx
++++ b/filter/source/xsltdialog/xmlfiltersettingsdialog.cxx
+@@ -1164,7 +1164,7 @@ void XMLFilterSettingsDialog::initFilterList()
+ continue;
+
+ // get filter information from userdata
+- pTempFilter->maXSLTTransformerImpl = aUserData[1];
++ pTempFilter->mbNeedsXSLT2 = aUserData[1].toBoolean();
+ pTempFilter->maImportService = aUserData[2];
+ pTempFilter->maExportService = aUserData[3];
+ pTempFilter->maImportXSLT = aUserData[4];
+@@ -1590,7 +1590,8 @@ filter_info_impl::filter_info_impl()
+ : maFlags(0x00080040),
+ maFileFormatVersion(0),
+ mnDocumentIconID(0),
+- mbReadonly(sal_False)
++ mbReadonly(sal_False),
++ mbNeedsXSLT2(sal_False)
+ {
+ }
+
+@@ -1615,7 +1616,7 @@ filter_info_impl::filter_info_impl( const filter_info_impl& rInfo ) :
+ maFileFormatVersion( rInfo.maFileFormatVersion ),
+ mnDocumentIconID( rInfo.mnDocumentIconID ),
+ mbReadonly( rInfo.mbReadonly ),
+- maXSLTTransformerImpl( rInfo.maXSLTTransformerImpl )
++ mbNeedsXSLT2( rInfo.mbNeedsXSLT2 )
+ {
+ }
+
+@@ -1639,7 +1640,7 @@ int filter_info_impl::operator==( const filter_info_impl& r ) const
+ maImportTemplate != r.maImportTemplate ||
+ maFlags != r.maFlags ||
+ maFileFormatVersion != r.maFileFormatVersion ||
+- maXSLTTransformerImpl != r.maXSLTTransformerImpl
++ mbNeedsXSLT2 != r.mbNeedsXSLT2
+ )
+ return false;
+
+@@ -1653,15 +1654,7 @@ Sequence< OUString > filter_info_impl::getFilterUserData() const
+ Sequence< OUString > aUserData(8);
+
+ aUserData[0] = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.documentconversion.XSLTFilter" ) );
+- /*
+- const application_info_impl* pInfo = getApplicationInfo( maDocumentService );
+- if( pInfo )
+- {
+- aUserData[2] = pInfo->maXMLImporter;
+- aUserData[3] = pInfo->maXMLExporter;
+- }
+- */
+- aUserData[1] = maXSLTTransformerImpl;
++ aUserData[1] = OUString::valueOf( mbNeedsXSLT2 );
+ aUserData[2] = maImportService;
+ aUserData[3] = maExportService;
+ aUserData[4] = maImportXSLT;
+diff --git a/filter/source/xsltdialog/xmlfiltertabpagexslt.cxx b/filter/source/xsltdialog/xmlfiltertabpagexslt.cxx
+index dc1a4c8..b4cae16 100644
+--- a/filter/source/xsltdialog/xmlfiltertabpagexslt.cxx
++++ b/filter/source/xsltdialog/xmlfiltertabpagexslt.cxx
+@@ -68,9 +68,8 @@ XMLFilterTabPageXSLT::XMLFilterTabPageXSLT( Window* pParent, ResMgr& rResMgr, co
+ maEDImportTemplate( this, ResId( ED_XML_IMPORT_TEMPLATE, rResMgr ), INET_PROT_FILE ),
+ maPBImportTemplate( this, ResId( PB_XML_IMPORT_TEMPLATE_BROWSE, rResMgr ) ),
+
+- maFTTransformationService( this, ResId (FT_XML_TRANSFORM_SERVICE, rResMgr ) ),
+- maRBTransformationServiceLibXSLT( this, ResId (RB_XML_TRANSFORM_SERVICE_LIBXSLT, rResMgr ) ),
+- maRBTransformationServiceSaxonJ( this, ResId (RB_XML_TRANSFORM_SERVICE_SAXON_J, rResMgr ) ),
++ maFTNeedsXSLT2( this, ResId (FT_XML_NEEDS_XSLT2, rResMgr ) ),
++ maCBNeedsXSLT2( this, ResId (CB_XML_NEEDS_XSLT2, rResMgr ) ),
+
+ sHTTPSchema( RTL_CONSTASCII_USTRINGPARAM( "http://" ) ),
+ sSHTTPSchema( RTL_CONSTASCII_USTRINGPARAM( "shttp://" ) ),
+@@ -100,8 +99,7 @@ XMLFilterTabPageXSLT::XMLFilterTabPageXSLT( Window* pParent, ResMgr& rResMgr, co
+ maEDExportXSLT.SetHelpId( HID_XML_FILTER_EXPORT_XSLT );
+ maEDImportXSLT.SetHelpId( HID_XML_FILTER_IMPORT_XSLT );
+ maEDImportTemplate.SetHelpId( HID_XML_FILTER_IMPORT_TEMPLATE );
+- maRBTransformationServiceLibXSLT.SetHelpId( HID_XML_FILTER_TRANSFORM_SERVICE_LIBXSLT );
+- maRBTransformationServiceSaxonJ.SetHelpId( HID_XML_FILTER_TRANSFORM_SERVICE_SAXON_J );
++ maCBNeedsXSLT2.SetHelpId( HID_XML_FILTER_NEEDS_XSLT2 );
+ }
+
+ XMLFilterTabPageXSLT::~XMLFilterTabPageXSLT()
+@@ -117,10 +115,7 @@ bool XMLFilterTabPageXSLT::FillInfo( filter_info_impl* pInfo )
+ pInfo->maExportXSLT = GetURL( maEDExportXSLT );
+ pInfo->maImportXSLT = GetURL( maEDImportXSLT );
+ pInfo->maImportTemplate = GetURL( maEDImportTemplate );
+- pInfo->maXSLTTransformerImpl
+- = maRBTransformationServiceSaxonJ.IsChecked() ? OUString(
+- RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.JAXTHelper" ))
+- : OUString(RTL_CONSTASCII_USTRINGPARAM( "" ));
++ pInfo->mbNeedsXSLT2 = maCBNeedsXSLT2.IsChecked();
+ }
+
+ return true;
+@@ -136,12 +131,7 @@ void XMLFilterTabPageXSLT::SetInfo(const filter_info_impl* pInfo)
+ SetURL( maEDExportXSLT, pInfo->maExportXSLT );
+ SetURL( maEDImportXSLT, pInfo->maImportXSLT );
+ SetURL( maEDImportTemplate, pInfo->maImportTemplate );
+- if (pInfo->maXSLTTransformerImpl.equals(OUString(
+- RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.JAXTHelper" )))) {
+- maRBTransformationServiceSaxonJ.Check();
+- } else {
+- maRBTransformationServiceLibXSLT.Check();
+- }
++ maCBNeedsXSLT2.Check( pInfo->mbNeedsXSLT2 );
+ }
+ }
+
+diff --git a/filter/source/xsltdialog/xmlfiltertabpagexslt.hrc b/filter/source/xsltdialog/xmlfiltertabpagexslt.hrc
+index 12a9d46..bdd39e7 100644
+--- a/filter/source/xsltdialog/xmlfiltertabpagexslt.hrc
++++ b/filter/source/xsltdialog/xmlfiltertabpagexslt.hrc
+@@ -44,8 +44,7 @@
+ #define FT_XML_IMPORT_TEMPLATE 12
+ #define ED_XML_IMPORT_TEMPLATE 13
+ #define PB_XML_IMPORT_TEMPLATE_BROWSE 14
+-#define FT_XML_TRANSFORM_SERVICE 15
+-#define RB_XML_TRANSFORM_SERVICE_LIBXSLT 16
+-#define RB_XML_TRANSFORM_SERVICE_SAXON_J 17
++#define FT_XML_NEEDS_XSLT2 15
++#define CB_XML_NEEDS_XSLT2 16
+
+ #endif
+diff --git a/filter/source/xsltdialog/xmlfiltertabpagexslt.hxx b/filter/source/xsltdialog/xmlfiltertabpagexslt.hxx
+index a9d8062..a0375b7 100644
+--- a/filter/source/xsltdialog/xmlfiltertabpagexslt.hxx
++++ b/filter/source/xsltdialog/xmlfiltertabpagexslt.hxx
+@@ -69,9 +69,8 @@ public:
+ SvtURLBox maEDImportTemplate;
+ PushButton maPBImportTemplate;
+
+- FixedText maFTTransformationService;
+- RadioButton maRBTransformationServiceLibXSLT;
+- RadioButton maRBTransformationServiceSaxonJ;
++ FixedText maFTNeedsXSLT2;
++ CheckBox maCBNeedsXSLT2;
+
+ private:
+ void SetURL( SvtURLBox& rURLBox, const rtl::OUString& rURL );
+diff --git a/filter/source/xsltdialog/xmlfiltertabpagexslt.src b/filter/source/xsltdialog/xmlfiltertabpagexslt.src
+index 2d0391c..96b83f7 100644
+--- a/filter/source/xsltdialog/xmlfiltertabpagexslt.src
++++ b/filter/source/xsltdialog/xmlfiltertabpagexslt.src
+@@ -175,27 +175,18 @@ TabPage RID_XML_FILTER_TABPAGE_XSLT
+
+ // XSLT transformation service --------------------------------------------------------
+
+- FixedText FT_XML_TRANSFORM_SERVICE
++ CheckBox CB_XML_NEEDS_XSLT2
+ {
++ HelpID = HID_XML_FILTER_NEEDS_XSLT2;
+ Pos = MAP_APPFONT ( FIRST_ROW_X , FIRST_ROW_Y + 5 * ROW_HEIGHT + 5 * SPACING + FIXED_TEXT_OFFSET + EDIT_OFFSET ) ;
+- Size = MAP_APPFONT ( FIRST_ROW_WIDTH , 8 ) ;
+- Text [ en-US ] = "XSLT Transformation Service";
+- };
+-
+- RadioButton RB_XML_TRANSFORM_SERVICE_LIBXSLT
+- {
+- HelpID = HID_XML_FILTER_TRANSFORM_SERVICE_LIBXSLT;
+- Pos = MAP_APPFONT ( SECOND_ROW_X , SECOND_ROW_Y + 5 * ROW_HEIGHT + 5 * SPACING + EDIT_OFFSET ) ;
+- Size = MAP_APPFONT ( SECOND_ROW_WIDTH - SPACING - BROWSE_WIDTH, 12 ) ;
+- Text[ en-US ] = "~Builtin (LibXSLT)";
++ Size = MAP_APPFONT ( 12, 12 ) ;
+ };
+
+- RadioButton RB_XML_TRANSFORM_SERVICE_SAXON_J
++ FixedText FT_XML_NEEDS_XSLT2
+ {
+- HelpID = HID_XML_FILTER_TRANSFORM_SERVICE_SAXON_J;
+- Pos = MAP_APPFONT ( SECOND_ROW_X , SECOND_ROW_Y + 6 * ROW_HEIGHT + 6 * SPACING + EDIT_OFFSET ) ;
+- Size = MAP_APPFONT ( SECOND_ROW_WIDTH - SPACING - BROWSE_WIDTH, 12 ) ;
+- Text[ en-US ] = "~Saxon/J";
++ Pos = MAP_APPFONT ( FIRST_ROW_X + 3 * SPACING , SECOND_ROW_Y + 5 * ROW_HEIGHT + 5 * SPACING + FIXED_TEXT_OFFSET + EDIT_OFFSET ) ;
++ Size = MAP_APPFONT ( 2 * FIRST_ROW_WIDTH , 8 ) ; // guess width
++ Text [ en-US ] = "The filter needs XSLT 2.0 processor";
+ };
+
+ };
+diff --git a/filter/source/xsltfilter/LibXSLTTransformer.cxx b/filter/source/xsltfilter/LibXSLTTransformer.cxx
+index ff57fc1..ab03316 100644
+--- a/filter/source/xsltfilter/LibXSLTTransformer.cxx
++++ b/filter/source/xsltfilter/LibXSLTTransformer.cxx
+@@ -488,9 +488,11 @@ namespace XSLT
+ }
+
+ void
+- LibXSLTTransformer::initialize(const Sequence<Any>& params)
++ LibXSLTTransformer::initialize(const Sequence<Any>& args)
+ throw (RuntimeException)
+ {
++ Sequence<Any> params;
++ args[0] >>= params;
+ xmlSubstituteEntitiesDefault(0);
+ m_parameters.clear();
+ for (int i = 0; i < params.getLength(); i++)
+diff --git a/filter/source/xsltfilter/LibXSLTTransformer.hxx b/filter/source/xsltfilter/LibXSLTTransformer.hxx
+index 444cb2f..a7c71a6 100644
+--- a/filter/source/xsltfilter/LibXSLTTransformer.hxx
++++ b/filter/source/xsltfilter/LibXSLTTransformer.hxx
+@@ -42,7 +42,7 @@
+
+ #include <cppuhelper/factory.hxx>
+ #include <cppuhelper/servicefactory.hxx>
+-#include <cppuhelper/implbase4.hxx>
++#include <cppuhelper/implbase1.hxx>
+ #include <cppuhelper/implbase.hxx>
+
+ #include <rtl/ref.hxx>
+@@ -51,14 +51,12 @@
+
+ #include <com/sun/star/uno/Any.hxx>
+
++#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+ #include <com/sun/star/io/XInputStream.hpp>
+ #include <com/sun/star/io/XOutputStream.hpp>
+-#include <com/sun/star/io/XActiveDataSource.hpp>
+-#include <com/sun/star/io/XActiveDataSink.hpp>
+-#include <com/sun/star/io/XActiveDataControl.hpp>
+ #include <com/sun/star/io/XStreamListener.hpp>
+-#include <com/sun/star/lang/XInitialization.hpp>
+ #include <com/sun/star/beans/NamedValue.hpp>
++#include <com/sun/star/xml/xslt/XXSLTTransformer.hpp>
+
+ using namespace ::rtl;
+ using namespace ::cppu;
+@@ -66,7 +64,6 @@ using namespace ::osl;
+ using namespace ::com::sun::star::beans;
+ using namespace ::com::sun::star::io;
+ using namespace ::com::sun::star::uno;
+-using namespace ::com::sun::star::lang;
+
+ using ::std::list;
+ using ::std::map;
+@@ -90,8 +87,7 @@ namespace XSLT
+ *
+ * See Reader below.
+ */
+- class LibXSLTTransformer : public WeakImplHelper4<XActiveDataSink,
+- XActiveDataSource, XActiveDataControl, XInitialization>
++ class LibXSLTTransformer : public WeakImplHelper1<com::sun::star::xml::xslt::XXSLTTransformer>
+ {
+ private:
+ static const char* const PARAM_SOURCE_URL;
+@@ -102,7 +98,7 @@ namespace XSLT
+ static const char* const PARAM_DOCTYPE_PUBLIC;
+
+ // the UNO ServiceFactory
+- com::sun::star::uno::Reference<XMultiServiceFactory> m_rServiceFactory;
++ com::sun::star::uno::Reference<com::sun::star::lang::XMultiServiceFactory> m_rServiceFactory;
+
+ com::sun::star::uno::Reference<XInputStream> m_rInputStream;
+
+@@ -129,7 +125,7 @@ namespace XSLT
+ public:
+
+ // ctor...
+- LibXSLTTransformer(const com::sun::star::uno::Reference<XMultiServiceFactory> &r);
++ LibXSLTTransformer(const com::sun::star::uno::Reference<com::sun::star::lang::XMultiServiceFactory> &r);
+
+ // XActiveDataSink
+ virtual void SAL_CALL
+@@ -169,7 +165,7 @@ namespace XSLT
+ ::std::map<const char*, OString> SAL_CALL
+ getParameters();
+
+- virtual com::sun::star::uno::Reference<XMultiServiceFactory> SAL_CALL
++ virtual com::sun::star::uno::Reference<com::sun::star::lang::XMultiServiceFactory> SAL_CALL
+ getServiceFactory() {
+ return m_rServiceFactory;
+ }
+diff --git a/filter/source/xsltfilter/XSLTFilter.cxx b/filter/source/xsltfilter/XSLTFilter.cxx
+index f3ebd2f..36968e7 100644
+--- a/filter/source/xsltfilter/XSLTFilter.cxx
++++ b/filter/source/xsltfilter/XSLTFilter.cxx
+@@ -41,6 +41,7 @@
+ #include <rtl/strbuf.hxx>
+ #include <tools/urlobj.hxx>
+
++#include <comphelper/componentcontext.hxx>
+ #include <comphelper/interaction.hxx>
+
+ #include <com/sun/star/lang/XComponent.hpp>
+@@ -72,6 +73,8 @@
+ #include <com/sun/star/task/XInteractionHandler.hpp>
+ #include <com/sun/star/task/XInteractionRequest.hpp>
+ #include <com/sun/star/ucb/InteractiveAugmentedIOException.hpp>
++#include <com/sun/star/xml/xslt/XSLT2Transformer.hpp>
++#include <com/sun/star/xml/xslt/XSLTTransformer.hpp>
+
+ #include <xmloff/attrlist.hxx>
+
+@@ -102,14 +105,10 @@ namespace XSLT
+ * them to an XSLT transformation service. XSLT transformation errors are
+ * reported to XSLTFilter.
+ *
+- * Currently, two implementations for the XSLT transformation service exist:
+- * a java based service (see XSLTransformer.java) and a libxslt based
+- * service (LibXSLTTransformer.cxx).
+- *
+- * The libxslt implementation will be used by default.
+- *
+- * If the value of the 2nd "UserData" parameter of the filter configuration is
+- * not empty, the service name given there will be used.
++ * Currently, our transformation service is libxslt based, so it
++ * only supports XSLT 1.0. There is a possibility to use XSLT 2.0
++ * supporting service from an extension for a specific filter; the
++ * service must support com.sun.star.xml.xslt.XSLT2Transformer.
+ */
+ class XSLTFilter : public WeakImplHelper4<XImportFilter, XExportFilter,
+ XStreamListener, ExtendedDocumentHandlerAdapter>
+@@ -122,7 +121,7 @@ namespace XSLT
+ // DocumentHandler interface of the css::xml::sax::Writer service
+ css::uno::Reference<XOutputStream> m_rOutputStream;
+
+- css::uno::Reference<XActiveDataControl> m_tcontrol;
++ css::uno::Reference<xslt::XXSLTTransformer> m_tcontrol;
+
+ oslCondition m_cTransformed;
+ sal_Bool m_bTerminated;
+@@ -135,6 +134,8 @@ namespace XSLT
+ OUString
+ expandUrl(const OUString&);
+
++ css::uno::Reference<xslt::XXSLTTransformer> impl_createTransformer(const rtl::OUString& rTransformer, const Sequence<Any>& rArgs);
++
+ public:
+
+ // ctor...
+@@ -211,6 +212,43 @@ m_rServiceFactory(r), m_bTerminated(sal_False), m_bError(sal_False)
+ return sExpandedUrl;
+ }
+
++ css::uno::Reference<xslt::XXSLTTransformer>
++ XSLTFilter::impl_createTransformer(const rtl::OUString& rTransformer, const Sequence<Any>& rArgs)
++ {
++ css::uno::Reference<xslt::XXSLTTransformer> xTransformer;
++
++ // check if the filter needs XSLT-2.0-capable transformer
++ // COMPATIBILITY: libreoffice 3.5/3.6 used to save the impl.
++ // name of the XSLT 2.0 transformation service there, so check
++ // for that too (it is sufficient to check that there is _a_
++ // service name there)
++ if (rTransformer.toBoolean() || rTransformer.match("com.sun."))
++ {
++ try
++ {
++ xTransformer = xslt::XSLT2Transformer::create(
++ comphelper::ComponentContext(m_rServiceFactory).getUNOContext(), rArgs);
++ }
++ catch (const Exception&)
++ {
++ // TODO: put a dialog telling about the need to install
++ // xslt2-transformer extension here
++ SAL_WARN("filter.xslt", "could not create XSLT 2.0 transformer");
++ throw;
++ }
++ }
++
++ // instantiation of XSLT 2.0 transformer service failed, or the
++ // filter does not need it
++ if (!xTransformer.is())
++ {
++ xTransformer = xslt::XSLTTransformer::create(
++ comphelper::ComponentContext(m_rServiceFactory).getUNOContext(), rArgs);
++ }
++
++ return xTransformer;
++ }
++
+ void
+ XSLTFilter::started() throw (RuntimeException)
+ {
+@@ -322,11 +360,7 @@ m_rServiceFactory(r), m_bTerminated(sal_False), m_bError(sal_False)
+ nv.Value <<= OUString(INetURLObject(aURL).getBase());
+ args[2] <<= nv;
+
+- OUString serviceName("com.sun.star.comp.documentconversion.LibXSLTTransformer");
+- if (!msUserData[1].isEmpty())
+- serviceName = msUserData[1];
+-
+- m_tcontrol = css::uno::Reference<XActiveDataControl> (m_rServiceFactory->createInstanceWithArguments(serviceName, args), UNO_QUERY);
++ m_tcontrol = impl_createTransformer(msUserData[1], args);
+
+ OSL_ASSERT(xHandler.is());
+ OSL_ASSERT(xInputStream.is());
+@@ -486,11 +520,7 @@ m_rServiceFactory(r), m_bTerminated(sal_False), m_bError(sal_False)
+ nv.Value <<= m_aExportBaseUrl;
+ args[3] <<= nv;
+
+- OUString serviceName("com.sun.star.comp.documentconversion.LibXSLTTransformer");
+- if (!msUserData[1].isEmpty())
+- serviceName = msUserData[1];
+-
+- m_tcontrol = css::uno::Reference<XActiveDataControl> (m_rServiceFactory->createInstanceWithArguments(serviceName, args), UNO_QUERY);
++ m_tcontrol = impl_createTransformer(msUserData[1], args);
+
+ OSL_ASSERT(m_rOutputStream.is());
+ OSL_ASSERT(m_tcontrol.is());
+@@ -566,7 +596,7 @@ m_rServiceFactory(r), m_bTerminated(sal_False), m_bError(sal_False)
+ // --------------------------------------
+ #define FILTER_SERVICE_NAME "com.sun.star.documentconversion.XSLTFilter"
+ #define FILTER_IMPL_NAME "com.sun.star.comp.documentconversion.XSLTFilter"
+-#define TRANSFORMER_SERVICE_NAME "com.sun.star.documentconversion.LibXSLTTransformer"
++#define TRANSFORMER_SERVICE_NAME "com.sun.star.xml.xslt.XSLTTransformer"
+ #define TRANSFORMER_IMPL_NAME "com.sun.star.comp.documentconversion.LibXSLTTransformer"
+
+ static css::uno::Reference<XInterface> SAL_CALL
+diff --git a/filter/source/xsltfilter/com/sun/star/comp/xsltfilter/XSLTransformer.java b/filter/source/xsltfilter/com/sun/star/comp/xsltfilter/XSLTransformer.java
+index 1a6d8cf..7036646 100644
+--- a/filter/source/xsltfilter/com/sun/star/comp/xsltfilter/XSLTransformer.java
++++ b/filter/source/xsltfilter/com/sun/star/comp/xsltfilter/XSLTransformer.java
+@@ -75,6 +75,7 @@ import com.sun.star.registry.XRegistryKey;
+ import com.sun.star.uno.AnyConverter;
+ import com.sun.star.uno.Type;
+ import com.sun.star.uno.UnoRuntime;
++import com.sun.star.xml.xslt.XXSLTTransformer;
+
+ //Uno to java Adaptor
+ import com.sun.star.lib.uno.adapter.XInputStreamToInputStreamAdapter;
+@@ -88,8 +89,8 @@ import net.sf.saxon.FeatureKeys;
+ * component on demand (__getServiceFactory()).
+ */
+ public class XSLTransformer
+- implements XTypeProvider, XServiceName, XServiceInfo, XActiveDataSink,
+- XActiveDataSource, XActiveDataControl, XInitialization, URIResolver, EntityResolver {
++ implements XTypeProvider, XServiceName, XServiceInfo, XXSLTTransformer,
++ URIResolver, EntityResolver {
+
+ /**
+ * This component provides java based XSL transformations
+@@ -132,7 +133,7 @@ public class XSLTransformer
+ svcfactory = msf;
+ }
+
+- public void initialize(Object[] values) throws com.sun.star.uno.Exception {
++ public void initialize(Object[] args) throws com.sun.star.uno.Exception {
+ // some configurable debugging
+ String statsfilepath = null;
+ if ((statsfilepath = System.getProperty(STATSPROP)) != null) {
+@@ -146,6 +147,8 @@ public class XSLTransformer
+ }
+ }
+
++ Object[] values = (Object[]) args[0];
++
+ // reading the values
+ NamedValue nv = null;
+ debug("The transformation's parameters as 'name = value' pairs:\n");
+@@ -444,7 +447,7 @@ public class XSLTransformer
+ }
+ }
+ } // --- component management interfaces... ---
+- private final static String _serviceName = "com.sun.star.comp.JAXTHelper";
++ private final static String _serviceName = "com.sun.star.xml.xslt.XSLT2Transformer";
+
+ // Implement methods from interface XTypeProvider
+ public byte[] getImplementationId() {
+@@ -494,7 +497,7 @@ public class XSLTransformer
+ public static XSingleServiceFactory __getServiceFactory(
+ String implName, XMultiServiceFactory multiFactory, XRegistryKey regKey) {
+ XSingleServiceFactory xSingleServiceFactory = null;
+- if (implName.indexOf("XSLTransformer") != -1) {
++ if (implName.equals(XSLTransformer.class.getName())) {
+ xSingleServiceFactory = FactoryHelper.getServiceFactory(XSLTransformer.class,
+ _serviceName, multiFactory, regKey);
+ }
+diff --git a/filter/source/xsltfilter/components.rdb b/filter/source/xsltfilter/components.rdb
+index 080cb7a..6014b82 100644
+--- a/filter/source/xsltfilter/components.rdb
++++ b/filter/source/xsltfilter/components.rdb
+@@ -1,8 +1,8 @@
+ <?xml version="1.0"?>
+ <components xmlns="http://openoffice.org/2010/uno-components">
+ <component loader="com.sun.star.loader.Java2" uri="./XSLTFilter.jar">
+- <implementation name="XSLTransformer">
+- <service name="com.sun.star.comp.JAXTHelper"/>
++ <implementation name="com.sun.star.comp.xsltfilter.XSLTransformer">
++ <service name="com.sun.star.xml.xslt.XSLT2Transformer"/>
+ </implementation>
+ </component>
+ </components>
+diff --git a/filter/source/xsltfilter/xsltfilter.component b/filter/source/xsltfilter/xsltfilter.component
+index 5fb985c..296f2bc 100644
+--- a/filter/source/xsltfilter/xsltfilter.component
++++ b/filter/source/xsltfilter/xsltfilter.component
+@@ -32,6 +32,6 @@
+ <service name="com.sun.star.documentconversion.XSLTFilter"/>
+ </implementation>
+ <implementation name="com.sun.star.comp.documentconversion.LibXSLTTransformer">
+- <service name="com.sun.star.documentconversion.LibXSLTTransformer"/>
++ <service name="com.sun.star.xml.xslt.XSLTTransformer"/>
+ </implementation>
+ </component>
+diff --git a/offapi/UnoApi_offapi.mk b/offapi/UnoApi_offapi.mk
+index 98cca5f..007cc52 100644
+--- a/offapi/UnoApi_offapi.mk
++++ b/offapi/UnoApi_offapi.mk
+@@ -285,6 +285,10 @@ $(eval $(call gb_UnoApi_add_idlfiles_nohdl,offapi,offapi/com/sun/star/xml/sax,\
+ FastShapeContextHandler \
+ FastTokenHandler \
+ ))
++$(eval $(call gb_UnoApi_add_idlfiles_nohdl,offapi,offapi/com/sun/star/xml/xslt,\
++ XSLTTransformer \
++ XSLT2Transformer \
++))
+
+
+ $(eval $(call gb_UnoApi_add_idlfiles_noheader,offapi,offapi/com/sun/star,\
+@@ -4255,6 +4259,11 @@ $(eval $(call gb_UnoApi_add_idlfiles,offapi,offapi/com/sun/star/xml/xpath,\
+ XXPathExtension \
+ XXPathObject \
+ ))
++
++$(eval $(call gb_UnoApi_add_idlfiles,offapi,offapi/com/sun/star/xml/xslt,\
++ XXSLTTransformer \
++))
++
+ $(eval $(call gb_UnoApi_add_idlfiles,offapi,offapi/com/sun/star/xsd,\
+ DataTypeClass \
+ WhiteSpaceTreatment \
+diff --git a/offapi/com/sun/star/xml/xslt/XSLT2Transformer.idl b/offapi/com/sun/star/xml/xslt/XSLT2Transformer.idl
+new file mode 100644
+index 0000000..af5abed
+--- /dev/null
++++ b/offapi/com/sun/star/xml/xslt/XSLT2Transformer.idl
+@@ -0,0 +1,30 @@
++/* -*- 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/.
++ */
++
++#ifndef INCLUDED_COM_SUN_STAR_XML_XSLT_XSLT2TRANSFORMER_IDL
++#define INCLUDED_COM_SUN_STAR_XML_XSLT_XSLT2TRANSFORMER_IDL
++
++#include <com/sun/star/xml/xslt/XXSLTTransformer.idl>
++
++module com { module sun { module star { module xml { module xslt {
++
++/** Get XSLT filter transformer supporting XSLT 2.0.
++
++ @since LibreOffice 3.7
++ */
++service XSLT2Transformer : XXSLTTransformer
++{
++ create([in] sequence<any> args);
++};
++
++}; }; }; }; };
++
++#endif
++
++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+diff --git a/offapi/com/sun/star/xml/xslt/XSLTTransformer.idl b/offapi/com/sun/star/xml/xslt/XSLTTransformer.idl
+new file mode 100644
+index 0000000..f9d75e3
+--- /dev/null
++++ b/offapi/com/sun/star/xml/xslt/XSLTTransformer.idl
+@@ -0,0 +1,32 @@
++/* -*- 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/.
++ */
++
++#ifndef INCLUDED_COM_SUN_STAR_XML_XSLT_XSLTTRANSFORMER_IDL
++#define INCLUDED_COM_SUN_STAR_XML_XSLT_XSLTTRANSFORMER_IDL
++
++#include <com/sun/star/xml/xslt/XXSLTTransformer.idl>
++
++module com { module sun { module star { module xml { module xslt {
++
++/** Get unspecified XSLT filter transformer.
++
++ <p>It is not safe to expect support for any features except XSLT 1.0 .
++
++ @since LibreOffice 3.7
++ */
++service XSLTTransformer : XXSLTTransformer
++{
++ create([in] sequence<any> args);
++};
++
++}; }; }; }; };
++
++#endif
++
++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+diff --git a/offapi/com/sun/star/xml/xslt/XXSLTTransformer.idl b/offapi/com/sun/star/xml/xslt/XXSLTTransformer.idl
+new file mode 100644
+index 0000000..9316c25
+--- /dev/null
++++ b/offapi/com/sun/star/xml/xslt/XXSLTTransformer.idl
+@@ -0,0 +1,36 @@
++/* -*- 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/.
++ */
++
++#ifndef INCLUDED_COM_SUN_STAR_XML_XSLT_XXSLTTRANSFORMER_IDL
++#define INCLUDED_COM_SUN_STAR_XML_XSLT_XXSLTTRANSFORMER_IDL
++
++#include <com/sun/star/io/XActiveDataControl.idl>
++#include <com/sun/star/io/XActiveDataSink.idl>
++#include <com/sun/star/io/XActiveDataSource.idl>
++#include <com/sun/star/lang/XInitialization.idl>
++
++module com { module sun { module star { module xml { module xslt {
++
++/** An interface for XSLT transformers.
++
++ @since LibreOffice 3.7
++ */
++interface XXSLTTransformer
++{
++ interface com::sun::star::io::XActiveDataControl;
++ interface com::sun::star::io::XActiveDataSink;
++ interface com::sun::star::io::XActiveDataSource;
++ interface com::sun::star::lang::XInitialization;
++};
++
++}; }; }; }; };
++
++#endif
++
++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+--
+1.7.11.7
+
diff --git a/0003-drop-saxon-based-XSLT-transformer.patch b/0003-drop-saxon-based-XSLT-transformer.patch
new file mode 100644
index 0000000..d856a95
--- /dev/null
+++ b/0003-drop-saxon-based-XSLT-transformer.patch
@@ -0,0 +1,3001 @@
+From 45928a0bf76f4cd59f4bcb20ac60057e4a786910 Mon Sep 17 00:00:00 2001
+From: David Tardon <dtardon at redhat.com>
+Date: Wed, 10 Oct 2012 17:33:30 +0200
+Subject: [PATCH 3/4] drop saxon-based XSLT transformer
+
+(cherry picked from commit bfc71eb03e2bc6f26d53f70b32f9a8937086808b)
+
+Conflicts:
+ filter/Jar_XSLTFilter.mk
+ filter/source/xsltfilter/XSLTFilter.jar.component
+ filter/source/xsltfilter/com/sun/star/comp/xsltfilter/Base64.java
+ filter/source/xsltfilter/com/sun/star/comp/xsltfilter/XSLTFilterOLEExtracter.java
+ filter/source/xsltfilter/com/sun/star/comp/xsltfilter/XSLTransformer.java
+
+Change-Id: I2cd4e0965452c376df8c5e43353fbdd6f62fb27d
+---
+ filter/Extension_xslt2_transformer.mk | 18 -
+ filter/Jar_XSLTFilter.mk | 45 -
+ filter/Module_filter.mk | 2 -
+ filter/source/xsltfilter/Manifest | 2 -
+ filter/source/xsltfilter/XSLTFilter.jar.component | 34 -
+ .../com/sun/star/comp/xsltfilter/Base64.java | 1835 --------------------
+ .../comp/xsltfilter/XSLTFilterOLEExtracter.java | 395 -----
+ .../sun/star/comp/xsltfilter/XSLTransformer.java | 506 ------
+ filter/source/xsltfilter/components.rdb | 8 -
+ filter/source/xsltfilter/description-en-US.txt | 1 -
+ filter/source/xsltfilter/description.xml | 28 -
+ filter/source/xsltfilter/manifest.xml | 6 -
+ 12 files changed, 2880 deletions(-)
+ delete mode 100644 filter/Extension_xslt2_transformer.mk
+ delete mode 100644 filter/Jar_XSLTFilter.mk
+ delete mode 100644 filter/source/xsltfilter/Manifest
+ delete mode 100644 filter/source/xsltfilter/XSLTFilter.jar.component
+ delete mode 100644 filter/source/xsltfilter/com/sun/star/comp/xsltfilter/Base64.java
+ delete mode 100644 filter/source/xsltfilter/com/sun/star/comp/xsltfilter/XSLTFilterOLEExtracter.java
+ delete mode 100644 filter/source/xsltfilter/com/sun/star/comp/xsltfilter/XSLTransformer.java
+ delete mode 100644 filter/source/xsltfilter/components.rdb
+ delete mode 100644 filter/source/xsltfilter/description-en-US.txt
+ delete mode 100644 filter/source/xsltfilter/description.xml
+ delete mode 100644 filter/source/xsltfilter/manifest.xml
+
+diff --git a/filter/Extension_xslt2_transformer.mk b/filter/Extension_xslt2_transformer.mk
+deleted file mode 100644
+index ab239d8..0000000
+--- a/filter/Extension_xslt2_transformer.mk
++++ /dev/null
+@@ -1,18 +0,0 @@
+-# -*- 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_Extension_Extension,xslt2-transformer,filter/source/xsltfilter))
+-
+-$(eval $(call gb_Extension_add_files,xslt2-transformer,,\
+- $(call gb_Jar_get_outdir_target,saxon9) \
+- $(call gb_Jar_get_outdir_target,XSLTFilter) \
+- $(SRCDIR)/filter/source/xsltfilter/components.rdb \
+-))
+-
+-# vim: set noet sw=4 ts=4:
+diff --git a/filter/Jar_XSLTFilter.mk b/filter/Jar_XSLTFilter.mk
+deleted file mode 100644
+index 9522c26..0000000
+--- a/filter/Jar_XSLTFilter.mk
++++ /dev/null
+@@ -1,45 +0,0 @@
+-#***************************************************************
+-# 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.
+-#***************************************************************
+-
+-$(eval $(call gb_Jar_Jar,XSLTFilter))
+-
+-$(eval $(call gb_Jar_use_jars,XSLTFilter,\
+- $(OUTDIR)/bin/ridl.jar \
+- $(OUTDIR)/bin/unoil.jar \
+- $(OUTDIR)/bin/jurt.jar \
+- $(OUTDIR)/bin/juh.jar \
+-))
+-
+-$(eval $(call gb_Jar_use_externals,XSLTFilter,saxon))
+-
+-$(eval $(call gb_Jar_set_componentfile,XSLTFilter,filter/source/xsltfilter/XSLTFilter.jar,OOO))
+-
+-$(eval $(call gb_Jar_set_manifest,XSLTFilter,$(SRCDIR)/filter/source/xsltfilter/Manifest))
+-
+-$(eval $(call gb_Jar_set_jarclasspath,XSLTFilter,saxon9.jar))
+-
+-$(eval $(call gb_Jar_set_packageroot,XSLTFilter,com))
+-
+-$(eval $(call gb_Jar_add_sourcefiles,XSLTFilter,\
+- filter/source/xsltfilter/com/sun/star/comp/xsltfilter/Base64 \
+- filter/source/xsltfilter/com/sun/star/comp/xsltfilter/XSLTFilterOLEExtracter \
+- filter/source/xsltfilter/com/sun/star/comp/xsltfilter/XSLTransformer \
+-))
+-
+-# vim: set noet sw=4 ts=4:
+diff --git a/filter/Module_filter.mk b/filter/Module_filter.mk
+index 9c18157..c372862 100644
+--- a/filter/Module_filter.mk
++++ b/filter/Module_filter.mk
+@@ -72,8 +72,6 @@ $(eval $(call gb_Module_add_targets,filter,\
+
+ ifneq ($(SOLAR_JAVA),)
+ $(eval $(call gb_Module_add_targets,filter,\
+- Extension_xslt2_transformer \
+- Jar_XSLTFilter \
+ Jar_XSLTValidate \
+ ))
+ endif
+diff --git a/filter/source/xsltfilter/Manifest b/filter/source/xsltfilter/Manifest
+deleted file mode 100644
+index 1bd3102..0000000
+--- a/filter/source/xsltfilter/Manifest
++++ /dev/null
+@@ -1,2 +0,0 @@
+-RegistrationClassName: com.sun.star.comp.xsltfilter.XSLTransformer
+-UNO-Type-Path:
+diff --git a/filter/source/xsltfilter/XSLTFilter.jar.component b/filter/source/xsltfilter/XSLTFilter.jar.component
+deleted file mode 100644
+index d4ecd66..0000000
+--- a/filter/source/xsltfilter/XSLTFilter.jar.component
++++ /dev/null
+@@ -1,34 +0,0 @@
+-<?xml version="1.0" encoding="UTF-8"?>
+-<!--**********************************************************************
+-*
+-* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+-*
+-* Copyright 2000, 2010 Oracle and/or its affiliates.
+-*
+-* OpenOffice.org - a multi-platform office productivity suite
+-*
+-* This file is part of OpenOffice.org.
+-*
+-* OpenOffice.org is free software: you can redistribute it and/or modify
+-* it under the terms of the GNU Lesser General Public License version 3
+-* only, as published by the Free Software Foundation.
+-*
+-* OpenOffice.org 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 Lesser General Public License version 3 for more details
+-* (a copy is included in the LICENSE file that accompanied this code).
+-*
+-* You should have received a copy of the GNU Lesser General Public License
+-* version 3 along with OpenOffice.org. If not, see
+-* <http://www.openoffice.org/license.html>
+-* for a copy of the LGPLv3 License.
+-*
+-**********************************************************************-->
+-
+-<component loader="com.sun.star.loader.Java2"
+- xmlns="http://openoffice.org/2010/uno-components">
+- <implementation name="XSLTransformer">
+- <service name="com.sun.star.comp.JAXTHelper"/>
+- </implementation>
+-</component>
+diff --git a/filter/source/xsltfilter/com/sun/star/comp/xsltfilter/Base64.java b/filter/source/xsltfilter/com/sun/star/comp/xsltfilter/Base64.java
+deleted file mode 100644
+index f92012e..0000000
+--- a/filter/source/xsltfilter/com/sun/star/comp/xsltfilter/Base64.java
++++ /dev/null
+@@ -1,1835 +0,0 @@
+-package com.sun.star.comp.xsltfilter;
+-
+-/************************************************************************
+- *
+- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+- *
+- * Copyright 2000, 2010 Oracle and/or its affiliates.
+- *
+- * OpenOffice.org - a multi-platform office productivity suite
+- *
+- * This file is part of OpenOffice.org.
+- *
+- * OpenOffice.org is free software: you can redistribute it and/or modify
+- * it under the terms of the GNU Lesser General Public License version 3
+- * only, as published by the Free Software Foundation.
+- *
+- * OpenOffice.org 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 Lesser General Public License version 3 for more details
+- * (a copy is included in the LICENSE file that accompanied this code).
+- *
+- * You should have received a copy of the GNU Lesser General Public License
+- * version 3 along with OpenOffice.org. If not, see
+- * <http://www.openoffice.org/license.html>
+- * for a copy of the LGPLv3 License.
+- *
+- ************************************************************************/
+-/**
+- * <p>Encodes and decodes to and from Base64 notation.</p>
+- * <p>Homepage: <a href="http://iharder.net/base64">http://iharder.net/base64</a>.</p>
+- *
+- * <p>The <tt>options</tt> parameter, which appears in a few places, is used to pass
+- * several pieces of information to the encoder. In the "higher level" methods such as
+- * encodeBytes( bytes, options ) the options parameter can be used to indicate such
+- * things as first gzipping the bytes before encoding them, not inserting linefeeds
+- * (though that breaks strict Base64 compatibility), and encoding using the URL-safe
+- * and Ordered dialects.</p>
+- *
+- * <p>The constants defined in Base64 can be OR-ed together to combine options, so you
+- * might make a call like this:</p>
+- *
+- * <code>String encoded = Base64.encodeBytes( mybytes, Base64.GZIP | Base64.DONT_BREAK_LINES );</code>
+- *
+- * <p>to compress the data before encoding it and then making the output have no newline characters.</p>
+- *
+- *
+- * <p>
+- * Change Log:
+- * </p>
+- * <ul>
+- * <li>v2.2.2 - Fixed encodeFileToFile and decodeFileToFile to use the
+- * Base64.InputStream class to encode and decode on the fly which uses
+- * less memory than encoding/decoding an entire file into memory before writing.</li>
+- * <li>v2.2.1 - Fixed bug using URL_SAFE and ORDERED encodings. Fixed bug
+- * when using very small files (~< 40 bytes).</li>
+- * <li>v2.2 - Added some helper methods for encoding/decoding directly from
+- * one file to the next. Also added a main() method to support command line
+- * encoding/decoding from one file to the next. Also added these Base64 dialects:
+- * <ol>
+- * <li>The default is RFC3548 format.</li>
+- * <li>Calling Base64.setFormat(Base64.BASE64_FORMAT.URLSAFE_FORMAT) generates
+- * URL and file name friendly format as described in Section 4 of RFC3548.
+- * http://www.faqs.org/rfcs/rfc3548.html</li>
+- * <li>Calling Base64.setFormat(Base64.BASE64_FORMAT.ORDERED_FORMAT) generates
+- * URL and file name friendly format that preserves lexical ordering as described
+- * in http://www.faqs.org/qa/rfcc-1940.html</li>
+- * </ol>
+- * Special thanks to Jim Kellerman at <a href="http://www.powerset.com/">http://www.powerset.com/</a>
+- * for contributing the new Base64 dialects.
+- * </li>
+- *
+- * <li>v2.1 - Cleaned up javadoc comments and unused variables and methods. Added
+- * some convenience methods for reading and writing to and from files.</li>
+- * <li>v2.0.2 - Now specifies UTF-8 encoding in places where the code fails on systems
+- * with other encodings (like EBCDIC).</li>
+- * <li>v2.0.1 - Fixed an error when decoding a single byte, that is, when the
+- * encoded data was a single byte.</li>
+- * <li>v2.0 - I got rid of methods that used booleans to set options.
+- * Now everything is more consolidated and cleaner. The code now detects
+- * when data that's being decoded is gzip-compressed and will decompress it
+- * automatically. Generally things are cleaner. You'll probably have to
+- * change some method calls that you were making to support the new
+- * options format (<tt>int</tt>s that you "OR" together).</li>
+- * <li>v1.5.1 - Fixed bug when decompressing and decoding to a
+- * byte[] using <tt>decode( String s, boolean gzipCompressed )</tt>.
+- * Added the ability to "suspend" encoding in the Output Stream so
+- * you can turn on and off the encoding if you need to embed base64
+- * data in an otherwise "normal" stream (like an XML file).</li>
+- * <li>v1.5 - Output stream pases on flush() command but doesn't do anything itself.
+- * This helps when using GZIP streams.
+- * Added the ability to GZip-compress objects before encoding them.</li>
+- * <li>v1.4 - Added helper methods to read/write files.</li>
+- * <li>v1.3.6 - Fixed OutputStream.flush() so that 'position' is reset.</li>
+- * <li>v1.3.5 - Added flag to turn on and off line breaks. Fixed bug in input stream
+- * where last buffer being read, if not completely full, was not returned.</li>
+- * <li>v1.3.4 - Fixed when "improperly padded stream" error was thrown at the wrong time.</li>
+- * <li>v1.3.3 - Fixed I/O streams which were totally messed up.</li>
+- * </ul>
+- *
+- * <p>
+- * I am placing this code in the Public Domain. Do with it as you will.
+- * This software comes with no guarantees or warranties but with
+- * plenty of well-wishing instead!
+- * Please visit <a href="http://iharder.net/base64">http://iharder.net/base64</a>
+- * periodically to check for updates or to contribute improvements.
+- * </p>
+- *
+- * @author Robert Harder
+- * @author rob at iharder.net
+- * @version 2.2.2
+- */
+-public class Base64
+-{
+-
+-/* ******** P U B L I C F I E L D S ******** */
+-
+-
+- /** No options specified. Value is zero. */
+- public final static int NO_OPTIONS = 0;
+-
+- /** Specify encoding. */
+- public final static int ENCODE = 1;
+-
+-
+- /** Specify decoding. */
+- public final static int DECODE = 0;
+-
+-
+- /** Specify that data should be gzip-compressed. */
+- public final static int GZIP = 2;
+-
+-
+- /** Don't break lines when encoding (violates strict Base64 specification) */
+- public final static int DONT_BREAK_LINES = 8;
+-
+- /**
+- * Encode using Base64-like encoding that is URL- and Filename-safe as described
+- * in Section 4 of RFC3548:
+- * <a href="http://www.faqs.org/rfcs/rfc3548.html">http://www.faqs.org/rfcs/rfc3548.html</a>.
+- * It is important to note that data encoded this way is <em>not</em> officially valid Base64,
+- * or at the very least should not be called Base64 without also specifying that is
+- * was encoded using the URL- and Filename-safe dialect.
+- */
+- public final static int URL_SAFE = 16;
+-
+-
+- /**
+- * Encode using the special "ordered" dialect of Base64 described here:
+- * <a href="http://www.faqs.org/qa/rfcc-1940.html">http://www.faqs.org/qa/rfcc-1940.html</a>.
+- */
+- public final static int ORDERED = 32;
+-
+-
+-/* ******** P R I V A T E F I E L D S ******** */
+-
+-
+- /** Maximum line length (76) of Base64 output. */
+- private final static int MAX_LINE_LENGTH = 76;
+-
+-
+- /** The equals sign (=) as a byte. */
+- private final static byte EQUALS_SIGN = (byte)'=';
+-
+-
+- /** The new line character (\n) as a byte. */
+- private final static byte NEW_LINE = (byte)'\n';
+-
+-
+- /** Preferred encoding. */
+- private final static String PREFERRED_ENCODING = "UTF-8";
+-
+-
+- // I think I end up not using the BAD_ENCODING indicator.
+- //private final static byte BAD_ENCODING = -9; // Indicates error in encoding
+- private final static byte WHITE_SPACE_ENC = -5; // Indicates white space in encoding
+- private final static byte EQUALS_SIGN_ENC = -1; // Indicates equals sign in encoding
+-
+-
+-/* ******** S T A N D A R D B A S E 6 4 A L P H A B E T ******** */
+-
+- /** The 64 valid Base64 values. */
+- //private final static byte[] ALPHABET;
+- /* Host platform me be something funny like EBCDIC, so we hardcode these values. */
+- private final static byte[] _STANDARD_ALPHABET =
+- {
+- (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G',
+- (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N',
+- (byte)'O', (byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U',
+- (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z',
+- (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g',
+- (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n',
+- (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u',
+- (byte)'v', (byte)'w', (byte)'x', (byte)'y', (byte)'z',
+- (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5',
+- (byte)'6', (byte)'7', (byte)'8', (byte)'9', (byte)'+', (byte)'/'
+- };
+-
+-
+- /**
+- * Translates a Base64 value to either its 6-bit reconstruction value
+- * or a negative number indicating some other meaning.
+- **/
+- private final static byte[] _STANDARD_DECODABET =
+- {
+- -9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 0 - 8
+- -5,-5, // Whitespace: Tab and Linefeed
+- -9,-9, // Decimal 11 - 12
+- -5, // Whitespace: Carriage Return
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 14 - 26
+- -9,-9,-9,-9,-9, // Decimal 27 - 31
+- -5, // Whitespace: Space
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 33 - 42
+- 62, // Plus sign at decimal 43
+- -9,-9,-9, // Decimal 44 - 46
+- 63, // Slash at decimal 47
+- 52,53,54,55,56,57,58,59,60,61, // Numbers zero through nine
+- -9,-9,-9, // Decimal 58 - 60
+- -1, // Equals sign at decimal 61
+- -9,-9,-9, // Decimal 62 - 64
+- 0,1,2,3,4,5,6,7,8,9,10,11,12,13, // Letters 'A' through 'N'
+- 14,15,16,17,18,19,20,21,22,23,24,25, // Letters 'O' through 'Z'
+- -9,-9,-9,-9,-9,-9, // Decimal 91 - 96
+- 26,27,28,29,30,31,32,33,34,35,36,37,38, // Letters 'a' through 'm'
+- 39,40,41,42,43,44,45,46,47,48,49,50,51, // Letters 'n' through 'z'
+- -9,-9,-9,-9 // Decimal 123 - 126
+- /*,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 127 - 139
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 */
+- };
+-
+-
+-/* ******** U R L S A F E B A S E 6 4 A L P H A B E T ******** */
+-
+- /**
+- * Used in the URL- and Filename-safe dialect described in Section 4 of RFC3548:
+- * <a href="http://www.faqs.org/rfcs/rfc3548.html">http://www.faqs.org/rfcs/rfc3548.html</a>.
+- * Notice that the last two bytes become "hyphen" and "underscore" instead of "plus" and "slash."
+- */
+- private final static byte[] _URL_SAFE_ALPHABET =
+- {
+- (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G',
+- (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N',
+- (byte)'O', (byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U',
+- (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z',
+- (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g',
+- (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n',
+- (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u',
+- (byte)'v', (byte)'w', (byte)'x', (byte)'y', (byte)'z',
+- (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5',
+- (byte)'6', (byte)'7', (byte)'8', (byte)'9', (byte)'-', (byte)'_'
+- };
+-
+- /**
+- * Used in decoding URL- and Filename-safe dialects of Base64.
+- */
+- private final static byte[] _URL_SAFE_DECODABET =
+- {
+- -9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 0 - 8
+- -5,-5, // Whitespace: Tab and Linefeed
+- -9,-9, // Decimal 11 - 12
+- -5, // Whitespace: Carriage Return
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 14 - 26
+- -9,-9,-9,-9,-9, // Decimal 27 - 31
+- -5, // Whitespace: Space
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 33 - 42
+- -9, // Plus sign at decimal 43
+- -9, // Decimal 44
+- 62, // Minus sign at decimal 45
+- -9, // Decimal 46
+- -9, // Slash at decimal 47
+- 52,53,54,55,56,57,58,59,60,61, // Numbers zero through nine
+- -9,-9,-9, // Decimal 58 - 60
+- -1, // Equals sign at decimal 61
+- -9,-9,-9, // Decimal 62 - 64
+- 0,1,2,3,4,5,6,7,8,9,10,11,12,13, // Letters 'A' through 'N'
+- 14,15,16,17,18,19,20,21,22,23,24,25, // Letters 'O' through 'Z'
+- -9,-9,-9,-9, // Decimal 91 - 94
+- 63, // Underscore at decimal 95
+- -9, // Decimal 96
+- 26,27,28,29,30,31,32,33,34,35,36,37,38, // Letters 'a' through 'm'
+- 39,40,41,42,43,44,45,46,47,48,49,50,51, // Letters 'n' through 'z'
+- -9,-9,-9,-9 // Decimal 123 - 126
+- /*,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 127 - 139
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 */
+- };
+-
+-
+-
+-/* ******** O R D E R E D B A S E 6 4 A L P H A B E T ******** */
+-
+- /**
+- * I don't get the point of this technique, but it is described here:
+- * <a href="http://www.faqs.org/qa/rfcc-1940.html">http://www.faqs.org/qa/rfcc-1940.html</a>.
+- */
+- private final static byte[] _ORDERED_ALPHABET =
+- {
+- (byte)'-',
+- (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4',
+- (byte)'5', (byte)'6', (byte)'7', (byte)'8', (byte)'9',
+- (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G',
+- (byte)'H', (byte)'I', (byte)'J', (byte)'K', (byte)'L', (byte)'M', (byte)'N',
+- (byte)'O', (byte)'P', (byte)'Q', (byte)'R', (byte)'S', (byte)'T', (byte)'U',
+- (byte)'V', (byte)'W', (byte)'X', (byte)'Y', (byte)'Z',
+- (byte)'_',
+- (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g',
+- (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n',
+- (byte)'o', (byte)'p', (byte)'q', (byte)'r', (byte)'s', (byte)'t', (byte)'u',
+- (byte)'v', (byte)'w', (byte)'x', (byte)'y', (byte)'z'
+- };
+-
+- /**
+- * Used in decoding the "ordered" dialect of Base64.
+- */
+- private final static byte[] _ORDERED_DECODABET =
+- {
+- -9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 0 - 8
+- -5,-5, // Whitespace: Tab and Linefeed
+- -9,-9, // Decimal 11 - 12
+- -5, // Whitespace: Carriage Return
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 14 - 26
+- -9,-9,-9,-9,-9, // Decimal 27 - 31
+- -5, // Whitespace: Space
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 33 - 42
+- -9, // Plus sign at decimal 43
+- -9, // Decimal 44
+- 0, // Minus sign at decimal 45
+- -9, // Decimal 46
+- -9, // Slash at decimal 47
+- 1,2,3,4,5,6,7,8,9,10, // Numbers zero through nine
+- -9,-9,-9, // Decimal 58 - 60
+- -1, // Equals sign at decimal 61
+- -9,-9,-9, // Decimal 62 - 64
+- 11,12,13,14,15,16,17,18,19,20,21,22,23, // Letters 'A' through 'M'
+- 24,25,26,27,28,29,30,31,32,33,34,35,36, // Letters 'N' through 'Z'
+- -9,-9,-9,-9, // Decimal 91 - 94
+- 37, // Underscore at decimal 95
+- -9, // Decimal 96
+- 38,39,40,41,42,43,44,45,46,47,48,49,50, // Letters 'a' through 'm'
+- 51,52,53,54,55,56,57,58,59,60,61,62,63, // Letters 'n' through 'z'
+- -9,-9,-9,-9 // Decimal 123 - 126
+- /*,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 127 - 139
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 140 - 152
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 153 - 165
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 166 - 178
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 179 - 191
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 192 - 204
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 205 - 217
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 218 - 230
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9, // Decimal 231 - 243
+- -9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9,-9 // Decimal 244 - 255 */
+- };
+-
+-
+-/* ******** D E T E R M I N E W H I C H A L H A B E T ******** */
+-
+-
+- /**
+- * Returns one of the _SOMETHING_ALPHABET byte arrays depending on
+- * the options specified.
+- * It's possible, though silly, to specify ORDERED and URLSAFE
+- * in which case one of them will be picked, though there is
+- * no guarantee as to which one will be picked.
+- */
+- private final static byte[] getAlphabet( int options )
+- {
+- if( (options & URL_SAFE) == URL_SAFE ) return _URL_SAFE_ALPHABET;
+- else if( (options & ORDERED) == ORDERED ) return _ORDERED_ALPHABET;
+- else return _STANDARD_ALPHABET;
+-
+- } // end getAlphabet
+-
+-
+- /**
+- * Returns one of the _SOMETHING_DECODABET byte arrays depending on
+- * the options specified.
+- * It's possible, though silly, to specify ORDERED and URL_SAFE
+- * in which case one of them will be picked, though there is
+- * no guarantee as to which one will be picked.
+- */
+- private final static byte[] getDecodabet( int options )
+- {
+- if( (options & URL_SAFE) == URL_SAFE ) return _URL_SAFE_DECODABET;
+- else if( (options & ORDERED) == ORDERED ) return _ORDERED_DECODABET;
+- else return _STANDARD_DECODABET;
+-
+- } // end getAlphabet
+-
+-
+-
+- /** Defeats instantiation. */
+- private Base64(){}
+-
+-
+- /**
+- * Encodes or decodes two files from the command line;
+- * <strong>feel free to delete this method (in fact you probably should)
+- * if you're embedding this code into a larger program.</strong>
+- */
+- public final static void main( String[] args )
+- {
+- if( args.length < 3 ){
+- usage("Not enough arguments.");
+- } // end if: args.length < 3
+- else {
+- String flag = args[0];
+- String infile = args[1];
+- String outfile = args[2];
+- if( flag.equals( "-e" ) ){
+- Base64.encodeFileToFile( infile, outfile );
+- } // end if: encode
+- else if( flag.equals( "-d" ) ) {
+- Base64.decodeFileToFile( infile, outfile );
+- } // end else if: decode
+- else {
+- usage( "Unknown flag: " + flag );
+- } // end else
+- } // end else
+- } // end main
+-
+- /**
+- * Prints command line usage.
+- *
+- * @param msg A message to include with usage info.
+- */
+- private final static void usage( String msg )
+- {
+- System.err.println( msg );
+- System.err.println( "Usage: java Base64 -e|-d inputfile outputfile" );
+- } // end usage
+-
+-
+-/* ******** E N C O D I N G M E T H O D S ******** */
+-
+-
+- /**
+- * Encodes up to the first three bytes of array <var>threeBytes</var>
+- * and returns a four-byte array in Base64 notation.
+- * The actual number of significant bytes in your array is
+- * given by <var>numSigBytes</var>.
+- * The array <var>threeBytes</var> needs only be as big as
+- * <var>numSigBytes</var>.
+- * Code can reuse a byte array by passing a four-byte array as <var>b4</var>.
+- *
+- * @param b4 A reusable byte array to reduce array instantiation
+- * @param threeBytes the array to convert
+- * @param numSigBytes the number of significant bytes in your array
+- * @return four byte array in Base64 notation.
+- * @since 1.5.1
+- */
+- private static byte[] encode3to4( byte[] b4, byte[] threeBytes, int numSigBytes, int options )
+- {
+- encode3to4( threeBytes, 0, numSigBytes, b4, 0, options );
+- return b4;
+- } // end encode3to4
+-
+-
+- /**
+- * <p>Encodes up to three bytes of the array <var>source</var>
+- * and writes the resulting four Base64 bytes to <var>destination</var>.
+- * The source and destination arrays can be manipulated
+- * anywhere along their length by specifying
+- * <var>srcOffset</var> and <var>destOffset</var>.
+- * This method does not check to make sure your arrays
+- * are large enough to accomodate <var>srcOffset</var> + 3 for
+- * the <var>source</var> array or <var>destOffset</var> + 4 for
+- * the <var>destination</var> array.
+- * The actual number of significant bytes in your array is
+- * given by <var>numSigBytes</var>.</p>
+- * <p>This is the lowest level of the encoding methods with
+- * all possible parameters.</p>
+- *
+- * @param source the array to convert
+- * @param srcOffset the index where conversion begins
+- * @param numSigBytes the number of significant bytes in your array
+- * @param destination the array to hold the conversion
+- * @param destOffset the index where output will be put
+- * @return the <var>destination</var> array
+- * @since 1.3
+- */
+- private static byte[] encode3to4(
+- byte[] source, int srcOffset, int numSigBytes,
+- byte[] destination, int destOffset, int options )
+- {
+- byte[] ALPHABET = getAlphabet( options );
+-
+- // 1 2 3
+- // 01234567890123456789012345678901 Bit position
+- // --------000000001111111122222222 Array position from threeBytes
+- // --------| || || || | Six bit groups to index ALPHABET
+- // >>18 >>12 >> 6 >> 0 Right shift necessary
+- // 0x3f 0x3f 0x3f Additional AND
+-
+- // Create buffer with zero-padding if there are only one or two
+- // significant bytes passed in the array.
+- // We have to shift left 24 in order to flush out the 1's that appear
+- // when Java treats a value as negative that is cast from a byte to an int.
+- int inBuff = ( numSigBytes > 0 ? ((source[ srcOffset ] << 24) >>> 8) : 0 )
+- | ( numSigBytes > 1 ? ((source[ srcOffset + 1 ] << 24) >>> 16) : 0 )
+- | ( numSigBytes > 2 ? ((source[ srcOffset + 2 ] << 24) >>> 24) : 0 );
+-
+- switch( numSigBytes )
+- {
+- case 3:
+- destination[ destOffset ] = ALPHABET[ (inBuff >>> 18) ];
+- destination[ destOffset + 1 ] = ALPHABET[ (inBuff >>> 12) & 0x3f ];
+- destination[ destOffset + 2 ] = ALPHABET[ (inBuff >>> 6) & 0x3f ];
+- destination[ destOffset + 3 ] = ALPHABET[ (inBuff ) & 0x3f ];
+- return destination;
+-
+- case 2:
+- destination[ destOffset ] = ALPHABET[ (inBuff >>> 18) ];
+- destination[ destOffset + 1 ] = ALPHABET[ (inBuff >>> 12) & 0x3f ];
+- destination[ destOffset + 2 ] = ALPHABET[ (inBuff >>> 6) & 0x3f ];
+- destination[ destOffset + 3 ] = EQUALS_SIGN;
+- return destination;
+-
+- case 1:
+- destination[ destOffset ] = ALPHABET[ (inBuff >>> 18) ];
+- destination[ destOffset + 1 ] = ALPHABET[ (inBuff >>> 12) & 0x3f ];
+- destination[ destOffset + 2 ] = EQUALS_SIGN;
+- destination[ destOffset + 3 ] = EQUALS_SIGN;
+- return destination;
+-
+- default:
+- return destination;
+- } // end switch
+- } // end encode3to4
+-
+-
+-
+- /**
+- * Serializes an object and returns the Base64-encoded
+- * version of that serialized object. If the object
+- * cannot be serialized or there is another error,
+- * the method will return <tt>null</tt>.
+- * The object is not GZip-compressed before being encoded.
+- *
+- * @param serializableObject The object to encode
+- * @return The Base64-encoded object
+- * @since 1.4
+- */
+- public static String encodeObject( java.io.Serializable serializableObject )
+- {
+- return encodeObject( serializableObject, NO_OPTIONS );
+- } // end encodeObject
+-
+-
+-
+- /**
+- * Serializes an object and returns the Base64-encoded
+- * version of that serialized object. If the object
+- * cannot be serialized or there is another error,
+- * the method will return <tt>null</tt>.
+- * <p>
+- * Valid options:<pre>
+- * GZIP: gzip-compresses object before encoding it.
+- * DONT_BREAK_LINES: don't break lines at 76 characters
+- * <i>Note: Technically, this makes your encoding non-compliant.</i>
+- * </pre>
+- * <p>
+- * Example: <code>encodeObject( myObj, Base64.GZIP )</code> or
+- * <p>
+- * Example: <code>encodeObject( myObj, Base64.GZIP | Base64.DONT_BREAK_LINES )</code>
+- *
+- * @param serializableObject The object to encode
+- * @param options Specified options
+- * @return The Base64-encoded object
+- * @see Base64#GZIP
+- * @see Base64#DONT_BREAK_LINES
+- * @since 2.0
+- */
+- public static String encodeObject( java.io.Serializable serializableObject, int options )
+- {
+- // Streams
+- java.io.ByteArrayOutputStream baos = null;
+- java.io.OutputStream b64os = null;
+- java.io.ObjectOutputStream oos = null;
+- java.util.zip.GZIPOutputStream gzos = null;
+-
+- // Isolate options
+- int gzip = (options & GZIP);
+- int dontBreakLines = (options & DONT_BREAK_LINES);
+-
+- try
+- {
+- // ObjectOutputStream -> (GZIP) -> Base64 -> ByteArrayOutputStream
+- baos = new java.io.ByteArrayOutputStream();
+- b64os = new Base64.OutputStream( baos, ENCODE | options );
+-
+- // GZip?
+- if( gzip == GZIP )
+- {
+- gzos = new java.util.zip.GZIPOutputStream( b64os );
+- oos = new java.io.ObjectOutputStream( gzos );
+- } // end if: gzip
+- else
+- oos = new java.io.ObjectOutputStream( b64os );
+-
+- oos.writeObject( serializableObject );
+- } // end try
+- catch( java.io.IOException e )
+- {
+- e.printStackTrace();
+- return null;
+- } // end catch
+- finally
+- {
+- try{ oos.close(); } catch( Exception e ){}
+- try{ gzos.close(); } catch( Exception e ){}
+- try{ b64os.close(); } catch( Exception e ){}
+- try{ baos.close(); } catch( Exception e ){}
+- } // end finally
+-
+- // Return value according to relevant encoding.
+- try
+- {
+- return new String( baos.toByteArray(), PREFERRED_ENCODING );
+- } // end try
+- catch (java.io.UnsupportedEncodingException uue)
+- {
+- return new String( baos.toByteArray() );
+- } // end catch
+-
+- } // end encode
+-
+-
+-
+- /**
+- * Encodes a byte array into Base64 notation.
+- * Does not GZip-compress data.
+- *
+- * @param source The data to convert
+- * @since 1.4
+- */
+- public static String encodeBytes( byte[] source )
+- {
+- return encodeBytes( source, 0, source.length, NO_OPTIONS );
+- } // end encodeBytes
+-
+-
+-
+- /**
+- * Encodes a byte array into Base64 notation.
+- * <p>
+- * Valid options:<pre>
+- * GZIP: gzip-compresses object before encoding it.
+- * DONT_BREAK_LINES: don't break lines at 76 characters
+- * <i>Note: Technically, this makes your encoding non-compliant.</i>
+- * </pre>
+- * <p>
+- * Example: <code>encodeBytes( myData, Base64.GZIP )</code> or
+- * <p>
+- * Example: <code>encodeBytes( myData, Base64.GZIP | Base64.DONT_BREAK_LINES )</code>
+- *
+- *
+- * @param source The data to convert
+- * @param options Specified options
+- * @see Base64#GZIP
+- * @see Base64#DONT_BREAK_LINES
+- * @since 2.0
+- */
+- public static String encodeBytes( byte[] source, int options )
+- {
+- return encodeBytes( source, 0, source.length, options );
+- } // end encodeBytes
+-
+-
+- /**
+- * Encodes a byte array into Base64 notation.
+- * Does not GZip-compress data.
+- *
+- * @param source The data to convert
+- * @param off Offset in array where conversion should begin
+- * @param len Length of data to convert
+- * @since 1.4
+- */
+- public static String encodeBytes( byte[] source, int off, int len )
+- {
+- return encodeBytes( source, off, len, NO_OPTIONS );
+- } // end encodeBytes
+-
+-
+-
+- /**
+- * Encodes a byte array into Base64 notation.
+- * <p>
+- * Valid options:<pre>
+- * GZIP: gzip-compresses object before encoding it.
+- * DONT_BREAK_LINES: don't break lines at 76 characters
+- * <i>Note: Technically, this makes your encoding non-compliant.</i>
+- * </pre>
+- * <p>
+- * Example: <code>encodeBytes( myData, Base64.GZIP )</code> or
+- * <p>
+- * Example: <code>encodeBytes( myData, Base64.GZIP | Base64.DONT_BREAK_LINES )</code>
+- *
+- *
+- * @param source The data to convert
+- * @param off Offset in array where conversion should begin
+- * @param len Length of data to convert
+- * @param options Specified options
+- * @param options alphabet type is pulled from this (standard, url-safe, ordered)
+- * @see Base64#GZIP
+- * @see Base64#DONT_BREAK_LINES
+- * @since 2.0
+- */
+- public static String encodeBytes( byte[] source, int off, int len, int options )
+- {
+- // Isolate options
+- int dontBreakLines = ( options & DONT_BREAK_LINES );
+- int gzip = ( options & GZIP );
+-
+- // Compress?
+- if( gzip == GZIP )
+- {
+- java.io.ByteArrayOutputStream baos = null;
+- java.util.zip.GZIPOutputStream gzos = null;
+- Base64.OutputStream b64os = null;
+-
+-
+- try
+- {
+- // GZip -> Base64 -> ByteArray
+- baos = new java.io.ByteArrayOutputStream();
+- b64os = new Base64.OutputStream( baos, ENCODE | options );
+- gzos = new java.util.zip.GZIPOutputStream( b64os );
+-
+- gzos.write( source, off, len );
+- gzos.close();
+- } // end try
+- catch( java.io.IOException e )
+- {
+- e.printStackTrace();
+- return null;
+- } // end catch
+- finally
+- {
+- try{ gzos.close(); } catch( Exception e ){}
+- try{ b64os.close(); } catch( Exception e ){}
+- try{ baos.close(); } catch( Exception e ){}
+- } // end finally
+-
+- // Return value according to relevant encoding.
+- try
+- {
+- return new String( baos.toByteArray(), PREFERRED_ENCODING );
+- } // end try
+- catch (java.io.UnsupportedEncodingException uue)
+- {
+- return new String( baos.toByteArray() );
+- } // end catch
+- } // end if: compress
+-
+- // Else, don't compress. Better not to use streams at all then.
+- else
+- {
+- // Convert option to boolean in way that code likes it.
+- boolean breakLines = dontBreakLines == 0;
+-
+- int len43 = len * 4 / 3;
+- byte[] outBuff = new byte[ ( len43 ) // Main 4:3
+- + ( (len % 3) > 0 ? 4 : 0 ) // Account for padding
+- + (breakLines ? ( len43 / MAX_LINE_LENGTH ) : 0) ]; // New lines
+- int d = 0;
+- int e = 0;
+- int len2 = len - 2;
+- int lineLength = 0;
+- for( ; d < len2; d+=3, e+=4 )
+- {
+- encode3to4( source, d+off, 3, outBuff, e, options );
+-
+- lineLength += 4;
+- if( breakLines && lineLength == MAX_LINE_LENGTH )
+- {
+- outBuff[e+4] = NEW_LINE;
+- e++;
+- lineLength = 0;
+- } // end if: end of line
+- } // en dfor: each piece of array
+-
+- if( d < len )
+- {
+- encode3to4( source, d+off, len - d, outBuff, e, options );
+- e += 4;
+- } // end if: some padding needed
+-
+-
+- // Return value according to relevant encoding.
+- try
+- {
+- return new String( outBuff, 0, e, PREFERRED_ENCODING );
+- } // end try
+- catch (java.io.UnsupportedEncodingException uue)
+- {
+- return new String( outBuff, 0, e );
+- } // end catch
+-
+- } // end else: don't compress
+-
+- } // end encodeBytes
+-
+-
+-
+-
+-
+-/* ******** D E C O D I N G M E T H O D S ******** */
+-
+-
+- /**
+- * Decodes four bytes from array <var>source</var>
+- * and writes the resulting bytes (up to three of them)
+- * to <var>destination</var>.
+- * The source and destination arrays can be manipulated
+- * anywhere along their length by specifying
+- * <var>srcOffset</var> and <var>destOffset</var>.
+- * This method does not check to make sure your arrays
+- * are large enough to accomodate <var>srcOffset</var> + 4 for
+- * the <var>source</var> array or <var>destOffset</var> + 3 for
+- * the <var>destination</var> array.
+- * This method returns the actual number of bytes that
+- * were converted from the Base64 encoding.
+- * <p>This is the lowest level of the decoding methods with
+- * all possible parameters.</p>
+- *
+- *
+- * @param source the array to convert
+- * @param srcOffset the index where conversion begins
+- * @param destination the array to hold the conversion
+- * @param destOffset the index where output will be put
+- * @param options alphabet type is pulled from this (standard, url-safe, ordered)
+- * @return the number of decoded bytes converted
+- * @since 1.3
+- */
+- private static int decode4to3( byte[] source, int srcOffset, byte[] destination, int destOffset, int options )
+- {
+- byte[] DECODABET = getDecodabet( options );
+-
+- // Example: Dk==
+- if( source[ srcOffset + 2] == EQUALS_SIGN )
+- {
+- // Two ways to do the same thing. Don't know which way I like best.
+- //int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 )
+- // | ( ( DECODABET[ source[ srcOffset + 1] ] << 24 ) >>> 12 );
+- int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 )
+- | ( ( DECODABET[ source[ srcOffset + 1] ] & 0xFF ) << 12 );
+-
+- destination[ destOffset ] = (byte)( outBuff >>> 16 );
+- return 1;
+- }
+-
+- // Example: DkL=
+- else if( source[ srcOffset + 3 ] == EQUALS_SIGN )
+- {
+- // Two ways to do the same thing. Don't know which way I like best.
+- //int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 )
+- // | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 )
+- // | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 );
+- int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 )
+- | ( ( DECODABET[ source[ srcOffset + 1 ] ] & 0xFF ) << 12 )
+- | ( ( DECODABET[ source[ srcOffset + 2 ] ] & 0xFF ) << 6 );
+-
+- destination[ destOffset ] = (byte)( outBuff >>> 16 );
+- destination[ destOffset + 1 ] = (byte)( outBuff >>> 8 );
+- return 2;
+- }
+-
+- // Example: DkLE
+- else
+- {
+- try{
+- // Two ways to do the same thing. Don't know which way I like best.
+- //int outBuff = ( ( DECODABET[ source[ srcOffset ] ] << 24 ) >>> 6 )
+- // | ( ( DECODABET[ source[ srcOffset + 1 ] ] << 24 ) >>> 12 )
+- // | ( ( DECODABET[ source[ srcOffset + 2 ] ] << 24 ) >>> 18 )
+- // | ( ( DECODABET[ source[ srcOffset + 3 ] ] << 24 ) >>> 24 );
+- int outBuff = ( ( DECODABET[ source[ srcOffset ] ] & 0xFF ) << 18 )
+- | ( ( DECODABET[ source[ srcOffset + 1 ] ] & 0xFF ) << 12 )
+- | ( ( DECODABET[ source[ srcOffset + 2 ] ] & 0xFF ) << 6)
+- | ( ( DECODABET[ source[ srcOffset + 3 ] ] & 0xFF ) );
+-
+-
+- destination[ destOffset ] = (byte)( outBuff >> 16 );
+- destination[ destOffset + 1 ] = (byte)( outBuff >> 8 );
+- destination[ destOffset + 2 ] = (byte)( outBuff );
+-
+- return 3;
+- }catch( Exception e){
+- System.out.println(""+source[srcOffset]+ ": " + ( DECODABET[ source[ srcOffset ] ] ) );
+- System.out.println(""+source[srcOffset+1]+ ": " + ( DECODABET[ source[ srcOffset + 1 ] ] ) );
+- System.out.println(""+source[srcOffset+2]+ ": " + ( DECODABET[ source[ srcOffset + 2 ] ] ) );
+- System.out.println(""+source[srcOffset+3]+ ": " + ( DECODABET[ source[ srcOffset + 3 ] ] ) );
+- return -1;
+- } // end catch
+- }
+- } // end decodeToBytes
+-
+-
+-
+-
+- /**
+- * Very low-level access to decoding ASCII characters in
+- * the form of a byte array. Does not support automatically
+- * gunzipping or any other "fancy" features.
+- *
+- * @param source The Base64 encoded data
+- * @param off The offset of where to begin decoding
+- * @param len The length of characters to decode
+- * @return decoded data
+- * @since 1.3
+- */
+- public static byte[] decode( byte[] source, int off, int len, int options )
+- {
+- byte[] DECODABET = getDecodabet( options );
+-
+- int len34 = len * 3 / 4;
+- byte[] outBuff = new byte[ len34 ]; // Upper limit on size of output
+- int outBuffPosn = 0;
+-
+- byte[] b4 = new byte[4];
+- int b4Posn = 0;
+- int i = 0;
+- byte sbiCrop = 0;
+- byte sbiDecode = 0;
+- for( i = off; i < off+len; i++ )
+- {
+- sbiCrop = (byte)(source[i] & 0x7f); // Only the low seven bits
+- sbiDecode = DECODABET[ sbiCrop ];
+-
+- if( sbiDecode >= WHITE_SPACE_ENC ) // White space, Equals sign or better
+- {
+- if( sbiDecode >= EQUALS_SIGN_ENC )
+- {
+- b4[ b4Posn++ ] = sbiCrop;
+- if( b4Posn > 3 )
+- {
+- outBuffPosn += decode4to3( b4, 0, outBuff, outBuffPosn, options );
+- b4Posn = 0;
+-
+- // If that was the equals sign, break out of 'for' loop
+- if( sbiCrop == EQUALS_SIGN )
+- break;
+- } // end if: quartet built
+-
+- } // end if: equals sign or better
+-
+- } // end if: white space, equals sign or better
+- else
+- {
+- System.err.println( "Bad Base64 input character at " + i + ": " + source[i] + "(decimal)" );
+- return null;
+- } // end else:
+- } // each input character
+-
+- byte[] out = new byte[ outBuffPosn ];
+- System.arraycopy( outBuff, 0, out, 0, outBuffPosn );
+- return out;
+- } // end decode
+-
+-
+-
+-
+- /**
+- * Decodes data from Base64 notation, automatically
+- * detecting gzip-compressed data and decompressing it.
+- *
+- * @param s the string to decode
+- * @return the decoded data
+- * @since 1.4
+- */
+- public static byte[] decode( String s )
+- {
+- return decode( s, NO_OPTIONS );
+- }
+-
+-
+- /**
+- * Decodes data from Base64 notation, automatically
+- * detecting gzip-compressed data and decompressing it.
+- *
+- * @param s the string to decode
+- * @param options encode options such as URL_SAFE
+- * @return the decoded data
+- * @since 1.4
+- */
+- public static byte[] decode( String s, int options )
+- {
+- byte[] bytes;
+- try
+- {
+- bytes = s.getBytes( PREFERRED_ENCODING );
+- } // end try
+- catch( java.io.UnsupportedEncodingException uee )
+- {
+- bytes = s.getBytes();
+- } // end catch
+- //</change>
+-
+- // Decode
+- bytes = decode( bytes, 0, bytes.length, options );
+-
+-
+- // Check to see if it's gzip-compressed
+- // GZIP Magic Two-Byte Number: 0x8b1f (35615)
+- if( bytes != null && bytes.length >= 4 )
+- {
+-
+- int head = ((int)bytes[0] & 0xff) | ((bytes[1] << 8) & 0xff00);
+- if( java.util.zip.GZIPInputStream.GZIP_MAGIC == head )
+- {
+- java.io.ByteArrayInputStream bais = null;
+- java.util.zip.GZIPInputStream gzis = null;
+- java.io.ByteArrayOutputStream baos = null;
+- byte[] buffer = new byte[2048];
+- int length = 0;
+-
+- try
+- {
+- baos = new java.io.ByteArrayOutputStream();
+- bais = new java.io.ByteArrayInputStream( bytes );
+- gzis = new java.util.zip.GZIPInputStream( bais );
+-
+- while( ( length = gzis.read( buffer ) ) >= 0 )
+- {
+- baos.write(buffer,0,length);
+- } // end while: reading input
+-
+- // No error? Get new bytes.
+- bytes = baos.toByteArray();
+-
+- } // end try
+- catch( java.io.IOException e )
+- {
+- // Just return originally-decoded bytes
+- } // end catch
+- finally
+- {
+- try{ baos.close(); } catch( Exception e ){}
+- try{ gzis.close(); } catch( Exception e ){}
+- try{ bais.close(); } catch( Exception e ){}
+- } // end finally
+-
+- } // end if: gzipped
+- } // end if: bytes.length >= 2
+-
+- return bytes;
+- } // end decode
+-
+-
+-
+-
+- /**
+- * Attempts to decode Base64 data and deserialize a Java
+- * Object within. Returns <tt>null</tt> if there was an error.
+- *
+- * @param encodedObject The Base64 data to decode
+- * @return The decoded and deserialized object
+- * @since 1.5
+- */
+- public static Object decodeToObject( String encodedObject )
+- {
+- // Decode and gunzip if necessary
+- byte[] objBytes = decode( encodedObject );
+-
+- java.io.ByteArrayInputStream bais = null;
+- java.io.ObjectInputStream ois = null;
+- Object obj = null;
+-
+- try
+- {
+- bais = new java.io.ByteArrayInputStream( objBytes );
+- ois = new java.io.ObjectInputStream( bais );
+-
+- obj = ois.readObject();
+- } // end try
+- catch( java.io.IOException e )
+- {
+- e.printStackTrace();
+- obj = null;
+- } // end catch
+- catch( java.lang.ClassNotFoundException e )
+- {
+- e.printStackTrace();
+- obj = null;
+- } // end catch
+- finally
+- {
+- try{ bais.close(); } catch( Exception e ){}
+- try{ ois.close(); } catch( Exception e ){}
+- } // end finally
+-
+- return obj;
+- } // end decodeObject
+-
+-
+-
+- /**
+- * Convenience method for encoding data to a file.
+- *
+- * @param dataToEncode byte array of data to encode in base64 form
+- * @param filename Filename for saving encoded data
+- * @return <tt>true</tt> if successful, <tt>false</tt> otherwise
+- *
+- * @since 2.1
+- */
+- public static boolean encodeToFile( byte[] dataToEncode, String filename )
+- {
+- boolean success = false;
+- Base64.OutputStream bos = null;
+- try
+- {
+- bos = new Base64.OutputStream(
+- new java.io.FileOutputStream( filename ), Base64.ENCODE );
+- bos.write( dataToEncode );
+- success = true;
+- } // end try
+- catch( java.io.IOException e )
+- {
+-
+- success = false;
+- } // end catch: IOException
+- finally
+- {
+- try{ bos.close(); } catch( Exception e ){}
+- } // end finally
+-
+- return success;
+- } // end encodeToFile
+-
+-
+- /**
+- * Convenience method for decoding data to a file.
+- *
+- * @param dataToDecode Base64-encoded data as a string
+- * @param filename Filename for saving decoded data
+- * @return <tt>true</tt> if successful, <tt>false</tt> otherwise
+- *
+- * @since 2.1
+- */
+- public static boolean decodeToFile( String dataToDecode, String filename )
+- {
+- boolean success = false;
+- Base64.OutputStream bos = null;
+- try
+- {
+- bos = new Base64.OutputStream(
+- new java.io.FileOutputStream( filename ), Base64.DECODE );
+- bos.write( dataToDecode.getBytes( PREFERRED_ENCODING ) );
+- success = true;
+- } // end try
+- catch( java.io.IOException e )
+- {
+- success = false;
+- } // end catch: IOException
+- finally
+- {
+- try{ bos.close(); } catch( Exception e ){}
+- } // end finally
+-
+- return success;
+- } // end decodeToFile
+-
+-
+-
+-
+- /**
+- * Convenience method for reading a base64-encoded
+- * file and decoding it.
+- *
+- * @param filename Filename for reading encoded data
+- * @return decoded byte array or null if unsuccessful
+- *
+- * @since 2.1
+- */
+- public static byte[] decodeFromFile( String filename )
+- {
+- byte[] decodedData = null;
+- Base64.InputStream bis = null;
+- try
+- {
+- // Set up some useful variables
+- java.io.File file = new java.io.File( filename );
+- byte[] buffer = null;
+- int length = 0;
+- int numBytes = 0;
+-
+- // Check for size of file
+- if( file.length() > Integer.MAX_VALUE )
+- {
+- System.err.println( "File is too big for this convenience method (" + file.length() + " bytes)." );
+- return null;
+- } // end if: file too big for int index
+- buffer = new byte[ (int)file.length() ];
+-
+- // Open a stream
+- bis = new Base64.InputStream(
+- new java.io.BufferedInputStream(
+- new java.io.FileInputStream( file ) ), Base64.DECODE );
+-
+- // Read until done
+- while( ( numBytes = bis.read( buffer, length, 4096 ) ) >= 0 )
+- length += numBytes;
+-
+- // Save in a variable to return
+- decodedData = new byte[ length ];
+- System.arraycopy( buffer, 0, decodedData, 0, length );
+-
+- } // end try
+- catch( java.io.IOException e )
+- {
+- System.err.println( "Error decoding from file " + filename );
+- } // end catch: IOException
+- finally
+- {
+- try{ bis.close(); } catch( Exception e) {}
+- } // end finally
+-
+- return decodedData;
+- } // end decodeFromFile
+-
+-
+-
+- /**
+- * Convenience method for reading a binary file
+- * and base64-encoding it.
+- *
+- * @param filename Filename for reading binary data
+- * @return base64-encoded string or null if unsuccessful
+- *
+- * @since 2.1
+- */
+- public static String encodeFromFile( String filename )
+- {
+- String encodedData = null;
+- Base64.InputStream bis = null;
+- try
+- {
+- // Set up some useful variables
+- java.io.File file = new java.io.File( filename );
+- byte[] buffer = new byte[ Math.max((int)(file.length() * 1.4),40) ]; // Need max() for math on small files (v2.2.1)
+- int length = 0;
+- int numBytes = 0;
+-
+- // Open a stream
+- bis = new Base64.InputStream(
+- new java.io.BufferedInputStream(
+- new java.io.FileInputStream( file ) ), Base64.ENCODE );
+-
+- // Read until done
+- while( ( numBytes = bis.read( buffer, length, 4096 ) ) >= 0 )
+- length += numBytes;
+-
+- // Save in a variable to return
+- encodedData = new String( buffer, 0, length, Base64.PREFERRED_ENCODING );
+-
+- } // end try
+- catch( java.io.IOException e )
+- {
+- System.err.println( "Error encoding from file " + filename );
+- } // end catch: IOException
+- finally
+- {
+- try{ bis.close(); } catch( Exception e) {}
+- } // end finally
+-
+- return encodedData;
+- } // end encodeFromFile
+-
+-
+-
+-
+- /**
+- * Reads <tt>infile</tt> and encodes it to <tt>outfile</tt>.
+- *
+- * @param infile Input file
+- * @param outfile Output file
+- * @return true if the operation is successful
+- * @since 2.2
+- */
+- public static boolean encodeFileToFile( String infile, String outfile )
+- {
+- boolean success = false;
+- java.io.InputStream in = null;
+- java.io.OutputStream out = null;
+- try{
+- in = new Base64.InputStream(
+- new java.io.BufferedInputStream(
+- new java.io.FileInputStream( infile ) ),
+- Base64.ENCODE );
+- out = new java.io.BufferedOutputStream( new java.io.FileOutputStream( outfile ) );
+- byte[] buffer = new byte[65536]; // 64K
+- int read = -1;
+- while( ( read = in.read(buffer) ) >= 0 ){
+- out.write( buffer,0,read );
+- } // end while: through file
+- success = true;
+- } catch( java.io.IOException exc ){
+- exc.printStackTrace();
+- } finally{
+- try{ in.close(); } catch( Exception exc ){}
+- try{ out.close(); } catch( Exception exc ){}
+- } // end finally
+-
+- return success;
+- } // end encodeFileToFile
+-
+-
+-
+- /**
+- * Reads <tt>infile</tt> and decodes it to <tt>outfile</tt>.
+- *
+- * @param infile Input file
+- * @param outfile Output file
+- * @return true if the operation is successful
+- * @since 2.2
+- */
+- public static boolean decodeFileToFile( String infile, String outfile )
+- {
+- boolean success = false;
+- java.io.InputStream in = null;
+- java.io.OutputStream out = null;
+- try{
+- in = new Base64.InputStream(
+- new java.io.BufferedInputStream(
+- new java.io.FileInputStream( infile ) ),
+- Base64.DECODE );
+- out = new java.io.BufferedOutputStream( new java.io.FileOutputStream( outfile ) );
+- byte[] buffer = new byte[65536]; // 64K
+- int read = -1;
+- while( ( read = in.read(buffer) ) >= 0 ){
+- out.write( buffer,0,read );
+- } // end while: through file
+- success = true;
+- } catch( java.io.IOException exc ){
+- exc.printStackTrace();
+- } finally{
+- try{ in.close(); } catch( Exception exc ){}
+- try{ out.close(); } catch( Exception exc ){}
+- } // end finally
+-
+- return success;
+- } // end decodeFileToFile
+-
+-
+- /* ******** I N N E R C L A S S I N P U T S T R E A M ******** */
+-
+-
+-
+- /**
+- * A {@link Base64.InputStream} will read data from another
+- * <tt>java.io.InputStream</tt>, given in the constructor,
+- * and encode/decode to/from Base64 notation on the fly.
+- *
+- * @see Base64
+- * @since 1.3
+- */
+- public static class InputStream extends java.io.FilterInputStream
+- {
+- private boolean encode; // Encoding or decoding
+- private int position; // Current position in the buffer
+- private byte[] buffer; // Small buffer holding converted data
+- private int bufferLength; // Length of buffer (3 or 4)
+- private int numSigBytes; // Number of meaningful bytes in the buffer
+- private int lineLength;
+- private boolean breakLines; // Break lines at less than 80 characters
+- private int options; // Record options used to create the stream.
+- private byte[] alphabet; // Local copies to avoid extra method calls
+- private byte[] decodabet; // Local copies to avoid extra method calls
+-
+-
+- /**
+- * Constructs a {@link Base64.InputStream} in DECODE mode.
+- *
+- * @param in the <tt>java.io.InputStream</tt> from which to read data.
+- * @since 1.3
+- */
+- public InputStream( java.io.InputStream in )
+- {
+- this( in, DECODE );
+- } // end constructor
+-
+-
+- /**
+- * Constructs a {@link Base64.InputStream} in
+- * either ENCODE or DECODE mode.
+- * <p>
+- * Valid options:<pre>
+- * ENCODE or DECODE: Encode or Decode as data is read.
+- * DONT_BREAK_LINES: don't break lines at 76 characters
+- * (only meaningful when encoding)
+- * <i>Note: Technically, this makes your encoding non-compliant.</i>
+- * </pre>
+- * <p>
+- * Example: <code>new Base64.InputStream( in, Base64.DECODE )</code>
+- *
+- *
+- * @param in the <tt>java.io.InputStream</tt> from which to read data.
+- * @param options Specified options
+- * @see Base64#ENCODE
+- * @see Base64#DECODE
+- * @see Base64#DONT_BREAK_LINES
+- * @since 2.0
+- */
+- public InputStream( java.io.InputStream in, int options )
+- {
+- super( in );
+- this.breakLines = (options & DONT_BREAK_LINES) != DONT_BREAK_LINES;
+- this.encode = (options & ENCODE) == ENCODE;
+- this.bufferLength = encode ? 4 : 3;
+- this.buffer = new byte[ bufferLength ];
+- this.position = -1;
+- this.lineLength = 0;
+- this.options = options; // Record for later, mostly to determine which alphabet to use
+- this.alphabet = getAlphabet(options);
+- this.decodabet = getDecodabet(options);
+- } // end constructor
+-
+- /**
+- * Reads enough of the input stream to convert
+- * to/from Base64 and returns the next byte.
+- *
+- * @return next byte
+- * @since 1.3
+- */
+- public int read() throws java.io.IOException
+- {
+- // Do we need to get data?
+- if( position < 0 )
+- {
+- if( encode )
+- {
+- byte[] b3 = new byte[3];
+- int numBinaryBytes = 0;
+- for( int i = 0; i < 3; i++ )
+- {
+- try
+- {
+- int b = in.read();
+-
+- // If end of stream, b is -1.
+- if( b >= 0 )
+- {
+- b3[i] = (byte)b;
+- numBinaryBytes++;
+- } // end if: not end of stream
+-
+- } // end try: read
+- catch( java.io.IOException e )
+- {
+- // Only a problem if we got no data at all.
+- if( i == 0 )
+- throw e;
+-
+- } // end catch
+- } // end for: each needed input byte
+-
+- if( numBinaryBytes > 0 )
+- {
+- encode3to4( b3, 0, numBinaryBytes, buffer, 0, options );
+- position = 0;
+- numSigBytes = 4;
+- } // end if: got data
+- else
+- {
+- return -1;
+- } // end else
+- } // end if: encoding
+-
+- // Else decoding
+- else
+- {
+- byte[] b4 = new byte[4];
+- int i = 0;
+- for( i = 0; i < 4; i++ )
+- {
+- // Read four "meaningful" bytes:
+- int b = 0;
+- do{ b = in.read(); }
+- while( b >= 0 && decodabet[ b & 0x7f ] <= WHITE_SPACE_ENC );
+-
+- if( b < 0 )
+- break; // Reads a -1 if end of stream
+-
+- b4[i] = (byte)b;
+- } // end for: each needed input byte
+-
+- if( i == 4 )
+- {
+- numSigBytes = decode4to3( b4, 0, buffer, 0, options );
+- position = 0;
+- } // end if: got four characters
+- else if( i == 0 ){
+- return -1;
+- } // end else if: also padded correctly
+- else
+- {
+- // Must have broken out from above.
+- throw new java.io.IOException( "Improperly padded Base64 input." );
+- } // end
+-
+- } // end else: decode
+- } // end else: get data
+-
+- // Got data?
+- if( position >= 0 )
+- {
+- // End of relevant data?
+- if( /*!encode &&*/ position >= numSigBytes )
+- return -1;
+-
+- if( encode && breakLines && lineLength >= MAX_LINE_LENGTH )
+- {
+- lineLength = 0;
+- return '\n';
+- } // end if
+- else
+- {
+- lineLength++; // This isn't important when decoding
+- // but throwing an extra "if" seems
+- // just as wasteful.
+-
+- int b = buffer[ position++ ];
+-
+- if( position >= bufferLength )
+- position = -1;
+-
+- return b & 0xFF; // This is how you "cast" a byte that's
+- // intended to be unsigned.
+- } // end else
+- } // end if: position >= 0
+-
+- // Else error
+- else
+- {
+- // When JDK1.4 is more accepted, use an assertion here.
+- throw new java.io.IOException( "Error in Base64 code reading stream." );
+- } // end else
+- } // end read
+-
+-
+- /**
+- * Calls {@link #read()} repeatedly until the end of stream
+- * is reached or <var>len</var> bytes are read.
+- * Returns number of bytes read into array or -1 if
+- * end of stream is encountered.
+- *
+- * @param dest array to hold values
+- * @param off offset for array
+- * @param len max number of bytes to read into array
+- * @return bytes read into array or -1 if end of stream is encountered.
+- * @since 1.3
+- */
+- public int read( byte[] dest, int off, int len ) throws java.io.IOException
+- {
+- int i;
+- int b;
+- for( i = 0; i < len; i++ )
+- {
+- b = read();
+-
+- //if( b < 0 && i == 0 )
+- // return -1;
+-
+- if( b >= 0 )
+- dest[off + i] = (byte)b;
+- else if( i == 0 )
+- return -1;
+- else
+- break; // Out of 'for' loop
+- } // end for: each byte read
+- return i;
+- } // end read
+-
+- } // end inner class InputStream
+-
+-
+-
+-
+-
+-
+- /* ******** I N N E R C L A S S O U T P U T S T R E A M ******** */
+-
+-
+-
+- /**
+- * A {@link Base64.OutputStream} will write data to another
+- * <tt>java.io.OutputStream</tt>, given in the constructor,
+- * and encode/decode to/from Base64 notation on the fly.
+- *
+- * @see Base64
+- * @since 1.3
+- */
+- public static class OutputStream extends java.io.FilterOutputStream
+- {
+- private boolean encode;
+- private int position;
+- private byte[] buffer;
+- private int bufferLength;
+- private int lineLength;
+- private boolean breakLines;
+- private byte[] b4; // Scratch used in a few places
+- private boolean suspendEncoding;
+- private int options; // Record for later
+- private byte[] alphabet; // Local copies to avoid extra method calls
+- private byte[] decodabet; // Local copies to avoid extra method calls
+-
+- /**
+- * Constructs a {@link Base64.OutputStream} in ENCODE mode.
+- *
+- * @param out the <tt>java.io.OutputStream</tt> to which data will be written.
+- * @since 1.3
+- */
+- public OutputStream( java.io.OutputStream out )
+- {
+- this( out, ENCODE );
+- } // end constructor
+-
+-
+- /**
+- * Constructs a {@link Base64.OutputStream} in
+- * either ENCODE or DECODE mode.
+- * <p>
+- * Valid options:<pre>
+- * ENCODE or DECODE: Encode or Decode as data is read.
+- * DONT_BREAK_LINES: don't break lines at 76 characters
+- * (only meaningful when encoding)
+- * <i>Note: Technically, this makes your encoding non-compliant.</i>
+- * </pre>
+- * <p>
+- * Example: <code>new Base64.OutputStream( out, Base64.ENCODE )</code>
+- *
+- * @param out the <tt>java.io.OutputStream</tt> to which data will be written.
+- * @param options Specified options.
+- * @see Base64#ENCODE
+- * @see Base64#DECODE
+- * @see Base64#DONT_BREAK_LINES
+- * @since 1.3
+- */
+- public OutputStream( java.io.OutputStream out, int options )
+- {
+- super( out );
+- this.breakLines = (options & DONT_BREAK_LINES) != DONT_BREAK_LINES;
+- this.encode = (options & ENCODE) == ENCODE;
+- this.bufferLength = encode ? 3 : 4;
+- this.buffer = new byte[ bufferLength ];
+- this.position = 0;
+- this.lineLength = 0;
+- this.suspendEncoding = false;
+- this.b4 = new byte[4];
+- this.options = options;
+- this.alphabet = getAlphabet(options);
+- this.decodabet = getDecodabet(options);
+- } // end constructor
+-
+-
+- /**
+- * Writes the byte to the output stream after
+- * converting to/from Base64 notation.
+- * When encoding, bytes are buffered three
+- * at a time before the output stream actually
+- * gets a write() call.
+- * When decoding, bytes are buffered four
+- * at a time.
+- *
+- * @param theByte the byte to write
+- * @since 1.3
+- */
+- public void write(int theByte) throws java.io.IOException
+- {
+- // Encoding suspended?
+- if( suspendEncoding )
+- {
+- super.out.write( theByte );
+- return;
+- } // end if: supsended
+-
+- // Encode?
+- if( encode )
+- {
+- buffer[ position++ ] = (byte)theByte;
+- if( position >= bufferLength ) // Enough to encode.
+- {
+- out.write( encode3to4( b4, buffer, bufferLength, options ) );
+-
+- lineLength += 4;
+- if( breakLines && lineLength >= MAX_LINE_LENGTH )
+- {
+- out.write( NEW_LINE );
+- lineLength = 0;
+- } // end if: end of line
+-
+- position = 0;
+- } // end if: enough to output
+- } // end if: encoding
+-
+- // Else, Decoding
+- else
+- {
+- // Meaningful Base64 character?
+- if( decodabet[ theByte & 0x7f ] > WHITE_SPACE_ENC )
+- {
+- buffer[ position++ ] = (byte)theByte;
+- if( position >= bufferLength ) // Enough to output.
+- {
+- int len = Base64.decode4to3( buffer, 0, b4, 0, options );
+- out.write( b4, 0, len );
+- //out.write( Base64.decode4to3( buffer ) );
+- position = 0;
+- } // end if: enough to output
+- } // end if: meaningful base64 character
+- else if( decodabet[ theByte & 0x7f ] != WHITE_SPACE_ENC )
+- {
+- throw new java.io.IOException( "Invalid character in Base64 data." );
+- } // end else: not white space either
+- } // end else: decoding
+- } // end write
+-
+-
+-
+- /**
+- * Calls {@link #write(int)} repeatedly until <var>len</var>
+- * bytes are written.
+- *
+- * @param theBytes array from which to read bytes
+- * @param off offset for array
+- * @param len max number of bytes to read into array
+- * @since 1.3
+- */
+- public void write( byte[] theBytes, int off, int len ) throws java.io.IOException
+- {
+- // Encoding suspended?
+- if( suspendEncoding )
+- {
+- super.out.write( theBytes, off, len );
+- return;
+- } // end if: supsended
+-
+- for( int i = 0; i < len; i++ )
+- {
+- write( theBytes[ off + i ] );
+- } // end for: each byte written
+-
+- } // end write
+-
+-
+-
+- /**
+- * Method added by PHIL. [Thanks, PHIL. -Rob]
+- * This pads the buffer without closing the stream.
+- */
+- public void flushBase64() throws java.io.IOException
+- {
+- if( position > 0 )
+- {
+- if( encode )
+- {
+- out.write( encode3to4( b4, buffer, position, options ) );
+- position = 0;
+- } // end if: encoding
+- else
+- {
+- throw new java.io.IOException( "Base64 input not properly padded." );
+- } // end else: decoding
+- } // end if: buffer partially full
+-
+- } // end flush
+-
+-
+- /**
+- * Flushes and closes (I think, in the superclass) the stream.
+- *
+- * @since 1.3
+- */
+- public void close() throws java.io.IOException
+- {
+- // 1. Ensure that pending characters are written
+- flushBase64();
+-
+- // 2. Actually close the stream
+- // Base class both flushes and closes.
+- super.close();
+-
+- buffer = null;
+- out = null;
+- } // end close
+-
+-
+-
+- /**
+- * Suspends encoding of the stream.
+- * May be helpful if you need to embed a piece of
+- * base640-encoded data in a stream.
+- *
+- * @since 1.5.1
+- */
+- public void suspendEncoding() throws java.io.IOException
+- {
+- flushBase64();
+- this.suspendEncoding = true;
+- } // end suspendEncoding
+-
+-
+- /**
+- * Resumes encoding of the stream.
+- * May be helpful if you need to embed a piece of
+- * base640-encoded data in a stream.
+- *
+- * @since 1.5.1
+- */
+- public void resumeEncoding()
+- {
+- this.suspendEncoding = false;
+- } // end resumeEncoding
+-
+-
+-
+- } // end inner class OutputStream
+-
+-
+-} // end class Base64
+diff --git a/filter/source/xsltfilter/com/sun/star/comp/xsltfilter/XSLTFilterOLEExtracter.java b/filter/source/xsltfilter/com/sun/star/comp/xsltfilter/XSLTFilterOLEExtracter.java
+deleted file mode 100644
+index 078e031..0000000
+--- a/filter/source/xsltfilter/com/sun/star/comp/xsltfilter/XSLTFilterOLEExtracter.java
++++ /dev/null
+@@ -1,395 +0,0 @@
+-package com.sun.star.comp.xsltfilter;
+-
+-/************************************************************************
+- *
+- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+- *
+- * Copyright 2000, 2010 Oracle and/or its affiliates.
+- *
+- * OpenOffice.org - a multi-platform office productivity suite
+- *
+- * This file is part of OpenOffice.org.
+- *
+- * OpenOffice.org is free software: you can redistribute it and/or modify
+- * it under the terms of the GNU Lesser General Public License version 3
+- * only, as published by the Free Software Foundation.
+- *
+- * OpenOffice.org 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 Lesser General Public License version 3 for more details
+- * (a copy is included in the LICENSE file that accompanied this code).
+- *
+- * You should have received a copy of the GNU Lesser General Public License
+- * version 3 along with OpenOffice.org. If not, see
+- * <http://www.openoffice.org/license.html>
+- * for a copy of the LGPLv3 License.
+- *
+- ************************************************************************/
+-
+-//Standard Java classes
+-import java.io.FileWriter;
+-import java.util.zip.Inflater;
+-import java.util.zip.Deflater;
+-
+-//StarOffice Interfaces and UNO
+-import com.sun.star.bridge.XBridgeFactory;
+-import com.sun.star.bridge.XBridge;
+-import com.sun.star.connection.XConnector;
+-import com.sun.star.connection.XConnection;
+-import com.sun.star.container.XNameContainer;
+-import com.sun.star.embed.XTransactedObject;
+-import com.sun.star.io.XStream;
+-import com.sun.star.io.XSeekable;
+-import com.sun.star.io.XInputStream;
+-import com.sun.star.io.XOutputStream;
+-import com.sun.star.lang.XMultiServiceFactory;
+-import com.sun.star.lang.XComponent;
+-import com.sun.star.uno.XComponentContext;
+-import com.sun.star.uno.UnoRuntime;
+-
+-/** This class is an xalan extension class. It provider 2 elements
+- * and 2 functions to used in xslt script. With this elements and functions
+- * we can convert between oledata between Wordml and OOo flat.
+- * To use it, we need a running OOo. There are two ways to get the XMultiServiceFactory.
+- * When called by OOo xslt filter, an XMultiServiceFactory will be add to the transformer
+- * by setParameter(), then we can get it using getParameter(). Another way is using an
+- * XConnection to connect to a running OOo. We connect to a running OOo, we need know the
+- * uno url. It can be set in the xslt script. The default uno url is:
+- * "uno:socket,host=localhost,port=8100;urp;StarOffice.ServiceManager"
+- * see XSLTXalanOLEExtracter.java
+- */
+-public class XSLTFilterOLEExtracter {
+-
+- protected XMultiServiceFactory m_xMSF;
+- protected XNameContainer m_Storage;
+- protected XStream m_RootStream;
+- protected XConnection m_Connection;
+- protected String sConnectionString;
+- private static final String UNO_URL = "uno:socket,host=localhost,port=8100;urp;StarOffice.ServiceManager";
+-
+- public XSLTFilterOLEExtracter() {
+- }
+-
+- public void init(String unoUrl) {
+- if (unoUrl == null || unoUrl.equals("")) {
+- unoUrl = UNO_URL;
+- }
+- debugln("Init with uno url=" + unoUrl);
+- if (null == m_xMSF) {
+- try {
+- m_xMSF = connectAwareGetServiceFactory();
+- } catch (Exception ex) {
+- System.err.println("Could not connect to the office '" + unoUrl + "'\n" + ex.getMessage());
+- }
+- }
+- }
+-
+- public void exit() {
+- m_Storage = null;
+- m_xMSF = null;
+- if (null != m_Connection) {
+- try {
+- m_Connection.close();
+- } catch (Exception ex) {
+- System.err.println("Could not close connection to the office.\n" + ex.getMessage());
+- }
+- }
+- }
+- //If aName = "oledata.mso" then we load the root storage from the given base64 string
+- //Otherwise we compress the stream and add it to the root storage under the name of aName
+- public void insertByName(String aName, String aBase64) {
+- debugln("insertByName(" + aName + " : " + aBase64 + ")");
+- if (aName.equals("oledata.mso")) {
+- loadRootStorageFromBase64(aBase64);
+- } else {
+- ensureCreateRootStorage();
+- insertSubStorage(aName, aBase64);
+- }
+- }
+- //If aName = "oledata.mso" then we return the base64 encoded string of the root storage
+- //Otherwise we return the base64 encoded string of the sub stream under the name of aName
+- public String getByName(String aName) {
+- if (aName.equals("oledata.mso")) {
+- try {
+- //get the length and seek to 0
+- XSeekable xSeek = (XSeekable) UnoRuntime.queryInterface(XSeekable.class, m_RootStream);
+- int oleLength = (int) xSeek.getLength();
+- xSeek.seek(0);
+- xSeek = null;
+- //read all bytes
+- XInputStream xInput = m_RootStream.getInputStream();
+- byte oledata[][] = new byte[1][oleLength];
+- xInput.readBytes(oledata, oleLength);
+- //return the base64 encoded string
+- return Base64.encodeBytes(oledata[0]);
+- } catch (Exception ex) {
+- ex.printStackTrace();
+- }
+- } else {
+- return getEncodedSubStorage(aName);
+- }
+- return "";
+- }
+- //get the sub stream which name = aName, decompress it and return the base64 encoded string
+- public String getEncodedSubStorage(String aName) {
+- debugln("getByName(" + aName + ")");
+- try {
+- if (!m_Storage.hasByName(aName)) {
+- return "Not Found:" + aName;
+- }
+- Object oSubStream = m_Storage.getByName(aName);
+- if (oSubStream == null) {
+- return "Not Found:" + aName;
+- }
+- XInputStream xSubStream = (XInputStream) UnoRuntime.queryInterface(XInputStream.class,
+- oSubStream);
+- if (xSubStream == null) {
+- return "Not Found:" + aName;
+- }
+- //The first four byte are the length of the uncompressed data
+- byte pLength[][] = new byte[1][4];
+- XSeekable xSeek = (XSeekable) UnoRuntime.queryInterface(XSeekable.class, xSubStream);
+- xSeek.seek(0);
+- xSeek = null;
+- //Get the uncompressed length
+- int readbytes = xSubStream.readBytes(pLength, 4);
+- if (4 != readbytes) {
+- System.out.println("readbytes:" + readbytes);
+- return "Can not read the length.";
+- }
+- int oleLength = (pLength[0][0] << 0) + (pLength[0][1] << 8) + (pLength[0][2] << 16) + (pLength[0][3] << 24);
+- byte pContents[][] = new byte[1][oleLength];
+- //Read all bytes. The compressed length should less then the uncompressed length
+- readbytes = xSubStream.readBytes(pContents, oleLength);
+- if (oleLength < readbytes) {
+- return "oleLength :" + oleLength + " readbytes: " + readbytes;
+- }
+-
+- // Decompress the bytes
+- Inflater decompresser = new Inflater();
+- decompresser.setInput(pContents[0], 0, readbytes);
+- byte[] result = new byte[oleLength];
+- int resultLength = decompresser.inflate(result);
+- decompresser.end();
+-
+- //return the base64 string of the uncompressed data
+- return Base64.encodeBytes(result);
+- } catch (Exception ex) {
+- ex.printStackTrace();
+- }
+- return "";
+- }
+-
+- public XStream CreateTempFileStream(XMultiServiceFactory xMSF) {
+- // try to get temporary file representation
+- XStream xTempFileStream = null;
+- try {
+- Object oTempFile = xMSF.createInstance("com.sun.star.io.TempFile");
+- xTempFileStream = (XStream) UnoRuntime.queryInterface(XStream.class, oTempFile);
+- } catch (Exception e) {
+- }
+-
+- if (xTempFileStream == null) {
+- System.out.println("Can't create temporary file!");
+- }
+-
+- return xTempFileStream;
+- }
+- //decode the base64 string and create an com.sun.star.embed.OLESimpleStorage from it
+- public void loadRootStorageFromBase64(String aBase64) {
+- try {
+- //Decode and write the data to an temp stream
+- byte[] oledata = Base64.decode(aBase64);
+- m_RootStream = CreateTempFileStream(m_xMSF);
+- XOutputStream xOutput = m_RootStream.getOutputStream();
+- xOutput.writeBytes(oledata);
+- xOutput.flush();
+- //Get the input stream and seek to begin
+- XInputStream xInput = m_RootStream.getInputStream();
+- XSeekable xSeek = (XSeekable) UnoRuntime.queryInterface(XSeekable.class, xInput);
+- xSeek.seek(0);
+- oledata = null;
+- xSeek = null;
+-
+- //create an com.sun.star.embed.OLESimpleStorage from the temp stream
+- Object pArgs[] = new Object[1];
+- pArgs[0] = (Object) xInput;
+- Object oTempStorage = m_xMSF.createInstanceWithArguments("com.sun.star.embed.OLESimpleStorage", pArgs);
+- pArgs = null;
+-
+- m_Storage = (XNameContainer) UnoRuntime.queryInterface(XNameContainer.class, oTempStorage);
+- } catch (Exception e) {
+- e.printStackTrace();
+- }
+- }
+- //Create a empty OLESimpleStorage if there is not one
+- public void ensureCreateRootStorage() {
+- if (null == m_RootStream || null == m_Storage) {
+- try {
+- m_RootStream = CreateTempFileStream(m_xMSF);
+-
+- Object pArgs[] = new Object[1];
+- pArgs[0] = (Object) m_RootStream;
+- Object oTempStorage = m_xMSF.createInstanceWithArguments("com.sun.star.embed.OLESimpleStorage", pArgs);
+- pArgs = null;
+-
+- m_Storage = (XNameContainer) UnoRuntime.queryInterface(XNameContainer.class, oTempStorage);
+- } catch (Exception e) {
+- e.printStackTrace();
+- }
+- }
+- }
+- //decode the base64 string and insert the length and the compressed data of it to
+- //the root storage as a sub stream under aName
+- public void insertSubStorage(String aName, String aBase64) {
+- try {
+- //decode the base64 string
+- byte[] oledata = Base64.decode(aBase64);
+- //create a temp stream to write data to
+- XStream subStream = CreateTempFileStream(m_xMSF);
+- XInputStream xInput = subStream.getInputStream();
+- XOutputStream xOutput = subStream.getOutputStream();
+- //write the length to the temp stream
+- byte oleHead[] = new byte[4];
+- oleHead[0] = (byte) ((oledata.length >>> 0) & 0xFF);
+- oleHead[1] = (byte) ((oledata.length >>> 8) & 0xFF);
+- oleHead[2] = (byte) ((oledata.length >>> 16) & 0xFF);
+- oleHead[3] = (byte) ((oledata.length >>> 24) & 0xFF);
+- xOutput.writeBytes(oleHead);
+-
+- // Compress the bytes
+- byte[] output = new byte[oledata.length];
+- Deflater compresser = new Deflater();
+- compresser.setInput(oledata);
+- compresser.finish();
+- int compressedDataLength = compresser.deflate(output);
+- //realloc the data length
+- byte[] compressedBytes = new byte[compressedDataLength];
+- for (int i = 0; i < compressedDataLength; i++) {
+- compressedBytes[i] = output[i];
+- }
+-
+- //write the compressed data to the temp stream
+- xOutput.writeBytes(compressedBytes);
+- //seek to 0
+- XSeekable xSeek = (XSeekable) UnoRuntime.queryInterface(XSeekable.class, xInput);
+- xSeek.seek(0);
+- xSeek = null;
+- oledata = null;
+-
+- //insert the temp stream as a sub stream and use an XTransactedObject to commit it immediately
+- XTransactedObject xTransact = (XTransactedObject) UnoRuntime.queryInterface(XTransactedObject.class, m_Storage);
+- m_Storage.insertByName(aName, xInput);
+- xTransact.commit();
+- xTransact = null;
+-
+- } catch (Exception e) {
+- e.printStackTrace();
+- }
+- }
+-
+- /** separtates the uno-url into 3 different parts.
+- */
+- protected static String[] parseUnoUrl(String url) {
+- String[] aRet = new String[3];
+-
+- if (!url.startsWith("uno:")) {
+- return null;
+- }
+-
+- int semicolon = url.indexOf(';');
+- if (semicolon == -1) {
+- return null;
+- }
+-
+- aRet[0] = url.substring(4, semicolon);
+- int nextSemicolon = url.indexOf(';', semicolon + 1);
+-
+- if (semicolon == -1) {
+- return null;
+- }
+- aRet[1] = url.substring(semicolon + 1, nextSemicolon);
+-
+- aRet[2] = url.substring(nextSemicolon + 1);
+- return aRet;
+- }
+- //connect to running OOo and keep an XConnection object so that we can disconnect from OOo as we wish
+- protected XMultiServiceFactory connectAwareGetServiceFactory() throws com.sun.star.uno.Exception,
+- com.sun.star.uno.RuntimeException,
+- Exception {
+-
+- // Get component context
+- XComponentContext xComponentContext =
+- com.sun.star.comp.helper.Bootstrap.createInitialComponentContext(null);
+-
+- // instantiate connector service
+- Object x = xComponentContext.getServiceManager().createInstanceWithContext(
+- "com.sun.star.connection.Connector", xComponentContext);
+-
+- XConnector xConnector = (XConnector) UnoRuntime.queryInterface(XConnector.class, x);
+-
+- String a[] = parseUnoUrl(sConnectionString);
+- if (null == a) {
+- throw new com.sun.star.uno.Exception("Couldn't parse uno-url " + sConnectionString);
+- }
+-
+- // connect using the connection string part of the uno-url only.
+- m_Connection = xConnector.connect(a[0]);
+-
+- x = xComponentContext.getServiceManager().createInstanceWithContext(
+- "com.sun.star.bridge.BridgeFactory", xComponentContext);
+-
+- XBridgeFactory xBridgeFactory = (XBridgeFactory) UnoRuntime.queryInterface(
+- XBridgeFactory.class, x);
+-
+- // create a nameless bridge with no instance provider
+- // using the middle part of the uno-url
+- XBridge bridge = xBridgeFactory.createBridge("", a[1], m_Connection, null);
+-
+- // query for the XComponent interface and add this as event listener
+- XComponent xComponent = (XComponent) UnoRuntime.queryInterface(
+- XComponent.class, bridge);
+-
+- // get the remote instance
+- x = bridge.getInstance(a[2]);
+-
+- // Did the remote server export this object ?
+- if (null == x) {
+- throw new com.sun.star.uno.Exception(
+- "Server didn't provide an instance for" + a[2], null);
+- }
+-
+- XMultiServiceFactory xFac = (XMultiServiceFactory) UnoRuntime.queryInterface(XMultiServiceFactory.class, x);
+- return xFac;
+- }
+- protected static boolean DEBUG = false;
+- protected static boolean DEBUGCHK = false;
+- protected static String debugfile;
+-
+- protected static void debugln(String s) {
+- debug(s + "\n");
+- }
+-
+- protected static void debug(String s) {
+- if (!DEBUGCHK) {
+- if (System.getProperty("xsltfilter.debug") == null) {
+- DEBUGCHK = true;
+- return;
+- } else {
+- debugfile = System.getProperty("xsltfilter.debug");
+- DEBUG = true;
+- }
+- }
+- if (!DEBUG) {
+- return;
+- }
+- try {
+- FileWriter dbgwriter = new FileWriter(debugfile, true);
+- dbgwriter.write(s);
+- dbgwriter.close();
+- } catch (Exception e) {
+- e.printStackTrace();
+- }
+- }
+-}
+diff --git a/filter/source/xsltfilter/com/sun/star/comp/xsltfilter/XSLTransformer.java b/filter/source/xsltfilter/com/sun/star/comp/xsltfilter/XSLTransformer.java
+deleted file mode 100644
+index 7036646..0000000
+--- a/filter/source/xsltfilter/com/sun/star/comp/xsltfilter/XSLTransformer.java
++++ /dev/null
+@@ -1,506 +0,0 @@
+-package com.sun.star.comp.xsltfilter;
+-
+-/************************************************************************
+- *
+- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+- *
+- * Copyright 2000, 2010 Oracle and/or its affiliates.
+- *
+- * OpenOffice.org - a multi-platform office productivity suite
+- *
+- * This file is part of OpenOffice.org.
+- *
+- * OpenOffice.org is free software: you can redistribute it and/or modify
+- * it under the terms of the GNU Lesser General Public License version 3
+- * only, as published by the Free Software Foundation.
+- *
+- * OpenOffice.org 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 Lesser General Public License version 3 for more details
+- * (a copy is included in the LICENSE file that accompanied this code).
+- *
+- * You should have received a copy of the GNU Lesser General Public License
+- * version 3 along with OpenOffice.org. If not, see
+- * <http://www.openoffice.org/license.html>
+- * for a copy of the LGPLv3 License.
+- *
+- ************************************************************************/
+-
+-//Standard Java classes
+-import java.io.BufferedInputStream;
+-import java.io.BufferedOutputStream;
+-import java.io.File;
+-import java.io.FileOutputStream;
+-import java.io.InputStream;
+-import java.io.PrintStream;
+-import java.io.StringReader;
+-import java.net.URL;
+-import java.net.URLConnection;
+-import java.util.Enumeration;
+-import java.util.Hashtable;
+-import java.util.Vector;
+-
+-// Imported TraX classes
+-import javax.xml.parsers.SAXParserFactory;
+-import javax.xml.transform.Source;
+-import javax.xml.transform.Transformer;
+-import javax.xml.transform.TransformerFactory;
+-import javax.xml.transform.URIResolver;
+-import javax.xml.transform.sax.SAXSource;
+-import javax.xml.transform.stream.StreamResult;
+-import javax.xml.transform.stream.StreamSource;
+-import org.xml.sax.EntityResolver;
+-import org.xml.sax.InputSource;
+-import org.xml.sax.SAXException;
+-import org.xml.sax.XMLReader;
+-
+-//StarOffice Interfaces and UNO
+-import com.sun.star.beans.NamedValue;
+-import com.sun.star.comp.loader.FactoryHelper;
+-import com.sun.star.io.XActiveDataControl;
+-import com.sun.star.io.XActiveDataSink;
+-import com.sun.star.io.XActiveDataSource;
+-import com.sun.star.io.XInputStream;
+-import com.sun.star.io.XOutputStream;
+-import com.sun.star.io.XSeekable;
+-import com.sun.star.io.XStreamListener;
+-import com.sun.star.lang.XInitialization;
+-import com.sun.star.lang.XMultiServiceFactory;
+-import com.sun.star.lang.XServiceInfo;
+-import com.sun.star.lang.XServiceName;
+-import com.sun.star.lang.XSingleServiceFactory;
+-import com.sun.star.lang.XTypeProvider;
+-import com.sun.star.registry.XRegistryKey;
+-import com.sun.star.uno.AnyConverter;
+-import com.sun.star.uno.Type;
+-import com.sun.star.uno.UnoRuntime;
+-import com.sun.star.xml.xslt.XXSLTTransformer;
+-
+-//Uno to java Adaptor
+-import com.sun.star.lib.uno.adapter.XInputStreamToInputStreamAdapter;
+-import com.sun.star.lib.uno.adapter.XOutputStreamToOutputStreamAdapter;
+-import javax.xml.transform.Templates;
+-
+-import net.sf.saxon.FeatureKeys;
+-
+-/** This outer class provides an inner class to implement the service
+- * description and a method to instantiate the
+- * component on demand (__getServiceFactory()).
+- */
+-public class XSLTransformer
+- implements XTypeProvider, XServiceName, XServiceInfo, XXSLTTransformer,
+- URIResolver, EntityResolver {
+-
+- /**
+- * This component provides java based XSL transformations
+- * A SAX based interface is not feasible when crossing language bordes
+- * since too much time would be wasted by bridging the events between environments
+- * example: 190 pages document, 82000 events 8seconds transform 40(!) sec. bridging
+- *
+- */
+- private XInputStream m_xis;
+- private XOutputStream m_xos; // private static HashMap templatecache;
+- private static final String STATSPROP = "XSLTransformer.statsfile";
+- private static PrintStream statsp;
+- private String stylesheeturl;
+- private String targeturl;
+- private String targetbaseurl;
+- private String sourceurl;
+- private String sourcebaseurl;
+- private String pubtype = new String();
+- private String systype = new String(); // processing thread
+- private Thread t; // listeners
+- private Vector listeners = new Vector(); //
+- private XMultiServiceFactory svcfactory; // cache for transformations by stylesheet
+- private static Hashtable xsltReferences = new Hashtable();
+- // struct for cached stylesheets
+- private static class Transformation {
+-
+- public Templates cachedXSLT;
+- public long lastmod;
+- }
+- // Resolve URIs to an empty source
+- public Source resolve(String href, String base) {
+- return new StreamSource(new StringReader(""));
+- }
+-
+- public InputSource resolveEntity(String publicId, String systemId) throws SAXException, java.io.IOException {
+- return new InputSource(new StringReader(""));
+- }
+- // --- Initialization ---
+- public XSLTransformer(XMultiServiceFactory msf) {
+- svcfactory = msf;
+- }
+-
+- public void initialize(Object[] args) throws com.sun.star.uno.Exception {
+- // some configurable debugging
+- String statsfilepath = null;
+- if ((statsfilepath = System.getProperty(STATSPROP)) != null) {
+- try {
+- File statsfile = new File(statsfilepath);
+- statsp = new PrintStream(new FileOutputStream(statsfile.getPath(), false));
+- } catch (java.lang.Exception e) {
+- System.err.println("XSLTransformer: could not open statsfile'" + statsfilepath + "'");
+- System.err.println(" " + e.getClass().getName() + ": " + e.getMessage());
+- System.err.println(" output disabled");
+- }
+- }
+-
+- Object[] values = (Object[]) args[0];
+-
+- // reading the values
+- NamedValue nv = null;
+- debug("The transformation's parameters as 'name = value' pairs:\n");
+-
+- for (int i = 0; i < values.length; i++) {
+- nv = (NamedValue) AnyConverter.toObject(new Type(NamedValue.class), values[i]);
+-
+- if (nv.Name != null && !nv.Name.equals("")) {
+- debug(nv.Name + " = " + nv.Value);
+- }
+-
+- if (nv.Name.equals("StylesheetURL")) {
+- stylesheeturl = (String) AnyConverter.toObject(
+- new Type(String.class), nv.Value);
+- } else if (nv.Name.equals("SourceURL")) {
+- sourceurl = (String) AnyConverter.toObject(
+- new Type(String.class), nv.Value);
+- } else if (nv.Name.equals("TargetURL")) {
+- targeturl = (String) AnyConverter.toObject(
+- new Type(String.class), nv.Value);
+- } else if (nv.Name.equals("SourceBaseURL")) {
+- sourcebaseurl = (String) AnyConverter.toObject(
+- new Type(String.class), nv.Value);
+- } else if (nv.Name.equals("TargetBaseURL")) {
+- targetbaseurl = (String) AnyConverter.toObject(
+- new Type(String.class), nv.Value);
+- } else if (nv.Name.equals("SystemType")) {
+- systype = (String) AnyConverter.toObject(
+- new Type(String.class), nv.Value);
+- } else if (nv.Name.equals("PublicType")) {
+- pubtype = (String) AnyConverter.toObject(
+- new Type(String.class), nv.Value);
+- }
+- }
+- }
+-
+- // --- XActiveDataSink xistream = aStream;
+- public void setInputStream(XInputStream aStream) {
+- m_xis = aStream;
+- }
+-
+- public com.sun.star.io.XInputStream getInputStream() {
+- return m_xis;
+- }
+-
+- // --- XActiveDataSource
+- public void setOutputStream(XOutputStream aStream) {
+- m_xos = aStream;
+- }
+-
+- public com.sun.star.io.XOutputStream getOutputStream() {
+- return m_xos;
+- }
+-
+- // --- XActiveDataControl
+- public void addListener(XStreamListener aListener) {
+- if (aListener != null && !listeners.contains(aListener)) {
+- listeners.add(aListener);
+- }
+- }
+-
+- public void removeListener(XStreamListener aListener) {
+- if (aListener != null) {
+- listeners.removeElement(aListener);
+- }
+-
+- }
+-
+- public void start() {
+- // notify listeners
+- t = new Thread() {
+-
+- @Override
+- public void run() {
+-
+- // Local variabes used outside try block in finally block
+- InputStream is = null;
+- Source source = null;
+- BufferedOutputStream os = null;
+- PrintStream origOut = System.out;
+- PrintStream origErr = System.err;
+- if (statsp != null) {
+- System.setErr(statsp);
+- System.setOut(statsp);
+- }
+- try {
+- debug("\n\nStarting transformation...");
+-
+- // Set up context class loader for SAXParserFactory and
+- // TransformerFactory calls below:
+- setContextClassLoader(this.getClass().getClassLoader());
+-
+- for (Enumeration e = listeners.elements(); e.hasMoreElements();) {
+- XStreamListener l = (XStreamListener) e.nextElement();
+- l.started();
+- }
+-
+- XSeekable xseek = (XSeekable) UnoRuntime.queryInterface(XSeekable.class, m_xis);
+- if (xseek != null) {
+- xseek.seek(0);
+- }
+-
+- is = new BufferedInputStream(
+- new XInputStreamToInputStreamAdapter(m_xis));
+- //Source xmlsource = new StreamSource(xmlinput);
+- SAXParserFactory spf = SAXParserFactory.newInstance();
+- spf.setValidating(false);
+- spf.setNamespaceAware(true);
+- XMLReader xmlReader = spf.newSAXParser().getXMLReader();
+- xmlReader.setEntityResolver(XSLTransformer.this);
+- source = new SAXSource(xmlReader, new InputSource(is));
+-
+- // in order to help performance and to remedy a a possible memory
+- // leak in xalan, where it seems, that Transformer instances cannot
+- // be reclaimed though they are no longer referenced here, we use
+- // a cache of weak references (ie. xsltReferences) created for specific
+- // style sheet URLs see also #i48384#
+-
+- Templates xsltTemplate = null;
+- Transformer transformer = null;
+- Transformation transformation = null;
+- // File stylefile = new File(new URI(stylesheeturl));
+- long lastmod = 0;
+- try {
+- URL uStyle = new URL(stylesheeturl);
+- URLConnection c = uStyle.openConnection();
+- lastmod = c.getLastModified();
+- } catch (java.lang.Exception ex) {
+- // lastmod will remain at 0;
+- if (statsp != null) {
+- statsp.println(ex.getClass().getName() + ": " + ex.getMessage());
+- ex.printStackTrace(statsp);
+- }
+- }
+-
+- synchronized (xsltReferences) {
+- java.lang.ref.WeakReference ref = null;
+- // try to get the xsltTemplate reference from the cache
+- if ((ref = (java.lang.ref.WeakReference) xsltReferences.get(stylesheeturl)) == null ||
+- (transformation = ((Transformation) ref.get())) == null ||
+- ((Transformation) ref.get()).lastmod < lastmod) {
+- // we cannot find a valid reference for this stylesheet
+- // or the stylsheet was updated
+- if (ref != null) {
+- xsltReferences.remove(stylesheeturl);
+- }
+- // create new xsltTemplate for this stylesheet
+- TransformerFactory tfactory = TransformerFactory.newInstance();
+- debug("TransformerFactory is '" + tfactory.getClass().getName() + "'");
+- // some external saxons (Debian, Ubuntu, ...) have this disabled
+- // per default
+- tfactory.setAttribute(FeatureKeys.ALLOW_EXTERNAL_FUNCTIONS, new Boolean(true));
+- xsltTemplate = tfactory.newTemplates(new StreamSource(stylesheeturl));
+-
+- // store the transformation into the cache
+- transformation = new Transformation();
+- transformation.lastmod = lastmod;
+- transformation.cachedXSLT = xsltTemplate;
+- ref = new java.lang.ref.WeakReference(transformation);
+- xsltReferences.put(stylesheeturl, ref);
+- }
+- }
+- xsltTemplate = transformation.cachedXSLT;
+- transformer = xsltTemplate.newTransformer();
+- transformer.setOutputProperty("encoding", "UTF-8");
+- // transformer.setURIResolver(XSLTransformer.this);
+-
+- // invalid to set 'null' as parameter as 'null' is not a valid Java object
+- if (sourceurl != null) {
+- transformer.setParameter("sourceURL", sourceurl);
+- }
+- if (sourcebaseurl != null) {
+- transformer.setParameter("sourceBaseURL", sourcebaseurl);
+- }
+- if (targeturl != null) {
+- transformer.setParameter("targetURL", targeturl);
+- }
+- if (targetbaseurl != null) {
+- transformer.setParameter("targetBaseURL", targetbaseurl);
+- }
+- if (pubtype != null) {
+- transformer.setParameter("publicType", pubtype);
+- }
+- if (systype != null) {
+- transformer.setParameter("systemType", systype);
+- }
+- if (svcfactory != null) {
+- transformer.setParameter("XMultiServiceFactory", svcfactory);
+- }
+- os = new BufferedOutputStream(
+- new XOutputStreamToOutputStreamAdapter(m_xos));
+- StreamResult sr = new StreamResult(os);
+- long tstart = System.currentTimeMillis();
+- transformer.transform(source, sr);
+- debug("finished transformation in " + (System.currentTimeMillis() - tstart) + "ms");
+-
+- } catch (java.lang.Throwable ex) {
+- // notify any listeners about close
+- for (Enumeration e = listeners.elements(); e.hasMoreElements();) {
+-
+- XStreamListener l = (XStreamListener) e.nextElement();
+- l.error(new com.sun.star.uno.Exception(ex.getClass().getName() + ": " + ex.getMessage()));
+- }
+- if (statsp != null) {
+- statsp.println(ex.getClass().getName() + ": " + ex.getMessage());
+- ex.printStackTrace(statsp);
+- }
+- } finally {
+- // dereference input buffer
+- source = null;
+- try {
+- if (is != null) {
+- is.close();
+- }
+- } catch (java.lang.Throwable ex) {
+- if (statsp != null) {
+- statsp.println(ex.getClass().getName() + ": " + ex.getMessage());
+- ex.printStackTrace(statsp);
+- }
+- }
+- try {
+- if (os != null) {
+- os.close();
+- }
+- } catch (java.lang.Throwable ex) {
+- if (statsp != null) {
+- statsp.println(ex.getClass().getName() + ": " + ex.getMessage());
+- ex.printStackTrace(statsp);
+- }
+- }
+- try {
+- if (m_xis != null) {
+- m_xis.closeInput();
+- }
+- } catch (java.lang.Throwable ex) {
+- if (statsp != null) {
+- statsp.println(ex.getClass().getName() + ": " + ex.getMessage());
+- ex.printStackTrace(statsp);
+- }
+- }
+- try {
+- if (m_xos != null) {
+- m_xos.closeOutput();
+- }
+- } catch (java.lang.Throwable ex) {
+- if (statsp != null) {
+- statsp.println(ex.getClass().getName() + ": " + ex.getMessage());
+- ex.printStackTrace(statsp);
+- }
+- }
+-
+- // resetting standard input/error streams from logfile to default
+- if (statsp != null) {
+- System.setErr(origErr);
+- System.setOut(origOut);
+- }
+- // try to release references asap...
+- m_xos = null;
+- m_xis = null;
+- is = null;
+- os = null;
+- // notify any listeners about close
+- if (listeners != null) {
+- for (Enumeration e = listeners.elements(); e.hasMoreElements();) {
+- XStreamListener l = (XStreamListener) e.nextElement();
+- l.closed();
+- }
+- }
+- }
+- }
+- };
+- t.start();
+- } /* a statsfile have to be created as precondition to use this function */
+-
+-
+- private static final void debug(String s) {
+- if (statsp != null) {
+- statsp.println(s);
+- }
+- }
+-
+- public void terminate() {
+- try {
+- debug("terminate called");
+- if (t.isAlive()) {
+- t.interrupt();
+- for (Enumeration e = listeners.elements(); e.hasMoreElements();) {
+- XStreamListener l = (XStreamListener) e.nextElement();
+- l.terminated();
+- }
+- }
+- } catch (java.lang.Exception ex) {
+- if (statsp != null) {
+- statsp.println(ex.getClass().getName() + ": " + ex.getMessage());
+- ex.printStackTrace(statsp);
+- }
+- }
+- } // --- component management interfaces... ---
+- private final static String _serviceName = "com.sun.star.xml.xslt.XSLT2Transformer";
+-
+- // Implement methods from interface XTypeProvider
+- public byte[] getImplementationId() {
+- byte[] byteReturn = {};
+- byteReturn = new String("" + this.hashCode()).getBytes();
+- return (byteReturn);
+- }
+-
+- public com.sun.star.uno.Type[] getTypes() {
+- Type[] typeReturn = {};
+- try {
+- typeReturn = new Type[]{
+- new Type(XTypeProvider.class),
+- new Type(XServiceName.class),
+- new Type(XServiceInfo.class),
+- new Type(XActiveDataSource.class),
+- new Type(XActiveDataSink.class),
+- new Type(XActiveDataControl.class),
+- new Type(XInitialization.class)
+- };
+- } catch (java.lang.Exception exception) {
+- }
+-
+- return (typeReturn);
+- }
+-
+- // --- Implement method from interface XServiceName ---
+- public String getServiceName() {
+- return (_serviceName);
+- }
+-
+- // --- Implement methods from interface XServiceInfo ---
+- public boolean supportsService(String stringServiceName) {
+- return (stringServiceName.equals(_serviceName));
+- }
+-
+- public String getImplementationName() {
+- return (XSLTransformer.class.getName());
+- }
+-
+- public String[] getSupportedServiceNames() {
+- String[] stringSupportedServiceNames = {_serviceName};
+- return stringSupportedServiceNames;
+- }
+-
+- // --- component registration methods ---
+- public static XSingleServiceFactory __getServiceFactory(
+- String implName, XMultiServiceFactory multiFactory, XRegistryKey regKey) {
+- XSingleServiceFactory xSingleServiceFactory = null;
+- if (implName.equals(XSLTransformer.class.getName())) {
+- xSingleServiceFactory = FactoryHelper.getServiceFactory(XSLTransformer.class,
+- _serviceName, multiFactory, regKey);
+- }
+- return xSingleServiceFactory;
+- }
+-}
+diff --git a/filter/source/xsltfilter/components.rdb b/filter/source/xsltfilter/components.rdb
+deleted file mode 100644
+index 6014b82..0000000
+--- a/filter/source/xsltfilter/components.rdb
++++ /dev/null
+@@ -1,8 +0,0 @@
+-<?xml version="1.0"?>
+-<components xmlns="http://openoffice.org/2010/uno-components">
+- <component loader="com.sun.star.loader.Java2" uri="./XSLTFilter.jar">
+- <implementation name="com.sun.star.comp.xsltfilter.XSLTransformer">
+- <service name="com.sun.star.xml.xslt.XSLT2Transformer"/>
+- </implementation>
+- </component>
+-</components>
+diff --git a/filter/source/xsltfilter/description-en-US.txt b/filter/source/xsltfilter/description-en-US.txt
+deleted file mode 100644
+index 88c8abf..0000000
+--- a/filter/source/xsltfilter/description-en-US.txt
++++ /dev/null
+@@ -1 +0,0 @@
+-The xslt2-transformer implements a transformer for XSLT import/export filters with support for XSLT 2.0.
+diff --git a/filter/source/xsltfilter/description.xml b/filter/source/xsltfilter/description.xml
+deleted file mode 100644
+index ae6abcb..0000000
+--- a/filter/source/xsltfilter/description.xml
++++ /dev/null
+@@ -1,28 +0,0 @@
+-<?xml version="1.0" encoding="UTF-8"?>
+-<description
+-
+- xmlns="http://openoffice.org/extensions/description/2006"
+- xmlns:dep="http://libreoffice.org/extensions/description/2011"
+- xmlns:xlink="http://www.w3.org/1999/xlink">
+-
+- <identifier value="org.libreoffice.JavaXSLT2Transformer"/>
+-
+- <dependencies>
+- <dep:LibreOffice-minimal-version value="3.7"/>
+- </dependencies>
+-
+- <version value="1.0.0"/>
+-
+- <publisher>
+- <name xlink:href="http://www.documentfoundation.org" lang="en-US">The Document Foundation</name>
+- </publisher>
+-
+- <display-name>
+- <name lang="en-US">XSLT 2.0 transformer</name>
+- </display-name>
+-
+- <extension-description>
+- <src xlink:href="description-en-US.txt" lang="en-US" />
+- </extension-description>
+-
+-</description>
+diff --git a/filter/source/xsltfilter/manifest.xml b/filter/source/xsltfilter/manifest.xml
+deleted file mode 100644
+index a443e65..0000000
+--- a/filter/source/xsltfilter/manifest.xml
++++ /dev/null
+@@ -1,6 +0,0 @@
+-<?xml version="1.0" encoding="UTF-8"?>
+-<!DOCTYPE manifest:manifest PUBLIC "-//OpenOffice.org//DTD Manifest 1.0//EN" "Manifest.dtd">
+-<manifest:manifest xmlns:manifest="http://openoffice.org/2001/manifest">
+- <manifest:file-entry manifest:media-type="application/vnd.sun.star.uno-components"
+- manifest:full-path="components.rdb"/>
+-</manifest:manifest>
+--
+1.7.11.7
+
diff --git a/0004-remove-all-traces-of-saxon.patch b/0004-remove-all-traces-of-saxon.patch
new file mode 100644
index 0000000..7c90ca2
--- /dev/null
+++ b/0004-remove-all-traces-of-saxon.patch
@@ -0,0 +1,1650 @@
+From acbef0543f72f48ff135864eed181a1111fc0700 Mon Sep 17 00:00:00 2001
+From: David Tardon <dtardon at redhat.com>
+Date: Wed, 10 Oct 2012 17:42:46 +0200
+Subject: [PATCH 4/4] remove all traces of saxon
+
+(cherry picked from commit 725eba738eae4eee6cd9b833d375db5463833119)
+
+Conflicts:
+ Makefile.top
+ Module_tail_build.mk
+ RepositoryExternal.mk
+ config_host.mk.in
+ configure.ac
+ ooo.lst.in
+ readlicense_oo/html/LICENSE.html
+ saxon/prj/build.lst
+ saxon/prj/d.lst
+ tail_build/prj/build.lst
+
+Change-Id: I33ca2c27d557d24e3900d7ebf8f3ea2d99b3cfb0
+---
+ Makefile.top | 1 -
+ RepositoryExternal.mk | 14 -
+ config_host.mk.in | 3 -
+ configure.in | 138 ---
+ filter/prj/build.lst | 2 +-
+ ooo.lst.in | 5 -
+ readlicense_oo/html/THIRDPARTYLICENSEREADME.html | 14 +-
+ readlicense_oo/txt/NOTICE | 5 -
+ readlicense_oo/txt/license.txt | 14 -
+ saxon/README | 1 -
+ saxon/makefile.mk | 69 --
+ saxon/prj/build.lst | 2 -
+ saxon/prj/d.lst | 1 -
+ saxon/saxon-9.0.0.7-bj.patch | 1031 ----------------------
+ stax/README | 1 -
+ stax/makefile.mk | 78 --
+ stax/prj/build.lst | 2 -
+ stax/prj/d.lst | 1 -
+ tail_build/prj/build.lst | 2 +-
+ 19 files changed, 3 insertions(+), 1381 deletions(-)
+ delete mode 100644 saxon/README
+ delete mode 100644 saxon/makefile.mk
+ delete mode 100644 saxon/prj/build.lst
+ delete mode 100644 saxon/prj/d.lst
+ delete mode 100644 saxon/prj/dmake
+ delete mode 100644 saxon/saxon-9.0.0.7-bj.patch
+ delete mode 100644 stax/README
+ delete mode 100644 stax/makefile.mk
+ delete mode 100644 stax/prj/build.lst
+ delete mode 100644 stax/prj/d.lst
+ delete mode 100644 stax/prj/dmake
+
+diff --git a/Makefile.top b/Makefile.top
+index 7451445..c84cc6f 100644
+--- a/Makefile.top
++++ b/Makefile.top
+@@ -232,7 +232,6 @@ rhino\
+ saxon\
+ setup_native\
+ soltools\
+-stax\
+ stlport\
+ sysui\
+ tomcat\
+diff --git a/RepositoryExternal.mk b/RepositoryExternal.mk
+index 730043c..b8a3cbd 100644
+--- a/RepositoryExternal.mk
++++ b/RepositoryExternal.mk
+@@ -1698,20 +1698,6 @@ endif
+
+ ### Jars ############################################################
+
+-ifeq ($(SYSTEM_SAXON),YES)
+-
+-define gb_JavaClassSet__use_saxon
+-$(call gb_JavaClassSet_use_system_jar,$(1),$(SAXON_JAR))
+-endef
+-
+-else # !SYSTEM_SAXON
+-
+-define gb_JavaClassSet__use_saxon
+-$(call gb_JavaClassSet_use_jar,$(1),$(OUTDIR)/bin/saxon9.jar)
+-endef
+-
+-endif # SYSTEM_SAXON
+-
+ ifeq ($(SYSTEM_BSH),YES)
+
+ define gb_JavaClassSet__use_bsh
+diff --git a/config_host.mk.in b/config_host.mk.in
+index 4fb80d1..f643039 100644
+--- a/config_host.mk.in
++++ b/config_host.mk.in
+@@ -32,7 +32,6 @@ export BUILD_MOZAB=@BUILD_MOZAB@
+ export BUILD_NCPUS=@BUILD_NCPUS@
+ export BUILD_PLATFORM=@build@
+ export BUILD_POSTGRESQL_SDBC=@BUILD_POSTGRESQL_SDBC@
+-export BUILD_STAX=@BUILD_STAX@
+ export BUILD_TYPE=@BUILD_TYPE@
+ export BUILD_UNOWINREG=@BUILD_UNOWINREG@
+ export BUILD_VER_STRING=@BUILD_VER_STRING@
+@@ -433,7 +432,6 @@ export RTL_OS=@RTL_OS@
+ export RTL_ARCH=@RTL_ARCH@
+ export SAC_JAR=@SAC_JAR@
+ export SAL_ENABLE_FILE_LOCKING=1
+-export SAXON_JAR=@SAXON_JAR@
+ export SCPDEFS=@SCPDEFS@
+ export SERVLETAPI_JAR=@SERVLETAPI_JAR@
+ export SHOWINCLUDES_PREFIX=@SHOWINCLUDES_PREFIX@
+@@ -528,7 +526,6 @@ export SYSTEM_POSTGRESQL=@SYSTEM_POSTGRESQL@
+ export SYSTEM_PYTHON=@SYSTEM_PYTHON@
+ export SYSTEM_REDLAND=@SYSTEM_REDLAND@
+ export SYSTEM_RHINO=@SYSTEM_RHINO@
+-export SYSTEM_SAXON=@SYSTEM_SAXON@
+ export SYSTEM_SERVLETAPI=@SYSTEM_SERVLETAPI@
+ export SYSTEM_STDLIBS=@SYSTEM_STDLIBS@
+ export SYSTEM_VIGRA=@SYSTEM_VIGRA@
+diff --git a/configure.in b/configure.in
+index b2ae537..0b286ee 100644
+--- a/configure.in
++++ b/configure.in
+@@ -1427,16 +1427,6 @@ AC_ARG_WITH(libbase-jar,
+ [Specify path to jarfile manually.]),
+ LIBBASE_JAR=$withval)
+
+-AC_ARG_WITH(system-saxon,
+- AS_HELP_STRING([--with-system-saxon],
+- [Use saxon already on system.]),,
+- [with_system_saxon="$with_system_jars"])
+-
+-AC_ARG_WITH(saxon-jar,
+- AS_HELP_STRING([--with-saxon-jar=JARFILE],
+- [Specify path to jarfile manually.]),
+- SAXON_JAR=$withval)
+-
+ AC_ARG_WITH(system-odbc,
+ AS_HELP_STRING([--with-system-odbc],
+ [Use the odbc headers already on system.]),,
+@@ -7066,134 +7056,6 @@ AC_SUBST(SYSTEM_POSTGRESQL)
+ AC_SUBST(POSTGRESQL_INC)
+ AC_SUBST(POSTGRESQL_LIB)
+
+-
+-dnl ===================================================================
+-dnl Check for system saxon
+-dnl ===================================================================
+-if test "$with_java" != "no"; then
+-AC_MSG_CHECKING([which saxon to use])
+-if test "$with_system_saxon" = "yes"; then
+- AC_MSG_RESULT([external])
+- SYSTEM_SAXON=YES
+- if test -z $SAXON_JAR; then
+- AC_CHECK_FILE(/usr/share/java/saxon9.jar,
+- [ SAXON_JAR=/usr/share/java/saxon9.jar ],
+- [
+- AC_CHECK_FILE(/usr/share/java/saxon.jar,
+- [ SAXON_JAR=/usr/share/java/saxon.jar ],
+- [ AC_CHECK_FILE(/usr/share/java/saxon9.jar,
+- [ SAXON_JAR=/usr/share/java/saxon9.jar ],
+- [ AC_MSG_ERROR(saxon.jar replacement not found)]
+- )
+- ]
+- )
+- ]
+- )
+- else
+- AC_CHECK_FILE($SAXON_JAR, [],
+- [AC_MSG_ERROR(saxon.jar replacement not found.)], [])
+- fi
+- if test -n "$SERIALIZER_JAR"; then
+- AC_CHECK_FILE($SERIALIZER_JAR, [],
+- [AC_MSG_ERROR(serializer.jar not found.)], [])
+- AC_SUBST(SERIALIZER_JAR)
+- fi
+-
+- dnl Saxon comes in two practically available versions, the out-of-date saxonb which
+- dnl supports the Java extensions that LibreOffice uses, and the up-to-date saxon he
+- dnl "home edition" version, which is crippled to not support those Java extensions.
+- dnl And as an aside the he one also needs to be tweaked to include
+- dnl a META-INF/services to broadcast that it supports the jaxp transform factory
+-
+- AC_MSG_CHECKING([if saxon works])
+- cat > saxontest.java <<_ACEOF
+-[import javax.xml.transform.TransformerFactory;
+-import javax.xml.transform.Transformer;
+-import javax.xml.transform.stream.StreamSource;
+-import java.io.*;
+-
+-import net.sf.saxon.FeatureKeys;
+-
+-class saxontest {
+- public static void main(String[] args) {
+- System.setProperty("javax.xml.transform.TransformerFactory",
+- "net.sf.saxon.TransformerFactoryImpl");
+- try {
+- TransformerFactory tfactory = TransformerFactory.newInstance();
+- // some external saxons (Debian, Ubuntu, ...) have this disabled
+- // per default
+- tfactory.setAttribute(FeatureKeys.ALLOW_EXTERNAL_FUNCTIONS, new Boolean(true));
+- System.out.println("TransformerFactory is" +
+- tfactory.getClass().getName());
+- Transformer transformer = tfactory.newTransformer(
+- new StreamSource(new File(args[0])));
+- } catch(Exception e){
+- e.printStackTrace(System.err);
+- System.exit(-1);
+- }
+- System.exit(0);
+- }
+-}
+-]
+-_ACEOF
+-
+- cat > saxontest.xsl<<_ACEOF
+-[<?xml version="1.0" encoding="UTF-8"?>
+-<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+- <xsl:template match="/">
+- <xsl:value-of select="math:sqrt(1)" xmlns:math="java:java.lang.Math"/>
+- </xsl:template>
+-</xsl:stylesheet>
+-]
+-_ACEOF
+-
+- javac_cmd="$JAVACOMPILER -cp $SAXON_JAR saxontest.java 1>&2"
+- AC_TRY_EVAL(javac_cmd)
+- if test $? = 0 -a -f ./saxontest.class; then
+- java_cmd="$JAVAINTERPRETER -cp $SAXON_JAR:. saxontest saxontest.xsl 1>&2"
+- AC_TRY_EVAL(java_cmd)
+- if test $? = 0; then
+- AC_MSG_RESULT([yes])
+- else
+- cat saxontest.java >&5
+- AC_MSG_RESULT([no])
+- AC_MSG_ERROR([Non-functional saxon jar, e.g. crippled saxon-he instead of saxonb])
+- fi
+- else
+- AC_MSG_RESULT([no])
+- cat saxontest.java >&5
+- AC_MSG_ERROR([saxontest could not be compiled, non-functional saxon jar])
+- fi
+-else
+- AC_MSG_RESULT([internal])
+- SYSTEM_SAXON=NO
+- NEED_SAXON=TRUE
+-fi
+-fi
+-AC_SUBST(SYSTEM_SAXON)
+-AC_SUBST(SAXON_JAR)
+-
+-if test -n "$NEED_SAXON"; then
+- BUILD_TYPE="$BUILD_TYPE SAXON"
+-fi
+-
+-# ===================================================================
+-# Check whether to build stax
+-# ===================================================================
+-AC_MSG_CHECKING([whether building the stax is required])
+-BUILD_STAX=NO
+-if test -z "$SOLAR_JAVA"; then
+- AC_MSG_RESULT([no (java disabled)])
+-elif test "$SYSTEM_SAXON" = "YES"; then
+- AC_MSG_RESULT([no (already provided by system saxon)])
+-elif test -f "./stax/download/jsr173_1.0_api.jar"; then
+- AC_MSG_RESULT([no (will use the prebuilt stax/download/jsr173_1.0_api.jar)])
+-else
+- BUILD_STAX=YES
+- AC_MSG_RESULT([yes (no system saxon and no prebuilt copy)])
+-fi
+-AC_SUBST(BUILD_STAX)
+-
+ dnl ===================================================================
+ dnl Check for system curl
+ dnl ===================================================================
+diff --git a/filter/prj/build.lst b/filter/prj/build.lst
+index 9083dc7..2319f39 100644
+--- a/filter/prj/build.lst
++++ b/filter/prj/build.lst
+@@ -1,2 +1,2 @@
+-fl filter : TRANSLATIONS:translations svtools unotools xmloff cppu tools cppuhelper sal salhelper svx javaunohelper XPDF:xpdf jvmaccess canvas SAXON:saxon LIBXSLT:libxslt basegfx package PYTHON:python NULL
++fl filter : TRANSLATIONS:translations svtools unotools xmloff cppu tools cppuhelper sal salhelper svx javaunohelper XPDF:xpdf jvmaccess canvas LIBXSLT:libxslt basegfx package PYTHON:python NULL
+ fl filter\prj nmake - all fl_prj NULL
+diff --git a/ooo.lst.in b/ooo.lst.in
+index 02d14b0..4d5b977 100644
+--- a/ooo.lst.in
++++ b/ooo.lst.in
+@@ -8,7 +8,6 @@ c63f411b3ad147db2bcce1bf262a0e02-pixman-0.24.4.tar.bz2
+ 1756c4fa6c616ae15973c104cd8cb256-Adobe-Core35_AFMs-314.tar.gz
+ 18f577b374d60b3c760a3a3350407632-STLport-4.5.tar.gz
+ 1f24ab1d39f4a51faf22244c94a6203f-xmlsec1-1.2.14.tar.gz
+-24be19595acad0a2cae931af77a0148a-LICENSE_source-9.0.0.7-bj.html
+ 26b3e95ddf3d9c077c480ea45874b3b8-lp_solve_5.5.tar.gz
+ 284e768eeda0e2898b0d5bf7e26a016e-raptor-1.4.18.tar.gz
+ 2a177023f9ea8ec8bd00837605c5df1b-jakarta-tomcat-5.0.30-src.tar.gz
+@@ -30,12 +29,9 @@ f101a9e88b783337b20b2e26dfd26d5f-cairo-1.10.2.tar.gz
+ 7376930b0d3f3d77a685d94c4a3acda8-STLport-4.5-0119.tar.gz
+ 798b2ffdc8bcfe7bca2cf92b62caf685-rhino1_5R5.zip
+ ecb2e37e45c9933e2a963cabe03670ab-curl-7.19.7.tar.gz
+-8294d6c42e3553229af9934c5c0ed997-stax-api-1.0-2-sources.jar
+ bd30e9cf5523cdfc019b94f5e1d7fd19-cppunit-1.12.1.tar.gz
+ a169ab152209200a7bad29a275cb0333-seamonkey-1.1.14.source.tar.gz
+-a4d9b30810a434a3ed39fc0003bbd637-LICENSE_stax-api-1.0-2-sources.html
+ a7983f859eafb2677d7ff386a023bc40-xsltml_2.1.2.zip
+-ada24d37d8d638b3d8a9985e80bc2978-source-9.0.0.7-bj.zip
+ af3c3acf618de6108d65fcdc92b492e1-commons-codec-1.3-src.tar.gz
+ bc702168a2af16869201dbe91e46ae48-LICENSE_Python-2.6.1
+ c441926f3a552ed3e5b274b62e86af16-STLport-4.0.tar.gz
+@@ -48,7 +44,6 @@ e61d0364a30146aaa3001296f853b2b9-libxslt-1.1.26.tar.gz
+ ea570af93c284aa9e5621cd563f54f4d-bsh-2.0b1-src.tar.gz
+ ea91f2fb4212a21d708aced277e6e85a-vigra1.4.0.tar.gz
+ dd7dab7a5fea97d2a6a43f511449b7cd-expat-2.1.0.tar.gz
+-fb7ba5c2182be4e73748859967455455-README_stax-api-1.0-2-sources.txt
+ fca8706f2c4619e2fa3f8f42f8fc1e9d-rasqal-0.9.16.tar.gz
+ f872f4ac066433d8ff92f5e316b36ff9-dejavu-fonts-ttf-2.33.zip
+ 0981bda6548a8c8233ffce2b6e4b2a23-mysql-connector-c++-1.1.0.tar.gz
+diff --git a/readlicense_oo/html/THIRDPARTYLICENSEREADME.html b/readlicense_oo/html/THIRDPARTYLICENSEREADME.html
+index 46fc32f..4fca83d 100644
+--- a/readlicense_oo/html/THIRDPARTYLICENSEREADME.html
++++ b/readlicense_oo/html/THIRDPARTYLICENSEREADME.html
+@@ -2110,18 +2110,6 @@ FITNESS FOR A PARTICULAR PURPOSE.</P>
+ <P CLASS="western" STYLE="margin-top: 0.3cm; margin-bottom: 0.3cm">This
+ file declares SANE application interface. See the SANE standard for a
+ detailed explanation of the interface.</P>
+-<H2 CLASS="western">Saxon (B)</H2>
+-<P CLASS="western" STYLE="margin-top: 0.3cm; margin-bottom: 0.3cm">The
+-following software may be included in this product: Saxon (B). Use of
+-any of this software is governed by the terms of the license below:</P>
+-<P CLASS="western" STYLE="margin-top: 0.3cm; margin-bottom: 0.3cm"><A HREF="#10.Mozilla Public License Version 1.1|outline">Jump
+-to MPL Version 1.1</A></P>
+-<H2 CLASS="western">Stax</H2>
+-<P CLASS="western" STYLE="margin-top: 0.3cm; margin-bottom: 0.3cm">The
+-following software may be included in this product: Stax API. Use of
+-any of this software is governed by the terms of the license below:</P>
+-<P CLASS="western" STYLE="margin-top: 0.3cm; margin-bottom: 0.3cm"><A HREF="#11.Apache License|outline">Jump
+-to Apache License Version 2.0</A></P>
+ <H2 CLASS="western">STLPort</H2>
+ <P CLASS="western" STYLE="margin-top: 0.3cm; margin-bottom: 0.3cm">The
+ following software may be included in this product:STLport. Use of
+@@ -9429,4 +9417,4 @@ this trademark restriction does not form part of the License.</P>
+ <P CLASS="western" STYLE="margin-top: 0.3cm; margin-bottom: 0.3cm">Creative
+ Commons may be contacted at <A HREF="http://creativecommons.org/">http://creativecommons.org/</A>.</P>
+ </BODY>
+-</HTML>
+\ No newline at end of file
++</HTML>
+diff --git a/readlicense_oo/txt/NOTICE b/readlicense_oo/txt/NOTICE
+index 181aea7..8edf0f0 100644
+--- a/readlicense_oo/txt/NOTICE
++++ b/readlicense_oo/txt/NOTICE
+@@ -139,7 +139,6 @@ As part of the base system this product also includes code from the following
+ projects which are licensed under the Apache license:
+ - serf
+ - redland
+-- StAX
+
+ The notices from these projects are following:
+
+@@ -153,10 +152,6 @@ This product includes Redland software (http://librdf.org/)
+ developed at the Institute for Learning and Research Technology,
+ University of Bristol, UK (http://www.bristol.ac.uk/).
+
+-
+-StAX
+-[no notices]
+-
+ ____
+
+ This product includes software developed by the OpenSSL Project
+diff --git a/readlicense_oo/txt/license.txt b/readlicense_oo/txt/license.txt
+index 6acf5b6d..137a892 100644
+--- a/readlicense_oo/txt/license.txt
++++ b/readlicense_oo/txt/license.txt
+@@ -2057,20 +2057,6 @@ SANE
+ This file declares SANE application interface. See the SANE standard
+ for a detailed explanation of the interface.
+
+-Saxon (B)
+-
+- The following software may be included in this product: Saxon (B). Use
+- of any of this software is governed by the terms of the license below:
+-
+- See MPL Version 1.1 below
+-
+-Stax
+-
+- The following software may be included in this product: Stax API. Use
+- of any of this software is governed by the terms of the license below:
+-
+- See Apache License Version 2.0 below
+-
+ STLPort
+
+ The following software may be included in this product:STLport. Use of
+diff --git a/saxon/README b/saxon/README
+deleted file mode 100644
+index 26344a7..0000000
+--- a/saxon/README
++++ /dev/null
+@@ -1 +0,0 @@
+-XSLT and XQuery Processor from [[http://saxon.sourceforge.net/]]
+diff --git a/saxon/makefile.mk b/saxon/makefile.mk
+deleted file mode 100644
+index 40a7404..0000000
+--- a/saxon/makefile.mk
++++ /dev/null
+@@ -1,69 +0,0 @@
+-#*************************************************************************
+-#
+-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+-#
+-# Copyright 2000, 2010 Oracle and/or its affiliates.
+-#
+-# OpenOffice.org - a multi-platform office productivity suite
+-#
+-# This file is part of OpenOffice.org.
+-#
+-# OpenOffice.org is free software: you can redistribute it and/or modify
+-# it under the terms of the GNU Lesser General Public License version 3
+-# only, as published by the Free Software Foundation.
+-#
+-# OpenOffice.org 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 Lesser General Public License version 3 for more details
+-# (a copy is included in the LICENSE file that accompanied this code).
+-#
+-# You should have received a copy of the GNU Lesser General Public License
+-# version 3 along with OpenOffice.org. If not, see
+-# <http://www.openoffice.org/license.html>
+-# for a copy of the LGPLv3 License.
+-#
+-#*************************************************************************
+-
+-PRJ=.
+-
+-PRJNAME=saxon
+-TARGET=saxon
+-
+-# --- Settings -----------------------------------------------------
+-
+-.INCLUDE : settings.mk
+-.INCLUDE : antsettings.mk
+-
+-.IF "$(SOLAR_JAVA)" != ""
+-.IF "$(SYSTEM_SAXON)" == "YES"
+-all:
+- @echo "An already available installation of saxon should exist on your system."
+- @echo "Therefore the version provided here does not need to be built in addition."
+-.ENDIF
+-
+-# --- Files --------------------------------------------------------
+-
+-TARFILE_NAME=source-9.0.0.7-bj
+-TARFILE_MD5=ada24d37d8d638b3d8a9985e80bc2978
+-ADDITIONAL_FILES=build.xml
+-TARFILE_ROOTDIR=src
+-
+-PATCH_FILES=saxon-9.0.0.7-bj.patch
+-
+-BUILD_ACTION="$(ANT)" $(ANT_FLAGS) -Dsolarbindir=$(SOLARBINDIR) jar-bj
+-
+-OUT2CLASS= saxon-build$/9.0.0.7$/bj$/saxon9.jar
+-
+-.ELSE # $(SOLAR_JAVA)!= ""
+-nojava:
+- @echo "Not building $(PRJNAME) because Java is disabled"
+-.ENDIF # $(SOLAR_JAVA)!= ""
+-# --- Targets ------------------------------------------------------
+-
+-.INCLUDE : set_ext.mk
+-.INCLUDE : target.mk
+-.IF "$(SOLAR_JAVA)" != ""
+-.INCLUDE : tg_ext.mk
+-.ENDIF
+-
+diff --git a/saxon/prj/build.lst b/saxon/prj/build.lst
+deleted file mode 100644
+index 813097c..0000000
+--- a/saxon/prj/build.lst
++++ /dev/null
+@@ -1,2 +0,0 @@
+-xx saxon : solenv stax NULL
+-xx saxon nmake - all xx_saxon NULL
+diff --git a/saxon/prj/d.lst b/saxon/prj/d.lst
+deleted file mode 100644
+index 0793dad..0000000
+--- a/saxon/prj/d.lst
++++ /dev/null
+@@ -1 +0,0 @@
+-..\%__SRC%\class\saxon9.jar %_DEST%\bin\saxon9.jar
+diff --git a/saxon/prj/dmake b/saxon/prj/dmake
+deleted file mode 100644
+index e69de29..0000000
+diff --git a/saxon/saxon-9.0.0.7-bj.patch b/saxon/saxon-9.0.0.7-bj.patch
+deleted file mode 100644
+index 11d3091..0000000
+--- a/saxon/saxon-9.0.0.7-bj.patch
++++ /dev/null
+@@ -1,1031 +0,0 @@
+---- misc/src/build.xml 2008-07-11 12:11:50.079281000 +0200
+-+++ misc/build/src/build.xml 2008-07-11 12:17:29.848740000 +0200
+-@@ -1 +1,1027 @@
+--dummy
+-+<?xml version="1.0" encoding="UTF-8"?>
+-+
+-+<project basedir="." default="all" name="Saxon-B The XSLT and XQuery Processor"
+-+ xmlns:dn="antlib:org.apache.ant.dotnet">
+-+
+-+
+-+ <!-- TODO *really* Must publish NOTICES directory with patch releases. Should also
+-+ publish doc directory, and add a notice concerning Saxon/MPL itself, as per section 3.6 of MPL 1.0 -->
+-+
+-+ <!--TODO: 1: ensure saxon9api.netmodule is included in the build
+-+ 2: remove the archive target before shipping this file-->
+-+
+-+ <!-- note : Ant 1.7 is needed for this script -->
+-+
+-+ <!-- Ant 1.7 introduces a <service> element to allow META-INF/services
+-+ directories to be created in JAR files. Unfortunately it is broken,
+-+ see http://issues.apache.org/bugzilla/show_bug.cgi?id=41201. The relevant
+-+ code here is retained in the form of comments, and can be reinstated
+-+ when the bug is fixed. Meanwhile the directories are created manually -->
+-+
+-+ <!-- Build file for Saxon. This builds all four for the released products:
+-+ Saxon-B and Saxon-SA, on both the Java and .NET platforms. It also builds
+-+ the released resources file. A full build requires access to Saxonica
+-+ proprietary source code. The open source Saxon-B product can be built for
+-+ Java using target "bj"; but building Saxon-B for .NET may require some
+-+ disentangling of tasks that depend on Saxon-SA being present. -->
+-+
+-+ <!-- Useful targets:
+-+
+-+ clean clears temporary directories
+-+ bj builds executables for Saxon-B
+-+ saj builds executables for Saxon-B and Saxon-SA
+-+ n builds executables for Saxon on .NET
+-+ build builds all executables
+-+ resources builds samples and documentation
+-+ release builds ZIP files for published downloads
+-+ archive produces a back-up archive -->
+-+
+-+
+-+ <!-- Naming conventions:
+-+ -n : .NET
+-+ -j : Java
+-+ -b : Saxon-B
+-+ -sa : Saxon-SA
+-+ combined as appropriate, so -bj denotes Saxon-B on the Java platform
+-+ -->
+-+
+-+ <property name="version" value="9.0.0.7"/>
+-+ <property name="versionh" value="9-0-0-7"/>
+-+ <property name="release.date" value="2008-07-03"/>
+-+
+-+ <!-- following locations are specific to the machine -->
+-+
+-+ <!-- root drive for input files-->
+-+ <property name="root" value="."/>
+-+
+-+ <!-- root drive for generated files-->
+-+ <property name="troot" value="."/>
+-+
+-+ <!-- directory holding Java source code -->
+-+ <property name="development-j.dir" value="${root}/MyJava/saxon8.x"/>
+-+
+-+ <!-- directory holding Java source code as in Subversion -->
+-+ <property name="subversion-j.dir" value="${root}"/>
+-+
+-+ <!-- directory holding latest patch state of Saxon-SA Java code -->
+-+ <property name="saj-patch.dir" value="${root}/saxon-90-patch"/>
+-+
+-+ <!-- directory holding Java test drivers -->
+-+ <property name="drivers-j.dir" value="${root}/MyJava/test"/>
+-+
+-+ <!-- directories holding C# source code -->
+-+ <property name="vss-n.dir" value="${root}/Documents and Settings/Mike/My Documents/Visual Studio 2005/Projects/Saxon.Api"/>
+-+
+-+ <!-- directory holding C# source code as in Subversion -->
+-+ <property name="subversion-n.dir" value="${root}/saxon-svn/latest9.0/bn/csource"/>
+-+
+-+ <!-- directory holding XML user documentation -->
+-+ <property name="userdoc.dir" value="${root}/MyJava/doc/saxon8"/>
+-+
+-+ <!-- directory holding .NET API documentation (which is built manually using NDOC -->
+-+ <property name="dotnetdoc.dir" value="${root}/MyDotNet/dotnetdoc"/>
+-+
+-+ <!-- directories holding use cases and sample applications -->
+-+ <property name="usercases.dir" value="${root}/MyJava/use-cases"/>
+-+ <property name="samples.dir" value="${root}/MyJava/samples"/>
+-+
+-+ <!-- directory in which to build the product for release -->
+-+ <property name="product.dir" value="${troot}/saxon-build/${version}"/>
+-+
+-+ <!-- directory in which to build the issued .ZIP files -->
+-+ <property name="issue.dir" value="${troot}/saxon-issues/saxon-issue-${release.date} (${version})"/>
+-+
+-+ <!-- location of the C# compiler -->
+-+ <property name="csharp.compiler" value="c:/Windows/Microsoft.NET/Framework/v1.1.4322/csc.exe"/>
+-+
+-+
+-+ <!-- following locations are for IKVMC code used to build the .NET product -->
+-+
+-+ <property name="development-ikvm.dir" value="${root}/MyDotNet"/>
+-+ <property name="ikvm.dir" value="${development-ikvm.dir}/ikvm-0.32.0.0"/>
+-+ <property name="generated.stubs.dir" value="${development-ikvm.dir}/stubs"/>
+-+ <property name="saxondotnet.snk" value="${development-ikvm.dir}/make/saxondotnet.snk"/>
+-+
+-+ <!-- Precondition for .NET compilation: IKVM is installed.
+-+ * Download from www.ikvm.net
+-+ * Unzip into ${development-ikvm.dir}
+-+ * Register in the GAC (access the Microsoft .NET Framework Configuration item in the
+-+ Windows Control Panel, and add the assemblies to the Assembly Cache.
+-+ At a minimum, install the IKVM.GNU.Classpath.dll and IKVM.Runtime.dll)
+-+ * Generate stubs in ${generated.stubs.dir}
+-+ for System.Xml.dll, System.Security.dll, and IKVM.GNU.Classpath.dll
+-+ -->
+-+
+-+ <!-- following locations are relative to the build file -->
+-+
+-+ <property name="lib.dir" value="libs"/>
+-+ <property name="temp.dir" value="temp"/>
+-+ <property name="archive.dir" value="archive"/>
+-+ <property name="services.dir" value="services"/>
+-+ <property name="temp-src-j.dir" value="${temp.dir}/j/source"/>
+-+ <property name="temp-src-nj.dir" value="${temp.dir}/n/jsource"/>
+-+ <property name="temp-src-nc.dir" value="${temp.dir}/n/csource"/>
+-+ <property name="classes-j.dir" value="${temp.dir}/j/classes"/>
+-+ <property name="classes-n.dir" value="${temp.dir}/n/classes"/>
+-+ <property name="jar-n.dir" value="${temp.dir}/n/jar"/>
+-+ <property name="dll-n.dir" value="${temp.dir}/n/dll"/>
+-+
+-+ <!-- following locations are relative to the destination directory -->
+-+
+-+ <property name="build-bj.dir" value="${product.dir}/bj"/>
+-+ <property name="build-saj.dir" value="${product.dir}/saj"/>
+-+ <property name="build-bn.dir" value="${product.dir}/bn"/>
+-+ <property name="build-san.dir" value="${product.dir}/san"/>
+-+ <property name="build-resources.dir" value="${product.dir}/resources"/>
+-+ <property name="javadoc.dir" value="${build-resources.dir}/doc/javadoc"/>
+-+
+-+
+-+ <property name="build.debug" value="true"/>
+-+ <property name="build.debuglevel" value="source,lines,vars"/>
+-+ <property name="build.deprecation" value="true"/>
+-+ <property name="build.optimize" value="true"/>
+-+ <property name="build.compiler.source" value="1.4"/>
+-+ <property name="build.compiler.target" value="1.4"/>
+-+ <property name="build.s9api.compiler.source" value="1.5"/>
+-+ <property name="build.s9api.compiler.target" value="1.5"/>
+-+ <property name="build.compress" value="false"/>
+-+
+-+ <!-- following properties can be switched to determine whether to build from patch source
+-+ or from development source -->
+-+
+-+ <!-- patch source -->
+-+
+-+ <property name="source-bj.dir" value="${subversion-j.dir}"/>
+-+ <property name="source-saj.dir" value="${saj-patch.dir}"/>
+-+ <property name="source-api-n.dir" value="${subversion-n.dir}/api/Saxon.Api"/>
+-+ <property name="source-cmd-n.dir" value="${subversion-n.dir}/cmd"/>
+-+ <property name="source-samples-n.dir" value="${subversion-n.dir}/samples"/>
+-+
+-+ <!-- development source -->
+-+ <!--
+-+ <property name="source-bj.dir" value="${development-j.dir}"/>
+-+ <property name="source-saj.dir" value="${development-j.dir}"/>
+-+ <property name="source-api-n.dir" value="${vss-n.dir}"/>
+-+ <property name="source-cmd-n.dir" value="${vss-n.dir}"/>
+-+ <property name="source-samples-n.dir" value="${vss-n.dir}"/>
+-+ -->
+-+
+-+ <property name="solar.bin" value="${solarbindir}"/>
+-+ <path id="classpath-j">
+-+ <fileset dir="${solar.bin}">
+-+ <include name="jsr173_1.0_api.jar"/>
+-+ </fileset>
+-+ </path>
+-+
+-+ <path id="classpath-n">
+-+ <fileset dir="${lib.dir}">
+-+ <include name="*.jar"/>
+-+ </fileset>
+-+ <fileset dir="${ikvm.dir}">
+-+ <include name="classpath/mscorlib.jar"/>
+-+ <include name="classpath/System.jar"/>
+-+ <include name="bin/IKVM.GNU.Classpath.jar"/>
+-+ <include name="bin/IKVM.Runtime.jar"/>
+-+ </fileset>
+-+ <fileset dir="${generated.stubs.dir}">
+-+ <include name="System.Xml.jar"/>
+-+ <include name="System.Security.jar"/>
+-+ </fileset>
+-+ </path>
+-+
+-+ <path id="classpath-samples">
+-+ <fileset dir="${lib.dir}">
+-+ <include name="*.jar"/>
+-+ </fileset>
+-+ <fileset dir="${build-saj.dir}">
+-+ <include name="*.jar"/>
+-+ </fileset>
+-+ <!-- Substitute build-bj.dir if there is no requirement to compile the sample applications
+-+ that depend on Saxon-SA -->
+-+ </path>
+-+
+-+ <target name="clean" description="Clean all files other than source code and downloaded jars.">
+-+ <delete dir="${temp.dir}"/>
+-+ <delete dir="${product.dir}"/>
+-+ <mkdir dir="${product.dir}"/>
+-+ </target>
+-+
+-+ <target name="download" description="Download third-party jar files.">
+-+ <get src="http://mirrors.ibiblio.org/pub/mirrors/maven2/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar"
+-+ dest="${lib.dir}/dom4j-1.6.1.jar" verbose="true"/>
+-+
+-+ <get src="http://www.ibiblio.org/maven/jdom/jars/jdom-1.0.jar"
+-+ dest="${lib.dir}/jdom-1.0.jar" verbose="true"/>
+-+
+-+ <get src="http://www.cafeconleche.org/XOM/xom-1.1.jar" dest="${lib.dir}/xom-1.1.jar"
+-+ verbose="true"/>
+-+
+-+ <get src="http://dist.codehaus.org/stax/jars/stax-api-1.0.1.jar" dest="${lib.dir}/stax-api-1.0.1.jar"
+-+ verbose="true"/>
+-+
+-+ <!-- TODO: add servlet.jar, ant.jar -->
+-+
+-+ </target>
+-+
+-+
+-+ <target name="copysource-development" description="Copy relevant source files from development directory">
+-+ <copy todir="${temp-src-j.dir}">
+-+ <fileset dir="${source-bj.dir}">
+-+ <include name="net/sf/saxon/**/*.java"/>
+-+ <exclude name="**/dotnet/**"/>
+-+ <!--<exclude name="**/s9api/**"/> s9api needs Java 5 -->
+-+ <include name="net/sf/saxon/**/package.html"/>
+-+ </fileset>
+-+ <!--
+-+ <fileset dir="${source-saj.dir}">
+-+ <include name="com/saxonica/**/*.java"/>
+-+ <exclude name="com/saxonica/validate/DotNetVerifier.java"/>
+-+ <include name="com/saxonica/**/package.html"/>
+-+ </fileset>
+-+ -->
+-+ </copy>
+-+ <!--
+-+ <replace file="${temp-src-j.dir}/com/saxonica/validate/SchemaAwareConfiguration.java"
+-+ token="/*DOTNETONLY*/"
+-+ value="//"
+-+ summary="yes"/>
+-+ -->
+-+ <replace file="${temp-src-j.dir}/net/sf/saxon/Configuration.java"
+-+ token="/*DOTNETONLY*/"
+-+ value="//"
+-+ summary="yes"/>
+-+ <copy todir="${temp-src-nj.dir}">
+-+ <fileset dir="${source-bj.dir}">
+-+ <include name="net/sf/saxon/**/*.java"/>
+-+ <exclude name="**/ant/**"/>
+-+ <exclude name="**/dom/**"/>
+-+ <exclude name="**/dom4j/**"/>
+-+ <exclude name="**/java/**"/>
+-+ <exclude name="**/javax/**"/>
+-+ <exclude name="**/jdom/**"/>
+-+ <exclude name="**/pull/PullToStax.java"/>
+-+ <exclude name="**/pull/StaxBridge.java"/>
+-+ <!-- <exclude name="**/s9api/**"/> s9api needs Java 5 -->
+-+ <exclude name="**/xom/**"/>
+-+ <exclude name="**/xpath/**"/>
+-+ <exclude name="**/xqj/**"/>
+-+ </fileset>
+-+ <!--
+-+ <fileset dir="${source-saj.dir}">
+-+ <include name="com/saxonica/extra/*.java"/>
+-+ <include name="com/saxonica/fsa/*.java"/>
+-+ <include name="com/saxonica/ptree/*.java"/>
+-+ <include name="com/saxonica/schema/*.java"/>
+-+ <include name="com/saxonica/sdoc/*.java"/>
+-+ <include name="com/saxonica/validate/*.java"/>
+-+ <include name="com/saxonica/Validate.java"/>
+-+ </fileset>-->
+-+ </copy>
+-+ <!--
+-+ <replace file="${temp-src-nj.dir}/com/saxonica/validate/SchemaAwareConfiguration.java"
+-+ token="/*JAVAONLY*/"
+-+ value="//"
+-+ summary="yes"/>
+-+ -->
+-+ <replace file="${temp-src-nj.dir}/net/sf/saxon/Configuration.java"
+-+ token="/*JAVAONLY*/"
+-+ value="//"
+-+ summary="yes"/>
+-+ <!-- when building from development source
+-+ <copy todir="${temp-src-nc.dir}/api">
+-+ <fileset dir="${source-api-n.dir}">
+-+ <include name="Saxon.Api/*.cs"/>
+-+ </fileset>
+-+ </copy>
+-+
+-+ <copy todir="${temp-src-nc.dir}/cmd">
+-+ <fileset dir="${source-cmd-n.dir}/Transform">
+-+ <include name="*.cs"/>
+-+ </fileset>
+-+ <fileset dir="${source-cmd-n.dir}/Query">
+-+ <include name="*.cs"/>
+-+ </fileset>
+-+ <fileset dir="${source-cmd-n.dir}/Validate">
+-+ <include name="*.cs"/>
+-+ </fileset>
+-+ </copy>
+-+ <copy todir="${temp-src-nc.dir}/samples">
+-+ <fileset dir="${source-samples-n.dir}/XQueryExamples">
+-+ <include name="*.cs"/>
+-+ </fileset>
+-+ <fileset dir="${source-samples-n.dir}/XPathExample">
+-+ <include name="*.cs"/>
+-+ </fileset>
+-+ <fileset dir="${source-samples-n.dir}/XsltExamples">
+-+ <include name="*.cs"/>
+-+ </fileset>
+-+ <fileset dir="${source-samples-n.dir}/SchemaExamples">
+-+ <include name="*.cs"/>
+-+ </fileset>
+-+ <fileset dir="${source-samples-n.dir}/XsltTestSuiteDriver">
+-+ <include name="*.cs"/>
+-+ </fileset>
+-+ <fileset dir="${source-samples-n.dir}/XQueryTestSuiteDriver">
+-+ <include name="*.cs"/>
+-+ </fileset>
+-+ <fileset dir="${source-samples-n.dir}/SampleExtensions">
+-+ <include name="*.cs"/>
+-+ </fileset>
+-+ </copy>
+-+ -->
+-+ <!-- when building from patch source
+-+ <copy todir="${temp-src-nc.dir}/api/Saxon.Api">
+-+ <fileset dir="${source-api-n.dir}">
+-+ <include name="*.cs"/>
+-+ </fileset>
+-+ </copy>
+-+ <copy todir="${temp-src-nc.dir}/cmd" >
+-+ <fileset dir="${source-cmd-n.dir}">
+-+ <include name="*.cs"/>
+-+ </fileset>
+-+ </copy>
+-+ <copy todir="${temp-src-nc.dir}/samples">
+-+ <fileset dir="${source-samples-n.dir}">
+-+ <include name="*.cs"/>
+-+ </fileset>
+-+ </copy>
+-+ -->
+-+ <!-- -->
+-+
+-+ </target>
+-+
+-+ <target name="create-meta-inf" description="Create contents of META-INF/services files">
+-+
+-+ <!-- given the Ant 1.7.0 bug, create the services files here for copying into the JARS -->
+-+ <mkdir dir="${services.dir}/saxon9/META-INF/services"/>
+-+ <echo file="${services.dir}/saxon9/META-INF/services/javax.xml.transform.TransformerFactory"
+-+ message="net.sf.saxon.TransformerFactoryImpl"/>
+-+ <mkdir dir="${services.dir}/saxon9-xpath/META-INF/services"/>
+-+ <echo file="${services.dir}/saxon9-xpath/META-INF/services/javax.xml.xpath.XPathFactory"
+-+>net.sf.saxon.xpath.XPathFactoryImpl
+-+http\://java.sun.com/jaxp/xpath/dom: net.sf.saxon.xpath.XPathFactoryImpl
+-+http\://saxon.sf.net/jaxp/xpath/om: net.sf.saxon.xpath.XPathFactoryImpl
+-+http\://www.xom.nu/jaxp/xpath/xom: net.sf.saxon.xpath.XPathFactoryImpl
+-+http\://jdom.org/jaxp/xpath/jdom: net.sf.saxon.xpath.XPathFactoryImpl
+-+http\://www.dom4j.org/jaxp/xpath/dom4j: net.sf.saxon.xpath.XPathFactoryImpl
+-+</echo>
+-+ <mkdir dir="${services.dir}/saxon9sa/META-INF/services"/>
+-+ <echo file="${services.dir}/saxon9sa/META-INF/services/javax.xml.transform.TransformerFactory"
+-+ message="com.saxonica.SchemaAwareTransformerFactory"/>
+-+ <mkdir dir="${services.dir}/saxon9sa-jaxp/META-INF/services"/>
+-+ <echo file="${services.dir}/saxon9sa-jaxp/META-INF/services/javax.xml.validation.SchemaFactory"
+-+>com.saxonica.jaxp.SchemaFactoryImpl
+-+http\://www.w3.org/2001/XMLSchema: com.saxonica.jaxp.SchemaFactoryImpl
+-+</echo>
+-+
+-+
+-+ </target>
+-+
+-+ <target name="compile-bj" description="Compile Saxon-B classes for Java." depends="copysource-development">
+-+ <mkdir dir="${classes-j.dir}"/>
+-+ <javac encoding="ISO-8859-1" debug="${build.debug}" debuglevel="${build.debuglevel}"
+-+ deprecation="${build.deprecation}" destdir="${classes-j.dir}"
+-+ optimize="${build.optimize}" srcdir="${temp-src-j.dir}" source="${build.compiler.source}"
+-+ target="${build.compiler.target}">
+-+
+-+ <include name="net/**"/>
+-+ <exclude name="**/dom/**"/>
+-+ <exclude name="**/dom4j/**"/>
+-+ <exclude name="**/javax/**"/>
+-+ <exclude name="**/jdom/**"/>
+-+ <exclude name="**/sql/**"/>
+-+ <exclude name="**/xom/**"/>
+-+ <exclude name="**/xpath/**"/>
+-+ <exclude name="**/xqj/**"/>
+-+ <exclude name="**/dotnet/**"/>
+-+ <exclude name="**/s9api/**"/>
+-+
+-+ <exclude name="**/ant/**"/>
+-+ <exclude name="**/dotnet/**"/>
+-+ <exclude name="**/s9api/**"/>
+-+ <classpath>
+-+ <path refid="classpath-j"/>
+-+ </classpath>
+-+ </javac>
+-+ </target>
+-+
+-+ <target name="compile-saj" description="Compile Saxon-SA classes for Java." depends="copysource-development">
+-+ <mkdir dir="${classes-j.dir}"/>
+-+ <javac debug="${build.debug}" debuglevel="${build.debuglevel}"
+-+ deprecation="${build.deprecation}" destdir="${classes-j.dir}"
+-+ optimize="${build.optimize}" srcdir="${temp-src-j.dir}" source="${build.compiler.source}"
+-+ target="${build.compiler.target}">
+-+
+-+ <include name="com/saxonica/**"/>
+-+ <include name="net/sf/saxon/ant/**"/>
+-+ <exclude name="com/saxonica/validate/DotNetVerifier.java"/>
+-+ <classpath>
+-+ <path refid="classpath-j"/>
+-+ </classpath>
+-+ </javac>
+-+ </target>
+-+
+-+ <target name="compile-s9api" description="Compile s9api classes for Java."
+-+ depends="compile-bj, compile-saj, copysource-development">
+-+ <!-- Compiling the s9api package requires JDK 1.5 -->
+-+ <!-- The bj and saj source must be compiled first to ensure that it is done using 1.4, otherwise
+-+ it will be compiled in 1.5 mode because the classes are referenced from the s9api package -->
+-+ <javac debug="${build.debug}" debuglevel="${build.debuglevel}"
+-+ deprecation="${build.deprecation}" destdir="${classes-j.dir}"
+-+ optimize="${build.optimize}" srcdir="${temp-src-j.dir}" source="${build.s9api.compiler.source}"
+-+ target="${build.s9api.compiler.target}">
+-+
+-+ <include name="**/s9api/**"/>
+-+ <classpath>
+-+ <path refid="classpath-j"/>
+-+ </classpath>
+-+ </javac>
+-+ </target>
+-+
+-+ <target name="compile-bn" description="Compile Saxon-B classes for .NET" depends="copysource-development">
+-+ <mkdir dir="${classes-n.dir}"/>
+-+ <javac debug="${build.debug}" debuglevel="${build.debuglevel}"
+-+ deprecation="${build.deprecation}" destdir="${classes-n.dir}"
+-+ optimize="${build.optimize}" srcdir="${temp-src-nj.dir}" source="${build.compiler.source}"
+-+ target="${build.compiler.target}">
+-+
+-+ <include name="net/**"/>
+-+ <exclude name="**/s9api/**"/>
+-+ <classpath>
+-+ <path refid="classpath-n"/>
+-+ </classpath>
+-+ </javac>
+-+ </target>
+-+
+-+ <target name="compile-san" description="Compile Saxon-SA classes for .NET" depends="copysource-development">
+-+ <mkdir dir="${classes-n.dir}"/>
+-+ <javac debug="${build.debug}" debuglevel="${build.debuglevel}"
+-+ deprecation="${build.deprecation}" destdir="${classes-n.dir}"
+-+ optimize="${build.optimize}" srcdir="${temp-src-nj.dir}" source="${build.compiler.source}"
+-+ target="${build.compiler.target}">
+-+
+-+ <include name="com/saxonica/**"/>
+-+ <exclude name="com/saxonica/validate/JavaVerifier.java"/>
+-+ <classpath>
+-+ <path refid="classpath-n"/>
+-+ </classpath>
+-+ </javac>
+-+ </target>
+-+
+-+ <target name="jar-bj" description="Create Saxon-B jar files for Java" depends="create-meta-inf, compile-bj">
+-+ <mkdir dir="${product.dir}/bj"/>
+-+ <jar basedir="${classes-j.dir}" compress="${build.compress}" jarfile="${product.dir}/bj/saxon9.jar">
+-+ <include name="net/**/*.class"/>
+-+ <exclude name="**/ant/**/*.class"/>
+-+ <exclude name="**/dom/**/*.class"/>
+-+ <exclude name="**/dom4j/**/*.class"/>
+-+ <exclude name="**/javax/**/*.class"/>
+-+ <exclude name="**/jdom/**/*.class"/>
+-+ <exclude name="**/sql/**/*.class"/>
+-+ <exclude name="**/xom/**/*.class"/>
+-+ <exclude name="**/xpath/**/*.class"/>
+-+ <exclude name="**/xqj/**/*.class"/>
+-+ <exclude name="**/s9api/**/*.class"/>
+-+ <include name="META-INF/**"/>
+-+ <manifest>
+-+ <attribute name="Project-Name" value="Saxon-B"/>
+-+ <attribute name="Main-Class" value="net.sf.saxon.Transform"/>
+-+ </manifest>
+-+ <metainf dir="${services.dir}/saxon9/META-INF"/>
+-+ <!--
+-+ <service type="javax.xml.transform.TransformerFactory"
+-+ provider="net.sf.saxon.TransformerFactoryImpl"/>
+-+ -->
+-+ </jar>
+-+ <!--
+-+ <jar basedir="${classes-j.dir}" compress="${build.compress}" jarfile="${product.dir}/bj/saxon9-dom.jar">
+-+ <include name="net/sf/saxon/dom/*.class"/>
+-+ </jar>
+-+ <jar basedir="${classes-j.dir}" compress="${build.compress}" jarfile="${product.dir}/bj/saxon9-dom4j.jar">
+-+ <include name="net/sf/saxon/dom4j/*.class"/>
+-+ </jar>
+-+ <jar basedir="${classes-j.dir}" compress="${build.compress}" jarfile="${product.dir}/bj/saxon9-jdom.jar">
+-+ <include name="net/sf/saxon/jdom/*.class"/>
+-+ </jar>
+-+ <jar basedir="${classes-j.dir}" compress="${build.compress}" jarfile="${product.dir}/bj/saxon9-s9api.jar">
+-+ <include name="net/sf/saxon/s9api/*.class"/>
+-+ </jar>
+-+ <jar basedir="${classes-j.dir}" compress="${build.compress}" jarfile="${product.dir}/bj/saxon9-sql.jar">
+-+ <include name="net/sf/saxon/sql/*.class"/>
+-+ </jar>
+-+ <jar basedir="${classes-j.dir}" compress="${build.compress}" jarfile="${product.dir}/bj/saxon9-xom.jar">
+-+ <include name="net/sf/saxon/xom/*.class"/>
+-+ </jar>
+-+ <jar basedir="${classes-j.dir}" compress="${build.compress}" jarfile="${product.dir}/bj/saxon9-xpath.jar">
+-+ <include name="net/sf/saxon/xpath/*.class"/>
+-+ <metainf dir="${services.dir}/saxon9-xpath/META-INF"/>
+-+ <!==
+-+ <service type="javax.xml.xpath.XPathFactory">
+-+ <provider classname="net.sf.saxon.xpath.XPathFactoryImpl"/>
+-+ <provider classname="http\://java.sun.com/jaxp/xpath/dom: net.sf.saxon.xpath.XPathFactoryImpl"/>
+-+ <provider classname="http\://saxon.sf.net/jaxp/xpath/om: net.sf.saxon.xpath.XPathFactoryImpl"/>
+-+ <provider classname="http\://www.xom.nu/jaxp/xpath/xom: net.sf.saxon.xpath.XPathFactoryImpl"/>
+-+ <provider classname="http\://jdom.org/jaxp/xpath/jdom: net.sf.saxon.xpath.XPathFactoryImpl"/>
+-+ <provider classname="http\://www.dom4j.org/jaxp/xpath/dom4j: net.sf.saxon.xpath.XPathFactoryImpl"/>
+-+ </service> ==>
+-+ </jar>
+-+ <jar basedir="${classes-j.dir}" compress="${build.compress}" jarfile="${product.dir}/bj/saxon9-xqj.jar">
+-+ <include name="net/sf/saxon/xqj/*.class"/>
+-+ <include name="net/sf/saxon/javax/xml/namespace/*.class"/>
+-+ <include name="net/sf/saxon/javax/xml/xquery/*.class"/>
+-+ </jar>
+-+ -->
+-+ </target>
+-+
+-+ <target name="jar-saj" description="Create Saxon-SA jar files for Java" depends="compile-s9api, jar-bj">
+-+ <mkdir dir="${product.dir}/saj"/>
+-+ <copy todir="${product.dir}/saj">
+-+ <fileset dir="${product.dir}/bj">
+-+ <include name="*.jar"/>
+-+ </fileset>
+-+ </copy>
+-+ <jar basedir="${classes-j.dir}" compress="${build.compress}" jarfile="${product.dir}/saj/saxon9sa.jar">
+-+ <include name="net/**/*.class"/>
+-+ <exclude name="**/dom/**/*.class"/>
+-+ <exclude name="**/dom4j/**/*.class"/>
+-+ <exclude name="**/javax/**/*.class"/>
+-+ <exclude name="**/jdom/**/*.class"/>
+-+ <exclude name="**/s9api/**/*.class"/>
+-+ <exclude name="**/sql/**/*.class"/>
+-+ <exclude name="**/xom/**/*.class"/>
+-+ <exclude name="**/xpath/**/*.class"/>
+-+ <exclude name="**/xqj/**/*.class"/>
+-+ <include name="com/saxonica/**/*.class"/>
+-+ <exclude name="com/saxonica/jaxp/*.class"/>
+-+ <exclude name="com.saxonica.CompileQuery.class"/>
+-+ <manifest>
+-+ <attribute name="Project-Name" value="Saxon-SA"/>
+-+ </manifest>
+-+ <metainf dir="${services.dir}/saxon9sa/META-INF"/>
+-+ <!--
+-+ <service type="javax.xml.transform.TransformerFactory"
+-+ provider="com.saxonica.SchemaAwareTransformerFactory"/>
+-+ -->
+-+ </jar>
+-+ <jar basedir="${classes-j.dir}" compress="${build.compress}" jarfile="${product.dir}/saj/saxon9sa-jaxp.jar">
+-+ <include name="com/saxonica/jaxp/*.class"/>
+-+ <include name="net/sf/saxon/dom/TypeInfoImpl.class"/>
+-+ <metainf dir="${services.dir}/saxon9sa-jaxp/META-INF"/>
+-+ <!--
+-+ <service type="javax.xml.validation.SchemaFactory">
+-+ <provider classname="com.saxonica.jaxp.SchemaFactoryImpl"/>
+-+ <provider classname="http\://www.w3.org/2001/XMLSchema: com.saxonica.jaxp.SchemaFactoryImpl"/>
+-+ </service>
+-+ -->
+-+ </jar>
+-+ <jar basedir="${classes-j.dir}" compress="${build.compress}" jarfile="${product.dir}/saj/saxon9sa-qc.jar">
+-+ <include name="com/saxonica/codegen/*.class"/>
+-+ <include name="com.saxonica.CompileQuery.class"/>
+-+ </jar>
+-+ <!-- The Saxon-Ant task is delivered with Saxon-B but it won't compile without Saxon-SA present,
+-+ unless modified -->
+-+ <jar basedir="${classes-j.dir}" compress="${build.compress}" jarfile="${product.dir}/bj/saxon9-ant.jar">
+-+ <include name="net/sf/saxon/ant/*.class"/>
+-+ </jar>
+-+ </target>
+-+
+-+ <target name="jar-bn" description="Create Saxon-B jar files for .NET" depends="compile-bn">
+-+ <mkdir dir="${jar-n.dir}"/>
+-+ <jar basedir="${classes-n.dir}" compress="${build.compress}" jarfile="${jar-n.dir}/saxon9.jar">
+-+ <include name="net/**/*.class"/>
+-+ </jar>
+-+ </target>
+-+
+-+ <target name="jar-san" description="Create Saxon-SA jar files for .NET" depends="compile-san">
+-+ <mkdir dir="${jar-n.dir}"/>
+-+ <jar basedir="${classes-n.dir}" compress="${build.compress}" jarfile="${jar-n.dir}/saxon9sa.jar">
+-+ <include name="com/saxonica/**/*.class"/>
+-+ </jar>
+-+ </target>
+-+
+-+ <target name="dll-n" description="Create DLLs for .NET" depends="jar-bn, jar-san">
+-+ <mkdir dir="${dll-n.dir}"/>
+-+ <copy todir="${dll-n.dir}">
+-+ <fileset dir="${ikvm.dir}/bin">
+-+ <include name="IKVM.GNU.Classpath.dll"/>
+-+ <include name="IKVM.Runtime.dll"/>
+-+ </fileset>
+-+ </copy>
+-+ <copy file="${saxondotnet.snk}" todir="${basedir}"/>
+-+ <!--
+-+ Invoke IKVMC to cross-compile the JAR files into DLLs
+-+ -->
+-+ <exec dir="." executable="ikvmc.cmd" >
+-+ <arg line="live"/> <!-- set to 'debug' for testing, 'live' for final build -->
+-+ <arg line="${basedir}/${jar-n.dir}"/>
+-+ <arg line="${basedir}/${dll-n.dir}"/>
+-+ <arg line="${version}"/>
+-+ </exec>
+-+ </target>
+-+
+-+ <target name="csharp-n" description="Compile C# source for .NET commands and API library"
+-+ depends="dll-n">
+-+
+-+ <mkdir dir="${dll-n.dir}/samples"/>
+-+ <mkdir dir="${dll-n.dir}/tests"/>
+-+
+-+ <exec dir="." executable="csharp-compile.cmd" >
+-+ <arg line="${basedir}/${temp-src-nc.dir}"/>
+-+ <arg line="${basedir}/${dll-n.dir}"/>
+-+ <arg line="${version}"/>
+-+ </exec>
+-+
+-+
+-+<!-- <taskdef
+-+ uri="antlib:org.apache.ant.dotnet">
+-+ <classpath>
+-+ <pathelement location="c:/javalib/ant-dotnet-1.0/ant-dotnet-1.0.jar"/>
+-+ </classpath>
+-+ </taskdef>
+-+ <dn:csc xmlns:dn="antlib:org.apache.ant.dotnet"
+-+ executable="${csharp.compiler}"
+-+ srcdir="${temp-src-nc.dir}/cmd"
+-+ targettype="exe"
+-+ win32icon="c:\MyDotNet\icons\gyfu.ico"
+-+ destdir="${dll-n.dir}">
+-+ <reference file="${dll-n.dir}/IKVM.GNU.Classpath.dll"/>
+-+ <reference file="${dll-n.dir}/IKVM.Runtime.dll"/>
+-+ <reference file="${dll-n.dir}/saxon9.dll"/>
+-+ <reference file="${dll-n.dir}/saxon9sa.dll"/>
+-+ </dn:csc>
+-+ <dn:csc xmlns:dn="antlib:org.apache.ant.dotnet"
+-+ executable="${csharp.compiler}"
+-+ srcdir="${temp-src-nc.dir}/api"
+-+ targettype="module"
+-+ win32icon="c:\MyDotNet\icons\gyfu.ico"
+-+ destdir="${dll-n.dir}">
+-+ <reference file="${dll-n.dir}/IKVM.GNU.Classpath.dll"/>
+-+ <reference file="${dll-n.dir}/IKVM.Runtime.dll"/>
+-+ <reference file="${dll-n.dir}/saxon9.dll"/>
+-+ <reference file="${dll-n.dir}/saxon9sa.dll"/>
+-+ </dn:csc>
+-+-->
+-+ </target>
+-+
+-+ <target name="basic-userdoc" description="Generate Basic Documentation for release with executable">
+-+ <mkdir dir="${product.dir}/bj"/>
+-+ <copy todir="${product.dir}/bj">
+-+ <fileset dir="${userdoc.dir}/welcome">
+-+ <include name="doc/**"/>
+-+ <include name="notices/**"/>
+-+ </fileset>
+-+ </copy>
+-+ <mkdir dir="${product.dir}/saj"/>
+-+ <copy todir="${product.dir}/saj">
+-+ <fileset dir="${userdoc.dir}/welcome">
+-+ <include name="doc/**"/>
+-+ <include name="notices/**"/>
+-+ </fileset>
+-+ </copy>
+-+ <mkdir dir="${product.dir}/bn"/>
+-+ <copy todir="${product.dir}/bn">
+-+ <fileset dir="${userdoc.dir}/welcome">
+-+ <include name="doc/**"/>
+-+ <include name="notices/**"/>
+-+ </fileset>
+-+ </copy>
+-+ <mkdir dir="${product.dir}/san"/>
+-+ <copy todir="${product.dir}/san">
+-+ <fileset dir="${userdoc.dir}/welcome">
+-+ <include name="doc/**"/>
+-+ <include name="notices/**"/>
+-+ </fileset>
+-+ </copy>
+-+ </target>
+-+
+-+ <target name="product-bn" description="Assemble product.directory for Saxon-B on .NET"
+-+ depends="csharp-n, dll-n, basic-userdoc">
+-+ <mkdir dir="${build-bn.dir}/bin"/>
+-+ <copy todir="${build-bn.dir}/bin">
+-+ <fileset dir="${dll-n.dir}">
+-+ <include name="IKVM.GNU.Classpath.dll"/>
+-+ <include name="IKVM.Runtime.dll"/>
+-+ <include name="saxon9.dll"/>
+-+ <include name="saxon9api.dll"/>
+-+ <include name="saxon9api.netmodule"/>
+-+ <include name="Query.exe"/>
+-+ <include name="Transform.exe"/>
+-+ </fileset>
+-+ </copy>
+-+ <echo file="${build-bn.dir}/bin/install-gac.cmd">
+-+ set NET="%PROGRAMFILES%\Microsoft.NET\SDK\v1.1\Bin"
+-+ %NET%\gacutil /if IKVM.Runtime.dll
+-+ %NET%\gacutil /if IKVM.GNU.Classpath.dll
+-+ %NET%\gacutil /if saxon9.dll
+-+ %NET%\gacutil /if saxon9api.dll
+-+ </echo>
+-+ </target>
+-+
+-+ <target name="product-san" description="Assemble product.directory for Saxon-SA on .NET"
+-+ depends="csharp-n, dll-n, basic-userdoc">
+-+ <copy todir="${build-san.dir}/bin">
+-+ <fileset dir="${dll-n.dir}">
+-+ <include name="IKVM.GNU.Classpath.dll"/>
+-+ <include name="IKVM.Runtime.dll"/>
+-+ <include name="saxon9.dll"/>
+-+ <include name="saxon9sa.dll"/>
+-+ <include name="saxon9api.dll"/>
+-+ <include name="saxon9api.netmodule"/>
+-+ <include name="Query.exe"/>
+-+ <include name="Transform.exe"/>
+-+ <include name="Validate.exe"/>
+-+ </fileset>
+-+ </copy>
+-+ <echo file="${build-san.dir}/bin/install-gac.cmd">
+-+ set NET="%PROGRAMFILES%\Microsoft.NET\SDK\v1.1\Bin"
+-+ %NET%\gacutil /if IKVM.Runtime.dll
+-+ %NET%\gacutil /if IKVM.GNU.Classpath.dll
+-+ %NET%\gacutil /if saxon9.dll
+-+ %NET%\gacutil /if saxon9sa.dll
+-+ %NET%\gacutil /if saxon9api.dll
+-+ </echo>
+-+ </target>
+-+
+-+ <target name="samples" description="Assemble Cross-Platform Samples and Use-Cases">
+-+ <mkdir dir="${build-resources.dir}/samples"/>
+-+ <copy todir="${product.dir}/resources/use-cases">
+-+ <fileset dir="${usercases.dir}"/>
+-+ </copy>
+-+ <copy todir="${product.dir}/resources/samples">
+-+ <fileset dir="${samples.dir}">
+-+ <include name="analysis/timing-profile.xsl"/>
+-+ <include name="data/*.xml"/>
+-+ <include name="data/*.xsd"/>
+-+ <include name="data/*.dtd"/>
+-+ <include name="query/*.xq"/>
+-+ <include name="styles/*.xsl"/>
+-+ <include name="trax/xml/**/*.xml"/>
+-+ <include name="trax/xsl/**/*.xsl"/>
+-+ <include name="trax/xsl/**/preamble.txt"/>
+-+ </fileset>
+-+ </copy>
+-+ </target>
+-+
+-+ <target name="samples-j" description="Copy and Compile Java Samples"
+-+ depends="jar-saj">
+-+ <mkdir dir="${product.dir}/resources/samples/java"/>
+-+ <mkdir dir="${product.dir}/resources/samples/java/classes"/>
+-+ <copy todir="${product.dir}/resources/samples/java">
+-+ <fileset dir="${samples.dir}/java">
+-+ <include name="ApplyXPathJAXP.java"/>
+-+ <include name="ExampleContentHandler.java"/>
+-+ <include name="JDOMExample.java"/>
+-+ <include name="PullExamples.java"/>
+-+ <include name="QueryAPIExamples.java"/>
+-+ <include name="QuickValidator.java"/>
+-+ <include name="SaxonServlet.java"/>
+-+ <include name="SaxonSAServlet.java"/>
+-+ <include name="SchemaValidatorExample.java"/>
+-+ <include name="SchemaValidatorHandlerExample.java"/>
+-+ <include name="TraxExamples.java"/>
+-+ <include name="XMarkBenchmark.java"/>
+-+ <include name="XPathExample.java"/>
+-+ <include name="XPathExampleDOM.java"/>
+-+ <include name="XPathExampleSA.java"/>
+-+ <include name="XPathExampleServlet.java"/>
+-+ <include name="XQJExamples.java"/>
+-+ </fileset>
+-+ </copy>
+-+ <javac debug="true" debuglevel="source, lines"
+-+ destdir="${product.dir}/resources/samples/java/classes"
+-+ srcdir="${product.dir}/resources/samples/java"
+-+ source="${build.compiler.source}"
+-+ target="${build.compiler.target}">
+-+ <include name="*.java"/>
+-+ <classpath>
+-+ <path refid="classpath-samples"/>
+-+ </classpath>
+-+ </javac>
+-+ </target>
+-+
+-+ <target name="testdrivers-j" description="Copy Java Test Drivers">
+-+ <mkdir dir="${product.dir}/resources/drivers/java/test"/>
+-+ <copy todir="${product.dir}/resources/drivers/java/test">
+-+ <fileset dir="${drivers-j.dir}">
+-+ <include name="XQueryTestSuiteDriver.java"/>
+-+ <include name="XsltTestSuiteDriver.java"/>
+-+ <include name="CanonicalXML.java"/>
+-+ <include name="XQTSModuleURIResolver.java"/>
+-+ <include name="XQTSCollectionURIResolver.java"/>
+-+ <include name="SchemaTestSuiteDriver.java"/>
+-+ </fileset>
+-+ </copy>
+-+ </target>
+-+
+-+ <target name="samples-n" description="Assemble release samples for .NET"
+-+ depends="csharp-n">
+-+ <mkdir dir="${build-resources.dir}/samples/cs"/>
+-+ <copy todir="${build-resources.dir}/samples/cs">
+-+ <fileset dir="${temp-src-nc.dir}/samples">
+-+ <include name="*.cs"/>
+-+ </fileset>
+-+ </copy>
+-+ <mkdir dir="${build-resources.dir}/samples/cs/bin"/>
+-+ <copy todir="${build-resources.dir}/samples/cs/bin">
+-+ <fileset dir="${dll-n.dir}/samples">
+-+ <include name="*.exe"/>
+-+ <include name="*.dll"/>
+-+ <include name="*.pdb"/>
+-+ </fileset>
+-+ </copy>
+-+ <copy todir="${build-resources.dir}/samples/cs/bin">
+-+ <fileset dir="${dll-n.dir}/tests">
+-+ <include name="*.exe"/>
+-+ <include name="*.dll"/>
+-+ <include name="*.pdb"/>
+-+ </fileset>
+-+ </copy>
+-+ </target>
+-+
+-+ <target name="product-javadoc" description="Generate Javadoc.">
+-+ <javadoc bottom="Copyright (C) Michael H. Kay. All rights reserved."
+-+ destdir="${javadoc.dir}" doctitle="saxon9 Javadocs"
+-+ noindex="true" notree="true" access="public"
+-+ maxmemory="512M" source="1.5">
+-+ <packageset dir="${temp-src-j.dir}">
+-+ <include name="net/**"/>
+-+ <include name="com/**"/>
+-+ <exclude name="**/dotnet/**"/>
+-+ <exclude name="**/DotNetVerifier.java"/>
+-+ </packageset>
+-+ <classpath>
+-+ <path refid="classpath-j"/>
+-+ </classpath>
+-+
+-+ <link href="http://java.sun.com/j2se/1.5.0/docs/api/"/>
+-+ <link href="http://www.xom.nu/apidocs/"/>
+-+
+-+ </javadoc>
+-+ <copy file="${userdoc.dir}/fixed/javadoc/stylesheet.css"
+-+ tofile="${javadoc.dir}/stylesheet.css"
+-+ overwrite="true"/>
+-+ </target>
+-+
+-+ <target name="product-dotnetdoc" description="Copy .NET API documentation">
+-+ <mkdir dir="${build-resources.dir}/doc/dotnetdoc"/>
+-+ <copy todir="${build-resources.dir}/doc/dotnetdoc">
+-+ <fileset dir="${dotnetdoc.dir}"/>
+-+ </copy>
+-+ </target>
+-+
+-+
+-+ <target name="release-userdoc" description="Generate User Documentation">
+-+ <taskdef name="saxon-xslt"
+-+ classname="net.sf.saxon.ant.AntTransform"
+-+ classpath="c:\saxon-build\9.0.0.1\saj\saxon9sa.jar;c:\saxon-licenses"/>
+-+ <copy todir="${build-resources.dir}/doc">
+-+ <fileset dir="${userdoc.dir}/fixed"/>
+-+ </copy>
+-+ <copy todir="${product.dir}/bj">
+-+ <fileset dir="${userdoc.dir}/welcome">
+-+ <include name="doc/**"/>
+-+ <include name="notices/**"/>
+-+ </fileset>
+-+ </copy>
+-+ <copy todir="${product.dir}/saj">
+-+ <fileset dir="${userdoc.dir}/welcome">
+-+ <include name="doc/**"/>
+-+ <include name="notices/**"/>
+-+ </fileset>
+-+ </copy>
+-+ <copy todir="${product.dir}/bn">
+-+ <fileset dir="${userdoc.dir}/welcome">
+-+ <include name="doc/**"/>
+-+ <include name="notices/**"/>
+-+ </fileset>
+-+ </copy>
+-+ <copy todir="${product.dir}/san">
+-+ <fileset dir="${userdoc.dir}/welcome">
+-+ <include name="doc/**"/>
+-+ <include name="notices/**"/>
+-+ </fileset>
+-+ </copy>
+-+ <saxon-xslt in="${userdoc.dir}/catalog.xml"
+-+ style="${userdoc.dir}/render-page2.xsl"
+-+ schemaAware="true"
+-+ xmlVersion="1.0"
+-+ schemaValidation="strict"
+-+ out="${product.dir}/resources/doc/dummy.html"><!--validation="strict" -->
+-+ <param name="destination" expression="offline"/>
+-+ </saxon-xslt>
+-+ <zip zipfile="${build-resources.dir}/source-userdoc.zip">
+-+ <fileset dir="${userdoc.dir}">
+-+ <include name="**/*.xml"/>
+-+ <include name="**/*.xsl"/>
+-+ <include name="**/*.xsd"/>
+-+ <include name="**/*.css"/>
+-+ <include name="fixed/**"/>
+-+ <include name="welcome/**"/>
+-+ </fileset>
+-+ </zip>
+-+ </target>
+-+
+-+ <target name="release-source" description="Generate Zip file containing issued Source Code">
+-+ <mkdir dir="${build-resources.dir}"/>
+-+ <zip zipfile="${build-resources.dir}/source.zip">
+-+ <fileset dir="${source-bj.dir}">
+-+ <include name="net/**/*.java"/>
+-+ <include name="net/**/package.html"/>
+-+ </fileset>
+-+ <fileset dir="${source-bj.dir}">
+-+ <include name="net/sf/saxon/dotnet/*.java"/>
+-+ <include name="net/sf/saxon/dotnet/package.html"/>
+-+ </fileset>
+-+ <fileset dir="${temp-src-nc.dir}">
+-+ <include name="api/**/*.cs"/>
+-+ <include name="cmd/**/*.cs"/>
+-+ </fileset>
+-+ </zip>
+-+ <zip zipfile="${build-resources.dir}/sa-source.zip">
+-+ <fileset dir="${source-saj.dir}">
+-+ <include name="com/saxonica/**/*.java"/>
+-+ <include name="com/saxonica/**/package.html"/>
+-+ </fileset>
+-+ </zip>
+-+ </target>
+-+
+-+ <target name="resources" description="Generate contents of released resources file"
+-+ depends="release-userdoc, product-javadoc, product-dotnetdoc,
+-+ samples, samples-j, testdrivers-j, samples-n, release-source">
+-+ <mkdir dir="${product.dir}/resources/build"/>
+-+ <copy todir="${product.dir}/resources/build">
+-+ <fileset dir="${basedir}">
+-+ <include name="build.xml"/>
+-+ <include name="ikvmc.cmd"/>
+-+ <include name="csharp-compile.cmd"/>
+-+ </fileset>
+-+ </copy>
+-+ <copy todir="${product.dir}/resources">
+-+ <fileset dir="${userdoc.dir}/welcome">
+-+ <include name="notices/**"/>
+-+ </fileset>
+-+ </copy>
+-+ </target>
+-+
+-+ <target name="bj" depends="compile-bj, jar-bj, basic-userdoc"
+-+ description="Generate Saxon-B for the Java platform"/>
+-+
+-+ <target name="saj" depends="bj, jar-saj, basic-userdoc"
+-+ description="Generate Saxon-SA for the Java platform"/>
+-+
+-+ <target name="n" depends="product-bn, product-san"
+-+ description="Generate Saxon for the .NET platform"/>
+-+
+-+ <target name="build" description="Complete Saxon product build"
+-+ depends="bj, saj, n"/> <!-- add resources -->
+-+
+-+ <target name="release" description="Create .ZIP files for release" depends="build"
+-+ > <!--depends="build, resources"-->
+-+ <mkdir dir="${issue.dir}"/>
+-+ <zip zipfile="${issue.dir}/saxonb${versionh}j.zip">
+-+ <fileset dir="${product.dir}/bj"/>
+-+ </zip>
+-+ <zip zipfile="${issue.dir}/saxonb${versionh}n.zip">
+-+ <fileset dir="${product.dir}/bn"/>
+-+ </zip>
+-+ <zip zipfile="${issue.dir}/saxonsa${versionh}j.zip">
+-+ <fileset dir="${product.dir}/saj"/>
+-+ </zip>
+-+ <zip zipfile="${issue.dir}/saxonsa${versionh}n.zip">
+-+ <fileset dir="${product.dir}/san"/>
+-+ </zip>
+-+ <!--
+-+ <zip zipfile="${issue.dir}/saxon-resources${versionh}.zip">
+-+ <fileset dir="${product.dir}/resources"/>
+-+ </zip>
+-+ -->
+-+ </target>
+-+
+-+ <target name="archive" description="Archive everything needed for backup">
+-+ <mkdir dir="${archive.dir}"/>
+-+ <copy todir="${archive.dir}">
+-+ <fileset dir="${issue.dir}"/>
+-+ <fileset dir="${development-j.dir}" includes="sa-source.zip"/>
+-+ <fileset dir="${build-resources.dir}" includes="source.zip"/>
+-+ </copy>
+-+ <zip zipfile="${archive.dir}/saxontests.zip">
+-+ <fileset dir="e:/tests">
+-+ <include name="testsuite/*.*"/>
+-+ <include name="java/**/*.java"/>
+-+ <include name="xqts-current/SaxonDriver/**"/>
+-+ <include name="xqts-extra/**"/>
+-+ <include name="xslts_1_0_4/**/SaxonDriver/**"/>
+-+ </fileset>
+-+ <fileset dir="e:/tests/java" includes ="**/*.java"/>
+-+ </zip>
+-+ <zip zipfile="${archive.dir}/licensetool.zip">
+-+ <fileset dir="c:/MyJava/licensetool"/>
+-+ </zip>
+-+ <zip zipfile="${archive.dir}/licenses.zip">
+-+ <fileset dir="c:/saxon-licenses"/>
+-+ </zip>
+-+ </target>
+-+
+-+
+-+
+-+</project>
+diff --git a/stax/README b/stax/README
+deleted file mode 100644
+index 13e69fb..0000000
+--- a/stax/README
++++ /dev/null
+@@ -1 +0,0 @@
+-Library implementing the Streaming API for XML. (CH: Which one, probably the one by Sun???)
+diff --git a/stax/makefile.mk b/stax/makefile.mk
+deleted file mode 100644
+index ff3238b..0000000
+--- a/stax/makefile.mk
++++ /dev/null
+@@ -1,78 +0,0 @@
+-#*************************************************************************
+-#
+-# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+-#
+-# Copyright 2000, 2010 Oracle and/or its affiliates.
+-#
+-# OpenOffice.org - a multi-platform office productivity suite
+-#
+-# This file is part of OpenOffice.org.
+-#
+-# OpenOffice.org is free software: you can redistribute it and/or modify
+-# it under the terms of the GNU Lesser General Public License version 3
+-# only, as published by the Free Software Foundation.
+-#
+-# OpenOffice.org 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 Lesser General Public License version 3 for more details
+-# (a copy is included in the LICENSE file that accompanied this code).
+-#
+-# You should have received a copy of the GNU Lesser General Public License
+-# version 3 along with OpenOffice.org. If not, see
+-# <http://www.openoffice.org/license.html>
+-# for a copy of the LGPLv3 License.
+-#
+-#*************************************************************************
+-
+-PRJ=.
+-
+-PRJNAME=stax
+-TARGET=stax
+-USE_JAVAVER=TRUE
+-
+-# --- Settings -----------------------------------------------------
+-
+-.INCLUDE : settings.mk
+-.INCLUDE : antsettings.mk
+-
+-.IF "$(SOLAR_JAVA)" != ""
+-.IF "$(JAVANUMVER:s/.//)" >= "000100060000" || "$(JDK)"=="gcj"
+-all:
+- @echo "Your java version already contains StAX"
+-.ENDIF # "$(JAVANUMVER:s/.//)" >= "000100060000"
+-.IF "$(SYSTEM_SAXON)" == "YES"
+-all:
+- @echo "An already available installation of saxon should exist on your system."
+- @echo "Therefore the files provided here does not need to be built in addition."
+-.ENDIF
+-
+-.IF "$(BUILD_STAX)" != "YES"
+-
+-$(OUT)$/class$/jsr173_1.0_api.jar : $(PRJ)$/download$/jsr173_1.0_api.jar
+- +$(COPY) $< $@
+-
+-.ELSE # "$(BUILD_STAX)" != "YES"
+-
+-# --- Files --------------------------------------------------------
+-TARFILE_NAME=stax-api-1.0-2-sources
+-TARFILE_MD5=8294d6c42e3553229af9934c5c0ed997
+-TARFILE_ROOTDIR=src
+-
+-BUILD_ACTION=$(JAVAC) javax$/xml$/stream$/*.java && jar -cf jsr173_1.0_api.jar javax$/xml$/stream$/*.class javax$/xml$/stream$/events$/*.class javax$/xml$/stream$/util$/*.class
+-
+-OUT2CLASS=jsr173_1.0_api.jar
+-.ENDIF # "$(BUILD_STAX)" != "YES"
+-
+-.ELSE # $(SOLAR_JAVA)!= ""
+-nojava:
+- @echo "Not building $(PRJNAME) because Java is disabled"
+-.ENDIF # $(SOLAR_JAVA)!= ""
+-# --- Targets ------------------------------------------------------
+-
+-.INCLUDE : set_ext.mk
+-.INCLUDE : target.mk
+-.IF "$(SOLAR_JAVA)" != ""
+-.INCLUDE : tg_ext.mk
+-.ENDIF
+-
+diff --git a/stax/prj/build.lst b/stax/prj/build.lst
+deleted file mode 100644
+index cbfc6ea..0000000
+--- a/stax/prj/build.lst
++++ /dev/null
+@@ -1,2 +0,0 @@
+-tx stax : solenv NULL
+-tx stax nmake - all tx_stax NULL
+diff --git a/stax/prj/d.lst b/stax/prj/d.lst
+deleted file mode 100644
+index a4fd204..0000000
+--- a/stax/prj/d.lst
++++ /dev/null
+@@ -1 +0,0 @@
+-..\%__SRC%\class\jsr*.jar %_DEST%\bin
+diff --git a/stax/prj/dmake b/stax/prj/dmake
+deleted file mode 100644
+index e69de29..0000000
+diff --git a/tail_build/prj/build.lst b/tail_build/prj/build.lst
+index c96ae74..0dced2b 100644
+--- a/tail_build/prj/build.lst
++++ b/tail_build/prj/build.lst
+@@ -1,2 +1,2 @@
+-tb tail_build : AFMS:afms APACHE_COMMONS:apache-commons BSH:beanshell BERKELEYDB:berkeleydb BOOST:boost CAIRO:cairo CPPUNIT:cppunit DESKTOP:codemaker CURL:curl EXPAT:expat FONTCONFIG:fontconfig FREETYPE:freetype GRAPHITE:graphite HSQLDB:hsqldb HUNSPELL:hunspell HYPHEN:hyphen ICU:icu DESKTOP:l10ntools JFREEREPORT:jfreereport JPEG:jpeg LCMS2:lcms2 LIBCDR:libcdr LIBCMIS:libcmis LIBEXTTEXTCAT:libexttextcat LIBXML2:libxml2 LIBXMLSEC:libxmlsec LIBXSLT:libxslt LIBWPG:libwpg LIBWPS:libwps LIBWPD:libwpd LIBVISIO:libvisio LPSOLVE:lpsolve MDDS:mdds MOZ:moz MYTHES:mythes NEON:neon NSS:nss OPENSSL:openssl POSTGRESQL:postgresql PYTHON:python REDLAND:redland SAXON:saxon DESKTOP:setup_native TRANSLATIONS:translations VIGRA:vigra XPDF:xpdf ZLIB:zlib bridges cli_ure comphelper cppu cppuhelper external jurt jvmaccess jvmfwk offapi officecfg DESKTOP:rdbmaker readlicense_oo remotebridges RHINO:rhino ridljar sal salhelper solenv soltools stoc sysui ucbhelper udkapi xmlreader xsltml NULL
++tb tail_build : AFMS:afms APACHE_COMMONS:apache-commons BSH:beanshell BERKELEYDB:berkeleydb BOOST:boost CAIRO:cairo CPPUNIT:cppunit DESKTOP:codemaker CURL:curl EXPAT:expat FONTCONFIG:fontconfig FREETYPE:freetype GRAPHITE:graphite HSQLDB:hsqldb HUNSPELL:hunspell HYPHEN:hyphen ICU:icu DESKTOP:l10ntools JFREEREPORT:jfreereport JPEG:jpeg LCMS2:lcms2 LIBCDR:libcdr LIBCMIS:libcmis LIBEXTTEXTCAT:libexttextcat LIBXML2:libxml2 LIBXMLSEC:libxmlsec LIBXSLT:libxslt LIBWPG:libwpg LIBWPS:libwps LIBWPD:libwpd LIBVISIO:libvisio LPSOLVE:lpsolve MDDS:mdds MOZ:moz MYTHES:mythes NEON:neon NSS:nss OPENSSL:openssl POSTGRESQL:postgresql PYTHON:python REDLAND:redland DESKTOP:setup_native TRANSLATIONS:translations VIGRA:vigra XPDF:xpdf ZLIB:zlib bridges cli_ure comphelper cppu cppuhelper external jurt jvmaccess jvmfwk offapi officecfg DESKTOP:rdbmaker readlicense_oo remotebridges RHINO:rhino ridljar sal salhelper solenv soltools stoc sysui ucbhelper udkapi xmlreader xsltml NULL
+ tb tail_build\prj nmake - all tb_prj NULL
+--
+1.7.11.7
+
diff --git a/libreoffice.spec b/libreoffice.spec
index 59d9d86..7a900d3 100644
--- a/libreoffice.spec
+++ b/libreoffice.spec
@@ -34,8 +34,8 @@ Summary: Free Software Productivity Suite
Name: libreoffice
Epoch: 1
Version: %{libo_version}.2
-Release: 1%{?libo_prerelease}%{?dist}
-License: (MPLv1.1 or LGPLv3+) and LGPLv3 and LGPLv2+ and BSD and (MPLv1.1 or GPLv2 or LGPLv2 or Netscape) and Public Domain and ASL 2.0 and Artistic
+Release: 2%{?libo_prerelease}%{?dist}
+License: (MPLv1.1 or LGPLv3+) and LGPLv3 and LGPLv2+ and BSD and (MPLv1.1 or GPLv2 or LGPLv2 or Netscape) and Public Domain and ASL 2.0 and Artistic and MPLv2.0
Group: Applications/Productivity
URL: http://www.documentfoundation.org/develop
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
@@ -52,11 +52,10 @@ Source8: http://hg.services.openoffice.org/binaries/a7983f859eafb2677d7ff
Source9: http://hg.services.openoffice.org/binaries/1f24ab1d39f4a51faf22244c94a6203f-xmlsec1-1.2.14.tar.gz
Source10: http://hg.services.openoffice.org/binaries/798b2ffdc8bcfe7bca2cf92b62caf685-rhino1_5R5.zip
Source11: http://hg.services.openoffice.org/binaries/35c94d2df8893241173de1d16b6034c0-swingExSrc.zip
-Source12: http://hg.services.openoffice.org/binaries/ada24d37d8d638b3d8a9985e80bc2978-source-9.0.0.7-bj.zip
-Source13: http://hg.services.openoffice.org/binaries/18f577b374d60b3c760a3a3350407632-STLport-4.5.tar.gz
+Source12: http://hg.services.openoffice.org/binaries/18f577b374d60b3c760a3a3350407632-STLport-4.5.tar.gz
#Unfortunately later versions of hsqldb changed the file format, so if we use a later version we loose
#backwards compatability.
-Source14: http://hg.services.openoffice.org/binaries/17410483b5b5f267aa18b7e00b65e6e0-hsqldb_1_8_0.zip
+Source13: http://hg.services.openoffice.org/binaries/17410483b5b5f267aa18b7e00b65e6e0-hsqldb_1_8_0.zip
# build tools
BuildRequires: autoconf
@@ -178,6 +177,10 @@ Patch18: 0004-tweak-old-school-gstreamer-link-line.patch
Patch19: 0005-Don-t-fail-configure-with-older-gstreamer-plugins-ba.patch
Patch20: 0006-gstreamer-various-fixes-for-1.0-and-cleanups.patch
Patch21: 0007-gstreamer-fix-leaking-pads.patch
+Patch22: 0001-convert-java-XSL-transformer-into-extension.patch
+Patch23: 0002-rework-selection-of-transformer-for-an-XSLT-filter.patch
+Patch24: 0003-drop-saxon-based-XSLT-transformer.patch
+Patch25: 0004-remove-all-traces-of-saxon.patch
%{!?python_sitearch: %global python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")}
%define instdir %{_libdir}
@@ -795,6 +798,10 @@ mv -f redhat.soc extras/source/palettes/standard.soc
%patch19 -p1 -b .Don-t-fail-configure-with-older-gstreamer-plugins-ba.patch
%patch20 -p1 -b .gstreamer-various-fixes-for-1.0-and-cleanups.patch
%patch21 -p1 -b .gstreamer-fix-leaking-pads.patch
+%patch22 -p1 -b .convert-java-XSL-transformer-into-extension.patch
+%patch23 -p1 -b .rework-selection-of-transformer-for-an-XSLT-filter.patch
+%patch24 -p1 -b .drop-saxon-based-XSLT-transformer.patch
+%patch25 -p1 -b .remove-all-traces-of-saxon.patch
# TODO: check this
# these are horribly incomplete--empty translations and copied english
@@ -868,7 +875,6 @@ cp %{SOURCE10} ext_sources
cp %{SOURCE11} ext_sources
cp %{SOURCE12} ext_sources
cp %{SOURCE13} ext_sources
-cp %{SOURCE14} ext_sources
if ! make VERBOSE=true; then
# TODO Do we still need this? I think parallel build is reliable
@@ -2026,6 +2032,9 @@ update-desktop-database %{_datadir}/applications &> /dev/null || :
%endif
%changelog
+* Fri Oct 26 2012 David Tardon <dtardon at redhat.com> - 1:3.6.3.2-2
+- Resolves: rhbz#824035 do not bundle saxon
+
* Wed Oct 24 2012 David Tardon <dtardon at redhat.com> - 1:3.6.3.2-1
- 3.6.3 rc2
- drop integrated 0001-Resolves-rhbz-868479-fdo-56281-doubled-in-German-ok-.patch
diff --git a/sources b/sources
index d3e1c76..4384dba 100644
--- a/sources
+++ b/sources
@@ -1,6 +1,5 @@
798b2ffdc8bcfe7bca2cf92b62caf685 798b2ffdc8bcfe7bca2cf92b62caf685-rhino1_5R5.zip
35c94d2df8893241173de1d16b6034c0 35c94d2df8893241173de1d16b6034c0-swingExSrc.zip
-ada24d37d8d638b3d8a9985e80bc2978 ada24d37d8d638b3d8a9985e80bc2978-source-9.0.0.7-bj.zip
18f577b374d60b3c760a3a3350407632 18f577b374d60b3c760a3a3350407632-STLport-4.5.tar.gz
17410483b5b5f267aa18b7e00b65e6e0 17410483b5b5f267aa18b7e00b65e6e0-hsqldb_1_8_0.zip
185d60944ea767075d27247c3162b3bc 185d60944ea767075d27247c3162b3bc-unowinreg.dll
More information about the scm-commits
mailing list