]> source.dussan.org Git - poi.git/commitdiff
apply changes from com.github.pjfanning:xmlbeans
authorPJ Fanning <fanningpj@apache.org>
Fri, 16 Feb 2018 22:55:05 +0000 (22:55 +0000)
committerPJ Fanning <fanningpj@apache.org>
Fri, 16 Feb 2018 22:55:05 +0000 (22:55 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1824564 13f79535-47bb-0310-9956-ffa450edef68

25 files changed:
xmlbeans/CHANGES.txt
xmlbeans/README.md [new file with mode: 0644]
xmlbeans/build.xml
xmlbeans/external/lib/piccolo.LICENSE.txt [deleted file]
xmlbeans/external/lib/piccolo_apache_dist_20040629.jar [deleted file]
xmlbeans/external/lib/piccolo_apache_dist_20040629_v2.jar [deleted file]
xmlbeans/external/lib/piccolo_apache_dist_20040711.jar [deleted file]
xmlbeans/external/lib/piccolo_apache_dist_20040711_v2.jar [deleted file]
xmlbeans/external/lib/saxonb9-0-0-4j.zip [new file with mode: 0644]
xmlbeans/src/store/org/apache/xmlbeans/impl/store/Cur.java
xmlbeans/src/store/org/apache/xmlbeans/impl/store/Locale.java
xmlbeans/src/store/org/apache/xmlbeans/impl/store/NullLogger.java [new file with mode: 0644]
xmlbeans/src/store/org/apache/xmlbeans/impl/store/SAXHelper.java [new file with mode: 0644]
xmlbeans/src/store/org/apache/xmlbeans/impl/store/Saver.java
xmlbeans/src/store/org/apache/xmlbeans/impl/store/XBLogFactory.java [new file with mode: 0644]
xmlbeans/src/store/org/apache/xmlbeans/impl/store/XBLogger.java [new file with mode: 0644]
xmlbeans/src/store/org/w3c/dom/DOMConfiguration.java [deleted file]
xmlbeans/src/store/org/w3c/dom/DOMStringList.java [deleted file]
xmlbeans/src/store/org/w3c/dom/TypeInfo.java [deleted file]
xmlbeans/src/store/org/w3c/dom/UserDataHandler.java [deleted file]
xmlbeans/src/xmlpublic/javax/xml/namespace/NamespaceContext.java [deleted file]
xmlbeans/src/xmlpublic/javax/xml/namespace/QName.java [deleted file]
xmlbeans/test/src/xmlcursor/checkin/StoreTests.java
xmlbeans/test/src/xmlobject/checkin/AssortedTests.java
xmlbeans/test/src/xmlobject/checkin/CDataTest.java

index 4140cddc3360796a1c49f10907900f31e446506b..9afc32488bf39c100d08743689ec2ce1a037b121 100644 (file)
@@ -1,3 +1,20 @@
+Changes in V2.6.4 since V2.6.3
+
+* Remove Piccolo support
+* Apply XML Entity Expansion security checks
+
+Changes in V2.6.3 since V2.6.2
+
+* ArrayIndexOutOfBoundsException when writing CDATA (https://issues.apache.org/jira/browse/XMLBEANS-404)
+
+Changes in V2.6.2 since V2.6.1
+
+* Duplicate classes in jar (https://issues.apache.org/jira/browse/XMLBEANS-499)
+
+Changes in V2.6.1 since V2.6.0
+
+* Fix for Unicode Surrogate chars being lost when writing XML (https://bz.apache.org/bugzilla/show_bug.cgi?id=54084 & https://issues.apache.org/jira/browse/XMLBEANS-332)
+
 Changes in V2.6.0 since V2.5.0
 
 * Add new xml option CopyUseNewSynchronizationDomain used for copy.  
diff --git a/xmlbeans/README.md b/xmlbeans/README.md
new file mode 100644 (file)
index 0000000..17453f8
--- /dev/null
@@ -0,0 +1,24 @@
+# xmlbeans
+
+[![Build Status](https://travis-ci.org/pjfanning/xmlbeans.svg?branch=trunk)](https://travis-ci.org/pjfanning/xmlbeans)
+[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.pjfanning/xmlbeans/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.github.pjfanning/xmlbeans)
+
+Latest source from ```http://svn.apache.org/repos/asf/xmlbeans/trunk/```. Some changes have been made to get the build working.
+
+The core use case is to help users of Apache Poi, which depends on the no longer maintained Apache XMLBeans library.
+
+* Release 2.6.1 includes a fix for an issue where Unicode Surrogate chars were replaced with `?` chars ?when outputting files -  https://bz.apache.org/bugzilla/show_bug.cgi?id=54084
+* fixes an issue affecting usage on Android: https://issues.apache.org/jira/browse/XMLBEANS-499
+
+## Sample
+
+https://github.com/pjfanning/poi-xmlbeans-patch-test
+
+## Build
+```
+./xbeanenv.sh
+ant
+ant checkintest
+```
+
+Output jar is found at ```build/lib/xbean.jar```
index 2505a36ddeb4ac3b7ff9b033813543d7d786dd55..e7c27f5316491758914a18cc3da36398f2d32e1c 100644 (file)
 -->
 <project name="Xbean" default="default" basedir=".">
 
-    <property name="build.compiler" value="javac1.4"/>
-    <property name="javac.source" value="1.4"/>
-    <property name="javac.target" value="1.4"/>
+    <property name="build.compiler" value="javac1.6"/>
+    <property name="javac.source" value="1.6"/>
+    <property name="javac.target" value="1.6"/>
 
-    <property name="version.base" value="2.6.0"/>
+    <property name="version.base" value="2.6.4"/>
     <property name="version.rc" value=""/>
 
     <!-- manifest entries -->
         <copy file="external/lib/saxon9-dom.jar" tofile="build/lib/saxon9-dom.jar"/>
     </target>
 
-    <target name="jsr173-bundle.downloaded">
-        <condition property="jsr173-bundle.exists">
-            <available file="external/lib/jsr173_1.0_api_bundle.jar"/>
-        </condition>
-    </target>
-
-    <target name="jsr173-bundle.jar"
-            depends="jsr173-bundle.downloaded, dirs"
-            unless="jsr173-bundle.exists">
-        <get dest="external/lib/jsr173_1.0_api_bundle.jar"
-            src="http://www.apache.org/dist/java-repository/xmlbeans/jars/jsr173_1.0_api_bundle.jar"
-            verbose="true" usetimestamp="true" ignoreerrors="true"/>
-    </target>
-
-    <target name="jsr173_1.0.jars.extracted">
-        <condition property="jsr173_1.0.jars.exist">
-            <available file="build/lib/jsr173_1.0_api.jar"/>
-        </condition>
-    </target>
-
-    <target name="jsr173_1.0.jars"
-            depends="jsr173-bundle.jar, jsr173_1.0.jars.extracted"
-            unless="jsr173_1.0.jars.exist">
-        <unjar src="external/lib/jsr173_1.0_api_bundle.jar" dest="external/lib" >
-            <patternset>
-                <include name="jsr173_1.0_api.jar"/>
-            </patternset>
-        </unjar>
-
-        <!-- copy jsr173 API jar and license files to build/lib -->
-        <copy file="external/lib/jsr173_1.0_api.jar" tofile="build/lib/jsr173_1.0_api.jar"/>
-    </target>
-
     <!-- get resolver.jar -->
     <target name="check.xcresolver.zip">
         <condition property="xcresolver.zip.exists">
             <fileset dir="build/lib">
                 <include name="xbean.jar"/>
                 <include name="xmlpublic.jar"/>
-                <include name="xmlbeans-qname.jar"/>
                 <include name="xbean_xpath.jar"/>
                 <include name="resolver.jar"/>
-                <include name="jsr173_1.0_api.jar"/>
-                <include name="BEA Binary RI License (JSR 173).1(Clean).txt"/>
-                <include name="README(jsr_173 api and ri).txt"/>
             </fileset>
         </copy>
 
                  store.classes, saaj_api.classes,
                  marshal.classes, xpath.classes, oldxbean.jar, xsdschema.classes,
                  xmlinputstream.classes, resolver.jar, xbean_xpath.jar,
-                 piccolo.classes, tools.classes, jamsupport.classes">
+                 tools.classes, jamsupport.classes">
         <jar jarfile="build/lib/xbean.jar" index="true">
             <fileset dir="build/classes/xmlpublic"
                 excludes="javax/**"/>
             <fileset dir="build/classes/marshal"/>
             <fileset dir="build/classes/repackage"/>
             <fileset dir="build/classes/jam"/>
-            <fileset dir="build/classes/piccolo"/>
             <fileset dir="build/classes/tools"/>
             <fileset file="LICENSE.txt"/>
             <fileset file="NOTICE.txt"/>
                 </section>
             </manifest>
         </jar>
-        <jar jarfile="build/lib/xmlbeans-qname.jar">
-            <fileset dir="build/classes/xmlpublic"
-                includes="javax/xml/namespace/QName.class,javax/xml/namespace/NamespaceContext.class"/>
-        </jar>
     </target>
 
     <!-- build XMLInputStream interface ============================================= -->
 
     <!-- xmlpublic target ============================================== -->
 
-    <target name="xmlpublic.classes" depends="dirs, jsr173_1.0.jars">
+    <target name="xmlpublic.classes" depends="dirs">
         <mkdir dir="build/classes/xmlpublic"/>
         <javac srcdir="src/xmlpublic" sourcepath="src/xmlinputstream" destdir="build/classes/xmlpublic" source="${javac.source}" target="${javac.target}" debug="on">
-            <classpath>
-                <pathelement location="build/lib/jsr173_1.0_api.jar"/>
-            </classpath>
+            <classpath/>
         </javac>
 
         <!-- Need properties files for XmlError -->
         <mkdir dir="build/classes/typestore"/>
         <javac srcdir="src/typestore" destdir="build/classes/typestore" source="${javac.source}" target="${javac.target}" debug="on">
             <classpath>
-                <pathelement location="build/lib/jsr173_1.0_api.jar"/>
                 <pathelement location="build/classes/xmlinputstream"/>
                 <pathelement location="build/classes/xmlpublic"/>
                 <pathelement location="build/classes/common"/>
 
     <!-- common target ============================================= -->
 
-    <target name="common.classes" depends="dirs, xmlpublic.classes, xmlinputstream.classes, jsr173_1.0.jars">
+    <target name="common.classes" depends="dirs, xmlpublic.classes, xmlinputstream.classes">
         <mkdir dir="build/classes/common"/>
         <javac srcdir="src/common" destdir="build/classes/common" source="${javac.source}" target="${javac.target}" debug="on">
             <classpath>
-                <pathelement location="build/lib/jsr173_1.0_api.jar"/>
                 <pathelement location="build/classes/xmlinputstream"/>
                 <pathelement location="build/classes/xmlpublic"/>
             </classpath>
 
     <target name="typeimpl.classes" depends="dirs, store.classes,
         repackage.classes, xmlpublic.classes, typeholder.template, typestore.classes, xsdschema.classes,
-        configschema.classes, toolschema.classes, jsr173_1.0.jars, jam.classes">
+        configschema.classes, toolschema.classes, jam.classes">
         <mkdir dir="build/classes/typeimpl"/>
         <javac destdir="build/classes/typeimpl" source="${javac.source}" target="${javac.target}" debug="on">
             <classpath>
                 <pathelement location="build/classes/xmlschema"/>
                 <pathelement location="build/classes/toolschema"/>
                 <pathelement location="build/classes/jam"/>
-                <pathelement location="build/lib/jsr173_1.0_api.jar"/>
             </classpath>
 
             <src path="src/typeimpl"/>
         <mkdir dir="build/classes/xmlcomp"/>
         <javac srcdir="src/xmlcomp" destdir="build/classes/xmlcomp" source="${javac.source}" target="${javac.target}" debug="on">
             <classpath>
-                <pathelement location="build/lib/jsr173_1.0_api.jar"/>
                 <pathelement location="build/classes/xmlinputstream"/>
                 <pathelement location="build/classes/xmlpublic"/>
                 <pathelement location="build/classes/common"/>
                 <pathelement location="build/classes/configschema"/>
                 <pathelement location="build/classes/toolschema"/>
                 <pathelement location="build/classes/xsdschema"/>
+                <pathelement location="build/classes/typestore"/>
             </classpath>
         </javac>
     </target>
 
     <!-- marshal target =============================================== -->
 
-    <target name="marshal.classes" depends="dirs, typeimpl.classes, xmlpublic.classes, jsr173_1.0.jars">
+    <target name="marshal.classes" depends="dirs, typeimpl.classes, xmlpublic.classes">
         <mkdir dir="build/classes/marshal"/>
         <javac srcdir="src/marshal" destdir="build/classes/marshal" source="${javac.source}" target="${javac.target}" debug="on">
             <classpath>
-                <pathelement location="build/lib/jsr173_1.0_api.jar"/>
                 <pathelement location="build/classes/configschema"/>
                 <pathelement location="build/classes/xmlinputstream"/>
                 <pathelement location="build/classes/xmlpublic"/>
     <!-- store target ============================================== -->
 
     <target name="store.classes"
-        depends="dirs, common.classes, xmlpublic.classes, typestore.classes, saaj_api.classes, piccolo.classes">
+        depends="dirs, common.classes, xmlpublic.classes, typestore.classes, saaj_api.classes">
         <mkdir dir="build/classes/store"/>
         <javac srcdir="src/store" destdir="build/classes/store" source="${javac.source}" target="${javac.target}" debug="on">
             <classpath id="store.compile.path">
                 <pathelement location="build/classes/typestore"/>
-                <pathelement location="build/lib/jsr173_1.0_api.jar"/>
                 <pathelement location="build/classes/xmlinputstream"/>
                 <pathelement location="build/classes/xmlpublic"/>
                 <pathelement location="build/classes/common"/>
                 <pathelement location="build/classes/saaj_api"/>
-                <pathelement location="build/classes/piccolo"/>
             </classpath>
         </javac>
     </target>
     <!-- tools target ============================================== -->
 
     <target name="tools.classes"
-        depends="dirs, common.classes, xmlpublic.classes, typestore.classes, saaj_api.classes, piccolo.classes,
+        depends="dirs, common.classes, xmlpublic.classes, typestore.classes, saaj_api.classes,
         typeimpl.classes, xmlcomp.classes">
         <mkdir dir="build/classes/tools"/>
         <javac srcdir="src/tools" destdir="build/classes/tools" source="${javac.source}" target="${javac.target}" debug="on">
             <classpath id="tools.compile.path">
                 <pathelement location="build/classes/typestore"/>
-                <pathelement location="build/lib/jsr173_1.0_api.jar"/>
                 <pathelement location="build/classes/xmlinputstream"/>
                 <pathelement location="build/classes/xmlpublic"/>
                 <pathelement location="build/classes/common"/>
                 <pathelement location="build/classes/saaj_api"/>
-                <pathelement location="build/classes/piccolo"/>
                 <pathelement location="build/classes/typeimpl"/>
                 <pathelement location="build/classes/xmlcomp"/>
             </classpath>
 
     <path id="bootstrap.run.path">
         <pathelement location="build/private/lib/oldxbean.jar"/>
-        <pathelement location="build/lib/jsr173_1.0_api.jar"/>
         <pathelement location="build/classes/xmlpublic"/>
     </path>
 
     <path id="bootstrap.compile.path">
         <pathelement location="build/classes/xmlpublic"/>
-        <pathelement location="build/lib/jsr173_1.0_api.jar"/>
     </path>
 
     <property name="bootstrap.compile.path" refid="bootstrap.compile.path"/>
         </condition>
     </target>
 
-    <target name="xmlschema.classes" depends="xmlschema.check, xmlpublic.classes, oldxbean.jar, jsr173_1.0.jars" unless="xmlschema.notRequired">
+    <target name="xmlschema.classes" depends="xmlschema.check, xmlpublic.classes, oldxbean.jar" unless="xmlschema.notRequired">
         <delete dir="build/classes/xmlschema"/>
         <delete dir="build/src/xmlschema"/>
         <java classname="${bootstrap_schema_compiler}" classpathref="bootstrap.run.path" fork="true" failonerror="true">
     <property name="repackage_arg" value=""/>
     <property name="schema_compiler" value="org.apache.xmlbeans.impl.tool.SchemaCompiler"/>
     <property name="bootstrap_schema_compiler" value="org.apache.xmlbeans.impl.tool.SchemaCompiler"/>
-    <property name="piccolo_package_name" value="org.apache.xmlbeans.impl.piccolo"/>
     <property name="jam_package_name" value="org.apache.xmlbeans.impl.jam"/>
 
     <!--
         <pathelement location="build/classes/common"/>
         <pathelement location="external/lib/junit.jar"/>
         <pathelement location="build/ar/xbean.jar"/>
-        <pathelement location="build/lib/jsr173_1.0_api.jar"/>
         <pathelement location="build/classes/xmlinputstream"/>
     </path>
 
     </path>
 
 
-    <target name="drt.classes" depends="dirs,jsr173_1.0.jars">
+    <target name="drt.classes" depends="dirs">
         <mkdir dir="build/private/classes/drt"/>
         <javac
             destdir="build/private/classes/drt"
 
     <path id="scomp.run.path">
         <pathelement location="build/lib/xbean.jar"/>
-        <pathelement location="build/lib/jsr173_1.0_api.jar"/>
     </path>
 
     <target name="stsschema.check">
         </uptodate>
     </target>
 
-    <target name="jam.classes" depends="jam.classes.check, dirs, repackage.classes, jsr173_1.0.jars" unless="jam.classes.notRequired">
+    <target name="jam.classes" depends="jam.classes.check, dirs, repackage.classes" unless="jam.classes.notRequired">
         <delete dir="build/private/jam"/>
         <mkdir dir="build/private/jam"/>
         <unjar src="external/lib/jam-0.1.0-src.jar" dest="build/private/jam"/>
             source="1.4" target="1.4"
             debug="on">
             <src path="build/private/jam/src_repackage"/>
-            <classpath>
-                <pathelement location="build/lib/jsr173_1.0_api.jar"/>
-            </classpath>
+            <classpath/>
         </javac>
     </target>
-
-    <!-- Piccolo deployment -->
-    <target name="piccolo.classes.check">
-        <uptodate property="piccolo.classes.notRequired"
-            targetfile="build/ar/xbean.jar">
-            <srcfiles dir="external/lib" includes="**/piccolo_*.jar"/>
-        </uptodate>
-    </target>
-
-    <target name="piccolo.classes" depends="piccolo.classes.check, dirs, repackage.classes" unless="piccolo.classes.notRequired">
-        <delete dir="build/private/piccolo"/>
-        <mkdir dir="build/private/piccolo"/>
-        <unjar src="external/lib/piccolo_apache_dist_20040711_v2.jar" dest="build/private/piccolo"/>
-
-        <echo message="Re-packaging Piccolo"/>
-
-        <java classname="repackage.Repackage" fork="true" failonerror="true">
-            <classpath>
-                <pathelement location="build/classes/repackage"/>
-            </classpath>
-            <arg line="-repackage com.bluecast:${piccolo_package_name} -f build/private/piccolo/src -t build/private/piccolo/src_repackage"/>
-        </java>
-
-        <delete dir="build/classes/piccolo"/>
-        <mkdir dir="build/classes/piccolo"/>
-        <javac
-            destdir="build/classes/piccolo"
-            classpath=""
-            source="1.3" target="1.4"
-            debug="on">
-            <src path="build/private/piccolo/src_repackage"/>
-        </javac>
-    </target>
-
 </project>
diff --git a/xmlbeans/external/lib/piccolo.LICENSE.txt b/xmlbeans/external/lib/piccolo.LICENSE.txt
deleted file mode 100644 (file)
index 57bc88a..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed 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.
-
diff --git a/xmlbeans/external/lib/piccolo_apache_dist_20040629.jar b/xmlbeans/external/lib/piccolo_apache_dist_20040629.jar
deleted file mode 100644 (file)
index 7113ab6..0000000
Binary files a/xmlbeans/external/lib/piccolo_apache_dist_20040629.jar and /dev/null differ
diff --git a/xmlbeans/external/lib/piccolo_apache_dist_20040629_v2.jar b/xmlbeans/external/lib/piccolo_apache_dist_20040629_v2.jar
deleted file mode 100644 (file)
index 66f4e24..0000000
Binary files a/xmlbeans/external/lib/piccolo_apache_dist_20040629_v2.jar and /dev/null differ
diff --git a/xmlbeans/external/lib/piccolo_apache_dist_20040711.jar b/xmlbeans/external/lib/piccolo_apache_dist_20040711.jar
deleted file mode 100644 (file)
index 4db79cf..0000000
Binary files a/xmlbeans/external/lib/piccolo_apache_dist_20040711.jar and /dev/null differ
diff --git a/xmlbeans/external/lib/piccolo_apache_dist_20040711_v2.jar b/xmlbeans/external/lib/piccolo_apache_dist_20040711_v2.jar
deleted file mode 100644 (file)
index 5e54618..0000000
Binary files a/xmlbeans/external/lib/piccolo_apache_dist_20040711_v2.jar and /dev/null differ
diff --git a/xmlbeans/external/lib/saxonb9-0-0-4j.zip b/xmlbeans/external/lib/saxonb9-0-0-4j.zip
new file mode 100644 (file)
index 0000000..c0cea24
Binary files /dev/null and b/xmlbeans/external/lib/saxonb9-0-0-4j.zip differ
index 2a865d31d24162672e7bc0fa916903c717e0cd37..fcb8bfe261b0f7a0848d5568f9b53fd45b4b6c37 100755 (executable)
@@ -3466,28 +3466,36 @@ final class Cur
 
         String s = CharUtil.getString( src, off, cch );
 
-        for ( int i = 0 ; i < s.length() ; i++ )
+        for ( int i = 0 ; i < s.length(); )
         {
-            if (i== 36)
+            if (i == 36)
             {
                 o.print( "..." );
                 break;
             }
 
-            char ch = s.charAt( i );
-
-            if (ch >= 32 && ch < 127)
-                o.print( ch );
-            else if (ch == '\n')
-                o.print( "\\n" );
-            else if (ch == '\r')
-                o.print( "\\r" );
-            else if (ch == '\t')
-                o.print( "\\t" );
-            else if (ch == '\"')
-                o.print( "\\\"" );
-            else
-                o.print( "<#" + ((int) ch) + ">" );
+            int codePoint = s.codePointAt( i );
+            char[] chars = Character.toChars(codePoint);
+            
+            if ( chars.length == 1 ) {
+                char ch = chars[0];
+                if (ch >= 32 && ch < 127)
+                    o.print( ch );
+                else if (ch == '\n')
+                    o.print( "\\n" );
+                else if (ch == '\r')
+                    o.print( "\\r" );
+                else if (ch == '\t')
+                    o.print( "\\t" );
+                else if (ch == '\"')
+                    o.print( "\\\"" );
+                else
+                    o.print( "<#" + ((int) ch) + ">" );
+            } else {
+                o.print( "<#" + codePoint + ">" );
+            }
+            
+            i += Character.charCount(codePoint);
         }
 
         o.print( "\"" );
index 531f8763e5dbeb7a23f15c10145862ff7ebb6c4a..b5a1cc433fee05cd9cccd257501fc9049afda52d 100755 (executable)
@@ -1,4 +1,4 @@
-/*   Copyright 2004 The Apache Software Foundation
+/*   Copyright 2004-2017 The Apache Software Foundation
  *
  *   Licensed under the Apache License, Version 2.0 (the "License");
  *   you may not use this file except in compliance with the License.
@@ -25,7 +25,6 @@ import org.xml.sax.InputSource;
 import org.xml.sax.ext.LexicalHandler;
 import org.xml.sax.ext.DeclHandler;
 import org.xml.sax.SAXParseException;
-import org.xml.sax.InputSource;
 import org.xml.sax.XMLReader;
 import org.xml.sax.SAXException;
 import org.xml.sax.DTDHandler;
@@ -38,8 +37,6 @@ import java.lang.ref.Reference;
 import java.lang.ref.PhantomReference;
 import java.lang.ref.SoftReference;
 
-import java.lang.reflect.Method;
-
 import java.io.InputStream;
 import java.io.Reader;
 import java.io.StringReader;
@@ -106,9 +103,6 @@ import org.apache.xmlbeans.impl.values.TypeStore;
 import org.apache.xmlbeans.impl.values.TypeStoreUser;
 import org.apache.xmlbeans.impl.values.TypeStoreUserFactory;
 
-import org.apache.xmlbeans.impl.piccolo.xml.Piccolo;
-import org.apache.xmlbeans.impl.piccolo.io.FileFormatException;
-
 public final class Locale
     implements DOMImplementation, SaajCallback, XmlLocale
 {
@@ -3035,18 +3029,7 @@ public final class Locale
         }
     }
 
-    private static SaxLoader getPiccoloSaxLoader()
-    {
-        SaxLoader piccoloLoader = (SaxLoader) SystemCache.get().getSaxLoader();
-        if (piccoloLoader == null)
-        {
-            piccoloLoader = PiccoloSaxLoader.newInstance();
-            SystemCache.get().setSaxLoader(piccoloLoader);
-        }
-        return piccoloLoader;
-    }
-
-    private static SaxLoader getSaxLoader(XmlOptions options)
+    private static SaxLoader getSaxLoader(XmlOptions options) throws XmlException
     {
         options = XmlOptions.maskNull(options);
 
@@ -3063,31 +3046,23 @@ public final class Locale
                 er = new DefaultEntityResolver();
         }
 
-        SaxLoader sl;
-
-        if (options.hasOption(XmlOptions.LOAD_USE_XMLREADER))
-        {
-            XMLReader xr = (XMLReader) options.get(
-                XmlOptions.LOAD_USE_XMLREADER);
+        XMLReader xr = (XMLReader) options.get(
+            XmlOptions.LOAD_USE_XMLREADER);
 
-            if (xr == null)
-                throw new IllegalArgumentException("XMLReader is null");
-
-            sl = new XmlReaderSaxLoader(xr);
-
-            // I've noticed that most XMLReaders don't like a null EntityResolver...
-
-            if (er != null)
-                xr.setEntityResolver(er);
+        if (xr == null) {
+            try {
+                xr = SAXHelper.newXMLReader();
+            } catch(Exception e) {
+                throw new XmlException("Problem creating XMLReader", e);
+            } 
         }
-        else
-        {
-            sl = getPiccoloSaxLoader();
 
-            // Piccolo doesnot mind a null entity resolver ...
+        SaxLoader sl = new XmlReaderSaxLoader(xr);
 
-            sl.setEntityResolver(er);
-        }
+        // I've noticed that most XMLReaders don't like a null EntityResolver...
+
+        if (er != null)
+            xr.setEntityResolver(er);
 
         return sl;
     }
@@ -3101,34 +3076,6 @@ public final class Locale
         }
     }
 
-    private static class PiccoloSaxLoader
-        extends SaxLoader
-    {
-        private PiccoloSaxLoader(Piccolo p)
-        {
-            super(p, p.getStartLocator());
-
-            _piccolo = p;
-        }
-
-        static PiccoloSaxLoader newInstance()
-        {
-            return new PiccoloSaxLoader(new Piccolo());
-        }
-
-        void postLoad(Cur c)
-        {
-            XmlDocumentProperties props = getDocProps(c, true);
-
-            props.setEncoding(_piccolo.getEncoding());
-            props.setVersion(_piccolo.getVersion());
-
-            super.postLoad(c);
-        }
-
-        private Piccolo _piccolo;
-    }
-
     private static abstract class SaxHandler
         implements ContentHandler, LexicalHandler , DeclHandler, DTDHandler
     {
@@ -3183,7 +3130,7 @@ public final class Locale
             if (local.length() == 0)
                 local = qName;
 
-            // Out current parser (Piccolo) does not error when a
+            // Out current parser does not error when a
             // namespace is used and not defined.  Check for these here
 
             if (qName.indexOf(':') >= 0 && uri.length() == 0)
@@ -3473,12 +3420,6 @@ public final class Locale
 
                 return c;
             }
-            catch (FileFormatException e)
-            {
-                _context.abort();
-
-                throw new XmlException(e.getMessage(), e);
-            }
             catch (XmlRuntimeException e)
             {
                 _context.abort();
diff --git a/xmlbeans/src/store/org/apache/xmlbeans/impl/store/NullLogger.java b/xmlbeans/src/store/org/apache/xmlbeans/impl/store/NullLogger.java
new file mode 100644 (file)
index 0000000..aca8d1d
--- /dev/null
@@ -0,0 +1,81 @@
+/*   Copyright 2017 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+/**
+ * A logger class that strives to make it as easy as possible for
+ * developers to write log calls, while simultaneously making those
+ * calls as cheap as possible by performing lazy evaluation of the log
+ * message.<p>
+ */
+public class NullLogger extends XBLogger {
+    @Override
+    public void initialize(final String cat) {
+       // do nothing
+    }
+
+    /**
+     * Log a message
+     *
+     * @param level One of DEBUG, INFO, WARN, ERROR, FATAL
+     * @param obj1 The object to log.
+     */
+
+    @Override
+    protected void _log(final int level, final Object obj1) {
+        // do nothing
+    }
+
+    /**
+     * Log a message
+     *
+     * @param level One of DEBUG, INFO, WARN, ERROR, FATAL
+     * @param obj1 The object to log.  This is converted to a string.
+     * @param exception An exception to be logged
+     */
+    @Override
+    protected void _log(int level, Object obj1, final Throwable exception) {
+        // do nothing
+    }
+
+    /**
+     * Log a message. Lazily appends Object parameters together.
+     * If the last parameter is a {@link Throwable} it is logged specially.
+     *
+     * @param level One of DEBUG, INFO, WARN, ERROR, FATAL
+     * @param objs the objects to place in the message
+     */
+    @Override
+    public void log(int level, Object... objs) {
+        // do nothing
+    }
+
+    
+    /**
+     * Check if a logger is enabled to log at the specified level
+     *
+     * @param level One of DEBUG, INFO, WARN, ERROR, FATAL
+     */
+    @Override
+    public boolean check(final int level) {
+       return false;
+    }
+}
+
+
+
+
+
diff --git a/xmlbeans/src/store/org/apache/xmlbeans/impl/store/SAXHelper.java b/xmlbeans/src/store/org/apache/xmlbeans/impl/store/SAXHelper.java
new file mode 100644 (file)
index 0000000..67fb3a0
--- /dev/null
@@ -0,0 +1,99 @@
+/*   Copyright 2017 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.lang.reflect.Method;
+import java.util.concurrent.TimeUnit;
+
+import javax.xml.XMLConstants;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.xml.sax.EntityResolver;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+/**
+ * Provides handy methods for working with SAX parsers and readers
+ */
+public final class SAXHelper {
+    private static final XBLogger logger = XBLogFactory.getLogger(SAXHelper.class);
+    private static long lastLog;
+
+    private SAXHelper() {}
+
+    /**
+     * Creates a new SAX XMLReader, with sensible defaults
+     */
+    public static synchronized XMLReader newXMLReader() throws SAXException, ParserConfigurationException {
+        XMLReader xmlReader = saxFactory.newSAXParser().getXMLReader();
+        xmlReader.setEntityResolver(IGNORING_ENTITY_RESOLVER);
+        trySetSAXFeature(xmlReader, XMLConstants.FEATURE_SECURE_PROCESSING);
+        trySetXercesSecurityManager(xmlReader);
+        return xmlReader;
+    }
+    
+    static final EntityResolver IGNORING_ENTITY_RESOLVER = new EntityResolver() {
+        @Override
+        public InputSource resolveEntity(String publicId, String systemId)
+                throws SAXException, IOException {
+            return new InputSource(new StringReader(""));
+        }
+    };
+    
+    private static final SAXParserFactory saxFactory;
+    static {
+        saxFactory = SAXParserFactory.newInstance();
+        saxFactory.setValidating(false);
+        saxFactory.setNamespaceAware(true);
+    }
+            
+    private static void trySetSAXFeature(XMLReader xmlReader, String feature) {
+        try {
+            xmlReader.setFeature(feature, true);
+        } catch (Exception e) {
+            logger.log(XBLogger.WARN, "SAX Feature unsupported", feature, e);
+        } catch (AbstractMethodError ame) {
+            logger.log(XBLogger.WARN, "Cannot set SAX feature because outdated XML parser in classpath", feature, ame);
+        }
+    }
+    
+    private static void trySetXercesSecurityManager(XMLReader xmlReader) {
+        // Try built-in JVM one first, standalone if not
+        for (String securityManagerClassName : new String[] {
+                "com.sun.org.apache.xerces.internal.util.SecurityManager",
+                "org.apache.xerces.util.SecurityManager"
+        }) {
+            try {
+                Object mgr = Class.forName(securityManagerClassName).newInstance();
+                Method setLimit = mgr.getClass().getMethod("setEntityExpansionLimit", Integer.TYPE);
+                setLimit.invoke(mgr, 4096);
+                xmlReader.setProperty("http://apache.org/xml/properties/security-manager", mgr);
+                // Stop once one can be setup without error
+                return;
+            } catch (Throwable e) {     // NOSONAR - also catch things like NoClassDefError here
+                // throttle the log somewhat as it can spam the log otherwise
+                if(System.currentTimeMillis() > lastLog + TimeUnit.MINUTES.toMillis(5)) {
+                    logger.log(XBLogger.WARN, "SAX Security Manager could not be setup [log suppressed for 5 minutes]", e);
+                    lastLog = System.currentTimeMillis();
+                }
+            }
+        }
+    }
+}
index 1344aaacfceebe4b20e2902ae92c35aa6619c956..c7832aa2fc2edc301f7191320917a90d9c4c8e5e 100755 (executable)
@@ -275,7 +275,23 @@ abstract class Saver
         end.moveToCur( c );
         end.toEnd();
     }
-
+    
+    /**
+     * Test if a character is valid in xml character content. See
+     * http://www.w3.org/TR/REC-xml#NT-Char
+     */
+    static boolean isBadChar ( char ch )
+    {
+        return ! (
+            Character.isHighSurrogate(ch) ||
+            Character.isLowSurrogate(ch) ||
+            (ch >= 0x20 && ch <= 0xD7FF ) ||
+            (ch >= 0xE000 && ch <= 0xFFFD) ||
+            (ch >= 0x10000 && ch <= 0x10FFFF) ||
+            (ch == 0x9) || (ch == 0xA) || (ch == 0xD)
+        );
+    }
+        
     protected boolean saveNamespacesFirst ( )
     {
         return _saveNamespacesFirst;
@@ -1387,7 +1403,7 @@ abstract class Saver
                 if (++i == _buf.length)
                     i = 0;
 
-                for ( int cch = _lastEmitCch ; cch > 0 ; cch-- )
+                for ( int cch = _lastEmitCch - 2 ; cch > 0 ; cch-- )
                 {
                     char ch = _buf[ i ];
 
@@ -1551,21 +1567,6 @@ abstract class Saver
             }
         }
 
-        /**
-         * Test if a character is valid in xml character content. See
-         * http://www.w3.org/TR/REC-xml#NT-Char
-         */
-
-        private boolean isBadChar ( char ch )
-        {
-            return ! (
-                (ch >= 0x20 && ch <= 0xD7FF ) ||
-                (ch >= 0xE000 && ch <= 0xFFFD) ||
-                (ch >= 0x10000 && ch <= 0x10FFFF) ||
-                (ch == 0x9) || (ch == 0xA) || (ch == 0xD)
-                );
-        }
-
         /**
          * Test if a character is to be replaced with an escaped value
          */
@@ -2190,20 +2191,6 @@ abstract class Saver
             }
         }
 
-        /**
-         * Test if a character is valid in xml character content. See
-         * http://www.w3.org/TR/REC-xml#NT-Char
-         */
-        private boolean isBadChar ( char ch )
-        {
-            return ! (
-                (ch >= 0x20 && ch <= 0xD7FF ) ||
-                (ch >= 0xE000 && ch <= 0xFFFD) ||
-                (ch >= 0x10000 && ch <= 0x10FFFF) ||
-                (ch == 0x9) || (ch == 0xA) || (ch == 0xD)
-                );
-        }
-
         private void emitLiteral ( String literal )
         {
             // TODO: systemId production http://www.w3.org/TR/REC-xml/#NT-SystemLiteral
diff --git a/xmlbeans/src/store/org/apache/xmlbeans/impl/store/XBLogFactory.java b/xmlbeans/src/store/org/apache/xmlbeans/impl/store/XBLogFactory.java
new file mode 100644 (file)
index 0000000..f31d4db
--- /dev/null
@@ -0,0 +1,119 @@
+/*   Copyright 2017 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Provides logging without clients having to mess with
+ * configuration/initialization.
+ *
+ * @author Andrew C. Oliver (acoliver at apache dot org)
+ * @author Marc Johnson (mjohnson at apache dot org)
+ * @author Nicola Ken Barozzi (nicolaken at apache.org)
+ */
+public final class XBLogFactory {
+    /**
+     * Map of XBLogger instances, with classes as keys
+     */
+    private static final Map<String,XBLogger> _loggers = new HashMap<String,XBLogger>();
+
+    /**
+     * A common instance of NullLogger, as it does nothing
+     *  we only need the one
+     */
+    private static final XBLogger _nullLogger = new NullLogger();
+    /**
+     * The name of the class to use. Initialised the
+     *  first time we need it
+     */
+    static String _loggerClassName = null;
+
+    /**
+     * Construct a XBLogFactory.
+     */
+    private XBLogFactory() {}
+
+    /**
+     * Get a logger, based on a class name
+     *
+     * @param theclass the class whose name defines the log
+     *
+     * @return a XBLogger for the specified class
+     */
+    public static XBLogger getLogger(final Class<?> theclass) {
+        return getLogger(theclass.getName());
+    }
+
+    /**
+     * Get a logger, based on a String
+     *
+     * @param cat the String that defines the log
+     *
+     * @return a XBLogger for the specified class
+     */
+    public static XBLogger getLogger(final String cat) {
+        // If we haven't found out what logger to use yet,
+        //  then do so now
+        // Don't look it up until we're first asked, so
+        //  that our users can set the system property
+        //  between class loading and first use
+        if(_loggerClassName == null) {
+               try {
+                       _loggerClassName = System.getProperty("org.apache.xmlbeans.impl.store.XBLogger");
+               } catch(Exception e) {
+                // ignore any exception here
+            }
+
+               // Use the default logger if none specified,
+               //  or none could be fetched
+               if(_loggerClassName == null) {
+                _loggerClassName = _nullLogger.getClass().getName();
+               }
+        }
+
+        // Short circuit for the null logger, which
+        //  ignores all categories
+        if(_loggerClassName.equals(_nullLogger.getClass().getName())) {
+               return _nullLogger;
+        }
+
+
+        // Fetch the right logger for them, creating
+        //  it if that's required
+        XBLogger logger = _loggers.get(cat);
+        if (logger == null) {
+            try {
+                @SuppressWarnings("unchecked")
+                Class<? extends XBLogger> loggerClass =
+                    (Class<? extends XBLogger>) Class.forName(_loggerClassName);
+                logger = loggerClass.newInstance();
+                logger.initialize(cat);
+            } catch(Exception e) {
+                // Give up and use the null logger
+                logger = _nullLogger;
+                _loggerClassName = _nullLogger.getClass().getName();
+            }
+
+            // Save for next time
+            _loggers.put(cat, logger);
+        }
+        return logger;
+    }
+}
+
+
diff --git a/xmlbeans/src/store/org/apache/xmlbeans/impl/store/XBLogger.java b/xmlbeans/src/store/org/apache/xmlbeans/impl/store/XBLogger.java
new file mode 100644 (file)
index 0000000..fa60511
--- /dev/null
@@ -0,0 +1,115 @@
+/*   Copyright 2017 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.xmlbeans.impl.store;
+
+/**
+ * A logger interface that strives to make it as easy as possible for
+ * developers to write log calls, while simultaneously making those
+ * calls as cheap as possible by performing lazy evaluation of the log
+ * message.<p>
+ */
+public abstract class XBLogger {
+
+    public static final int DEBUG = 1;
+    public static final int INFO  = 3;
+    public static final int WARN  = 5;
+    public static final int ERROR = 7;
+    public static final int FATAL = 9;
+
+    /** Short strings for numeric log level. Use level as array index. */
+    protected static final String LEVEL_STRINGS_SHORT[] = {"?", "D", "?", "I", "?", "W", "?", "E", "?", "F", "?"};
+    /** Long strings for numeric log level. Use level as array index. */
+    protected static final String LEVEL_STRINGS[] = {"?0?", "DEBUG", "?2?", "INFO", "?4?", "WARN", "?6?", "ERROR", "?8?", "FATAL", "?10+?"};
+
+
+    /**
+     * package scope so it cannot be instantiated outside of the util
+     * package. You need a XBLogger? Go to the XBLogFactory for one
+     */
+    XBLogger() {
+        // no fields to initialize
+    }
+
+    abstract public void initialize(String cat);
+
+    /**
+     * Log a message
+     *
+     * @param level One of DEBUG, INFO, WARN, ERROR, FATAL
+     * @param obj1 The object to log.  This is converted to a string.
+     */
+    abstract protected void _log(int level, Object obj1);
+
+    /**
+     * Log a message
+     *
+     * @param level One of DEBUG, INFO, WARN, ERROR, FATAL
+     * @param obj1 The object to log.  This is converted to a string.
+     * @param exception An exception to be logged
+     */
+    abstract protected void _log(int level, Object obj1, final Throwable exception);
+
+
+    /**
+     * Check if a logger is enabled to log at the specified level
+     * This allows code to avoid building strings or evaluating functions in
+     * the arguments to log.
+     * 
+     * An example:
+     * <code><pre>
+     * if (logger.check(XBLogger.INFO)) {
+     *     logger.log(XBLogger.INFO, "Avoid concatenating " + " strings and evaluating " + functions());
+     * }
+     * </pre></code>
+     *
+     * @param level One of DEBUG, INFO, WARN, ERROR, FATAL
+     */
+    abstract public boolean check(int level);
+
+   /**
+     * Log a message. Lazily appends Object parameters together.
+     * If the last parameter is a {@link Throwable} it is logged specially.
+     *
+     * @param level One of DEBUG, INFO, WARN, ERROR, FATAL
+     * @param objs the objects to place in the message
+     */
+    public void log(int level, Object... objs) {
+        if (!check(level)) return;
+        StringBuilder sb = new StringBuilder(32);
+        Throwable lastEx = null;
+        for (int i=0; i<objs.length; i++) {
+            if (i == objs.length-1 && objs[i] instanceof Throwable) {
+                lastEx = (Throwable)objs[i];
+            } else {
+                sb.append(objs[i]);
+            }
+        }
+        
+        String msg = sb.toString();
+        msg = msg.replaceAll("[\r\n]+", " ");  // log forging escape
+        
+        // somehow this ambiguity works and doesn't lead to a loop,
+        // but it's confusing ...
+        if (lastEx == null) {
+            _log(level, msg);
+        } else {
+            _log(level, msg, lastEx);
+        }
+    }
+}
+
+
+
diff --git a/xmlbeans/src/store/org/w3c/dom/DOMConfiguration.java b/xmlbeans/src/store/org/w3c/dom/DOMConfiguration.java
deleted file mode 100755 (executable)
index df99c99..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-/*   Copyright 2004 The Apache Software Foundation
- *
- *   Licensed under the Apache License, Version 2.0 (the "License");
- *   you may not use this file except in compliance with the License.
- *   You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *   Unless required by applicable law or agreed to in writing, software
- *   distributed under the License is distributed on an "AS IS" BASIS,
- *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *   See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package org.w3c.dom;
-
-public interface DOMConfiguration
-{
-    public boolean canSetParameter ( String name, Object value );
-    
-    public Object getParameter ( String name );
-    
-    public DOMStringList getParameterNames (  );
-    
-    public void setParameter ( String name, Object value );
-}
\ No newline at end of file
diff --git a/xmlbeans/src/store/org/w3c/dom/DOMStringList.java b/xmlbeans/src/store/org/w3c/dom/DOMStringList.java
deleted file mode 100755 (executable)
index 95d4a32..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/*   Copyright 2004 The Apache Software Foundation
- *
- *   Licensed under the Apache License, Version 2.0 (the "License");
- *   you may not use this file except in compliance with the License.
- *   You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *   Unless required by applicable law or agreed to in writing, software
- *   distributed under the License is distributed on an "AS IS" BASIS,
- *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *   See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package org.w3c.dom;
-
-public interface DOMStringList
-{
-    public boolean contains ( String str );
-    
-    public int getLength (  );
-    
-    public String item ( int index );
-}
\ No newline at end of file
diff --git a/xmlbeans/src/store/org/w3c/dom/TypeInfo.java b/xmlbeans/src/store/org/w3c/dom/TypeInfo.java
deleted file mode 100755 (executable)
index 74df1de..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/*   Copyright 2004 The Apache Software Foundation
- *
- *   Licensed under the Apache License, Version 2.0 (the "License");
- *   you may not use this file except in compliance with the License.
- *   You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *   Unless required by applicable law or agreed to in writing, software
- *   distributed under the License is distributed on an "AS IS" BASIS,
- *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *   See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package org.w3c.dom;
-
-public interface TypeInfo
-{
-    public static final int DERIVATION_EXTENSION   = 2;
-    public static final int DERIVATION_LIST        = 8;
-    public static final int DERIVATION_RESTRICTION = 1;
-    public static final int DERIVATION_UNION       = 4;
-            
-    public String getTypeName ( );
-    
-    public String getTypeNamespace ( );
-    
-    public boolean isDerivedFrom (
-        String typeNamespaceArg, String typeNameArg, int derivationMethod );
-}
\ No newline at end of file
diff --git a/xmlbeans/src/store/org/w3c/dom/UserDataHandler.java b/xmlbeans/src/store/org/w3c/dom/UserDataHandler.java
deleted file mode 100755 (executable)
index a44bdeb..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-/*   Copyright 2004 The Apache Software Foundation
- *
- *   Licensed under the Apache License, Version 2.0 (the "License");
- *   you may not use this file except in compliance with the License.
- *   You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *   Unless required by applicable law or agreed to in writing, software
- *   distributed under the License is distributed on an "AS IS" BASIS,
- *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *   See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package org.w3c.dom;
-
-public interface UserDataHandler
-{
-    public static final short NODE_ADOPTED  = 5;
-    public static final short NODE_CLONED   = 1;
-    public static final short NODE_DELETED  = 3;
-    public static final short NODE_IMPORTED = 2;
-    public static final short NODE_RENAMED  = 4;
-
-    public void handle ( short operation, String key, Object data, Node src, Node dst );
-}
\ No newline at end of file
diff --git a/xmlbeans/src/xmlpublic/javax/xml/namespace/NamespaceContext.java b/xmlbeans/src/xmlpublic/javax/xml/namespace/NamespaceContext.java
deleted file mode 100644 (file)
index 8d24f07..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/*   Copyright 2004 The Apache Software Foundation
- *
- *   Licensed under the Apache License, Version 2.0 (the "License");
- *   you may not use this file except in compliance with the License.
- *   You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *   Unless required by applicable law or agreed to in writing, software
- *   distributed under the License is distributed on an "AS IS" BASIS,
- *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *   See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.xml.namespace;
-
-import java.util.Iterator;
-
-public interface NamespaceContext {
-
-    public String getNamespaceURI(String prefix);
-    public String getPrefix(String namespaceURI);
-    public Iterator getPrefixes(String namespaceURI);
-}
diff --git a/xmlbeans/src/xmlpublic/javax/xml/namespace/QName.java b/xmlbeans/src/xmlpublic/javax/xml/namespace/QName.java
deleted file mode 100644 (file)
index 4dd9432..0000000
+++ /dev/null
@@ -1,231 +0,0 @@
-/*   Copyright 2004 The Apache Software Foundation
- *
- *   Licensed under the Apache License, Version 2.0 (the "License");
- *   you may not use this file except in compliance with the License.
- *   You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *   Unless required by applicable law or agreed to in writing, software
- *   distributed under the License is distributed on an "AS IS" BASIS,
- *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *   See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-package javax.xml.namespace;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.Serializable;
-
-/**
- * <code>QName</code> class represents the value of a qualified name
- * as specified in <a href="http://www.w3.org/TR/xmlschema-2/#QName">XML
- * Schema Part2: Datatypes specification</a>.
- * <p>
- * The value of a QName contains a <b>namespaceURI</b>, a <b>localPart</b> and a <b>prefix</b>.
- * The localPart provides the local part of the qualified name. The
- * namespaceURI is a URI reference identifying the namespace.
- *
- * @version 1.1
- */
-public class QName implements Serializable {
-    
-    private static final long serialVersionUID = -9120448754896609940L;
-    
-    /** comment/shared empty string */
-    private static final String emptyString = "".intern();
-
-    /** Field namespaceURI */
-    private String namespaceURI;
-
-    /** Field localPart */
-    private String localPart;
-
-    /** Field prefix */
-    private String prefix;
-
-    /**
-     * Constructor for the QName.
-     *
-     * @param localPart Local part of the QName
-     */
-    public QName(String localPart) {
-        this(emptyString, localPart, emptyString);
-    }
-
-    /**
-     * Constructor for the QName.
-     *
-     * @param namespaceURI Namespace URI for the QName
-     * @param localPart Local part of the QName.
-     */
-    public QName(String namespaceURI, String localPart) {
-        this(namespaceURI, localPart, emptyString);
-    }
-
-    /**
-     * Constructor for the QName.
-     *
-     * @param namespaceURI Namespace URI for the QName
-     * @param localPart Local part of the QName.
-     * @param prefix Prefix of the QName.
-     */
-    public QName(String namespaceURI, String localPart, String prefix) {
-        this.namespaceURI = (namespaceURI == null)
-                ? emptyString
-                : namespaceURI.intern();
-        if (localPart == null) {
-            throw new IllegalArgumentException("invalid QName local part");
-        } else {
-            this.localPart = localPart.intern();
-        }
-
-        if (prefix == null) {
-            throw new IllegalArgumentException("invalid QName prefix");
-        } else {
-            this.prefix = prefix.intern();
-        }
-    }
-
-    /**
-     * Gets the Namespace URI for this QName
-     *
-     * @return Namespace URI
-     */
-    public String getNamespaceURI() {
-        return namespaceURI;
-    }
-
-    /**
-     * Gets the Local part for this QName
-     *
-     * @return Local part
-     */
-    public String getLocalPart() {
-        return localPart;
-    }
-
-    /**
-     * Gets the Prefix for this QName
-     *
-     * @return Prefix
-     */
-    public String getPrefix() {
-        return prefix;
-    }
-
-    /**
-     * Returns a string representation of this QName
-     *
-     * @return  a string representation of the QName
-     */
-    public String toString() {
-
-        return ((namespaceURI == emptyString)
-                ? localPart
-                : '{' + namespaceURI + '}' + localPart);
-    }
-
-    /**
-     * Tests this QName for equality with another object.
-     * <p>
-     * If the given object is not a QName or is null then this method
-     * returns <tt>false</tt>.
-     * <p>
-     * For two QNames to be considered equal requires that both
-     * localPart and namespaceURI must be equal. This method uses
-     * <code>String.equals</code> to check equality of localPart
-     * and namespaceURI. Any class that extends QName is required
-     * to satisfy this equality contract.
-     * <p>
-     * This method satisfies the general contract of the <code>Object.equals</code> method.
-     *
-     * @param obj the reference object with which to compare
-     *
-     * @return <code>true</code> if the given object is identical to this
-     *      QName: <code>false</code> otherwise.
-     */
-    public final boolean equals(Object obj) {
-
-        if (obj == this) {
-            return true;
-        }
-
-        if (!(obj instanceof QName)) {
-            return false;
-        }
-
-        if ((namespaceURI == ((QName) obj).namespaceURI)
-                && (localPart == ((QName) obj).localPart)) {
-            return true;
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns a QName holding the value of the specified String.
-     * <p>
-     * The string must be in the form returned by the QName.toString()
-     * method, i.e. "{namespaceURI}localPart", with the "{namespaceURI}"
-     * part being optional.
-     * <p>
-     * This method doesn't do a full validation of the resulting QName.
-     * In particular, it doesn't check that the resulting namespace URI
-     * is a legal URI (per RFC 2396 and RFC 2732), nor that the resulting
-     * local part is a legal NCName per the XML Namespaces specification.
-     *
-     * @param s the string to be parsed
-     * @throws java.lang.IllegalArgumentException If the specified String cannot be parsed as a QName
-     * @return QName corresponding to the given String
-     */
-    public static QName valueOf(String s) {
-
-        if ((s == null) || s.equals("")) {
-            throw new IllegalArgumentException("invalid QName literal");
-        }
-
-        if (s.charAt(0) == '{') {
-            int i = s.indexOf('}');
-
-            if (i == -1) {
-                throw new IllegalArgumentException("invalid QName literal");
-            }
-
-            if (i == s.length() - 1) {
-                throw new IllegalArgumentException("invalid QName literal");
-            } else {
-                return new QName(s.substring(1, i), s.substring(i + 1));
-            }
-        } else {
-            return new QName(s);
-        }
-    }
-
-    /**
-     * Returns a hash code value for this QName object. The hash code
-     * is based on both the localPart and namespaceURI parts of the
-     * QName. This method satisfies the  general contract of the
-     * <code>Object.hashCode</code> method.
-     *
-     * @return a hash code value for this Qname object
-     */
-    public final int hashCode() {
-        return namespaceURI.hashCode() ^ localPart.hashCode();
-    }
-
-    /**
-     * Ensure that deserialization properly interns the results.
-     * @param in the ObjectInputStream to be read
-     */
-    private void readObject(ObjectInputStream in) throws
-            IOException, ClassNotFoundException {
-        in.defaultReadObject();
-
-        namespaceURI = namespaceURI.intern();
-        localPart = localPart.intern();
-        prefix = prefix.intern();
-    }
-}
index ac0ec294656586a270e33edb58e59e4a7afa91cb..80ab820ba38724b963ca0cbf130ae6ce9eaa5081 100755 (executable)
@@ -1112,7 +1112,7 @@ public class StoreTests extends TestCase
         throws Exception
     {
         XmlCursor c = XmlObject.Factory.parse( xml ).newCursor();
-        Assert.assertTrue( c.xmlText().equals( xml ) );
+        Assert.assertEquals( xml, c.xmlText() );
     }
     
     private void doSaveTest ( String xml )
@@ -1121,6 +1121,16 @@ public class StoreTests extends TestCase
         doSaverTest( xml );
     }
 
+    public void testCDATA() throws Exception
+    {
+        // https://issues.apache.org/jira/browse/XMLBEANS-404
+        String xml = "<foo>Unable to render embedded object: <![CDATA[>>>>>>>><<<<<<<<<<<]]></foo>";
+        String expected = "<foo><![CDATA[Unable to render embedded object: >>>>>>>><<<<<<<<<<<]]></foo>";
+        XmlOptions options = new XmlOptions().setSaveCDataLengthThreshold(0);
+        XmlCursor c = XmlObject.Factory.parse(xml, options).newCursor();
+        Assert.assertEquals( expected, c.xmlText(options) );
+    }
+
     public void testSaving ( )
         throws Exception
     {
index a6364a81f8ed60f43cbe723b93ca0b6d39aedf21..ce4b235219289858a5df5526809fb163fe62cccb 100755 (executable)
@@ -40,7 +40,6 @@ public class AssortedTests extends TestCase
     // bug 27489
     public static void testSaverCharEscaping() throws XmlException
     {
-        String newLine = System.getProperty( "line.separator" );
         XmlObject xdoc = XmlObject.Factory.parse("<test>something</test>");
         XmlCursor cur = xdoc.newCursor();
         cur.toFirstChild();
@@ -48,9 +47,14 @@ public class AssortedTests extends TestCase
         cur.setTextValue("<something or other:\u03C0\uD7FF>");
         Assert.assertEquals("<test>&lt;something or other:\u03C0\uD7FF></test>", xdoc.toString());
         
-        // invalid chars - control chars, unicode surrogates, FFFF/FFFE, etc
-        cur.setTextValue("<something\0or\1other:\u0045\uFFFE\uD800\uDFFF\uDB80\uDC00\u03C0\uD7FF\u001F>");
-        Assert.assertEquals("<test>&lt;something?or?other:\u0045?????\u03C0\uD7FF?></test>", xdoc.toString());
+        // invalid chars - control chars, FFFF/FFFE, etc
+        cur.setTextValue("<something\0or\1other:\u0045\u001F>");
+        Assert.assertEquals("<test>&lt;something?or?other:\u0045?></test>", xdoc.toString());
+        
+        String greekChars = "\uD835\uDF4A\uD835\uDF4B\uD835\uDF4C\uD835\uDF4D\uD835\uDF4E\uD835\uDF4F\uD835\uDF50\uD835"
+               + "\uDF51\uD835\uDF52\uD835\uDF53\uD835\uDF54\uD835\uDF55";
+        cur.setTextValue(greekChars);
+        Assert.assertEquals("<test>" + greekChars + "</test>", xdoc.toString());
     }
     
     // bug 26140/26104
index 1b64a5283ec09edfa029bbe70b2994aa3d589ca6..791e212111a5812edf2a3821fb935694e0defe74 100644 (file)
@@ -53,8 +53,8 @@ public class CDataTest
             throws Exception
     {
         String xmlText = "<a><![CDATA[cdata text]]></a>";
-
-        checkCData(xmlText, xmlText, xmlText);
+        String resultText = "<a>cdata text</a>";
+        checkCData(xmlText, resultText, resultText);
     }
 
     public void testCData2()
@@ -64,10 +64,10 @@ public class CDataTest
                 "<b><![CDATA[cdata text]]> regular text</b>" + NL +
                 "</a>";
         String expected1 = "<a>\n" +
-                           "<b><![CDATA[cdata text regular text]]></b>\n" +
+                           "<b>cdata text regular text</b>\n" +
                            "</a>";
         String expected2 = "<a>" + NL +
-                           "  <b><![CDATA[cdata text regular text]]></b>" + NL +
+                           "  <b>cdata text regular text</b>" + NL +
                            "</a>";
 
         checkCData(xmlText, expected1, expected2);
@@ -89,6 +89,23 @@ public class CDataTest
         checkCData(xmlText, expected1, expected2);
     }
 
+    // https://issues.apache.org/jira/browse/XMLBEANS-404
+    public void testXmlBeans404()
+            throws Exception
+    {
+        String xmlText = "<a>\n" +
+                "<c>text <![CDATA[cdata text]]]]></c>\n" +
+                "</a>";
+        String expected1 = "<a>\n" +
+                "<c>text cdata text]]</c>\n" +
+                "</a>";
+        String expected2 = "<a>" + NL +
+                "  <c>text cdata text]]</c>" + NL +
+                "</a>";
+
+        checkCData(xmlText, expected1, expected2);
+    }
+
     private void checkCData(String xmlText, String expected1, String expected2)
             throws XmlException
     {