001         package com.croftsoft.core.text.xml;
002    
003         import java.io.*;
004    
005         /*********************************************************************
006         * Filters out characters not permitted in XML.
007         *
008         * @see
009         *   <a target="_blank" href="http://www.w3.org/TR/REC-xml#charsets">
010         *   Extensible Markup Language (XML) 1.0 (Second Edition),
011         *   2.2 Characters</a>
012         *
013         * @version
014         *   2002-09-24
015         * @since
016         *   2002-09-19
017         * @author
018         *   <a href="http://www.CroftSoft.com/">David Wallace Croft</a>
019         *********************************************************************/
020    
021         public final class  XmlCharFilterReader
022           extends FilterReader
023         //////////////////////////////////////////////////////////////////////
024         //////////////////////////////////////////////////////////////////////
025         {
026    
027         /*********************************************************************
028         * Main constructor.
029         *********************************************************************/
030         public  XmlCharFilterReader ( Reader  in )
031         //////////////////////////////////////////////////////////////////////
032         {
033           super ( in );
034         }
035    
036         //////////////////////////////////////////////////////////////////////
037         //////////////////////////////////////////////////////////////////////
038    
039         public int  read ( )
040           throws IOException
041         //////////////////////////////////////////////////////////////////////
042         {
043           int  ch;
044    
045           while ( ( ch = super.read ( ) ) > -1 )
046           {
047             if ( ( ch == 0x9 )
048               || ( ch == 0xA )
049               || ( ch == 0xD )
050               || ( ( ch >= 0x00020 ) && ( ch <= 0x00D7FF ) )
051               || ( ( ch >= 0x0E000 ) && ( ch <= 0x00FFFD ) )
052               || ( ( ch >= 0x10000 ) && ( ch <= 0x10FFFF ) ) )
053             {
054               return ch;
055             }
056           }
057    
058           return -1;
059         }
060    
061         public int  read (
062           char [ ]  cbuf,
063           int       off,
064           int       len )
065           throws IOException
066         //////////////////////////////////////////////////////////////////////
067         {
068           int  count = 0;
069    
070           for ( int  i = 0; i < len; i++ )
071           {
072             int  ch = read ( );
073    
074             if ( ch < 0 )
075             {
076               return count > 0 ? count : -1;
077             }
078    
079             cbuf [ off + count ] = ( char ) ch;
080    
081             count++;
082           }
083    
084           return len;
085         }
086    
087         public int  read ( char [ ]  cbuf )
088           throws IOException
089         //////////////////////////////////////////////////////////////////////
090         {
091           return read ( cbuf, 0, cbuf.length );
092         }
093    
094         //////////////////////////////////////////////////////////////////////
095         //////////////////////////////////////////////////////////////////////
096         }