/media/sda-magnetic/david/Extern-Magnetic-2022-06-29/Extern01/Dokumente-2021-05-8/disk10-ab-2020-01-10/02-debian-pc2-work/informatik/java-new/2020-11-23/CharStreamProg.java


public class CharStreamProg {
    public static void main (String [] args) {
        try {
            StringReadr sr = new StringReadr (args[0]);
            ToUpperFilter tuf = new ToUpperFilter (sr);
            GermanVowelFilter gvf = new GermanVowelFilter (tuf);
            ToUpperFilter tuf2 = new ToUpperFilter (gvf);
            int ch;
            
            while ((ch = tuf2.read()) != -1)
                System.out.print ((char)ch);
            System.out.println (" ");
        }
        catch (ArrayIndexOutOfBoundsException e) {
            System.out.println ("You have to give one argument at least");
        }
    }
    
    interface CharStream {
        int read ();
    }
    
    public static class StringReadr implements CharStream {
        String buf;
        int i;
        
        StringReadr (String buf) {
            this.buf = buf;
            i = 0;
        }
        
        @Override
        public int read () {
            if (i == this.buf.length())
                return -1;
            return buf.charAt(i++);
        }
    }
    
    public static class ToUpperFilter implements CharStream {
        private CharStream src;
        
        ToUpperFilter (CharStream src) {
            this.src = src;
        }
        
        @Override
        public int read () {
            int ch;
            if ((ch = src.read()) == -1)
                return -1;
            return Character.toUpperCase((char)ch);
        }
    }
    
    public static class GermanVowelFilter implements CharStream {
        private CharStream src;
        int charbuf;
        
        GermanVowelFilter (CharStream src) {
            this.src = src;
            charbuf = -1;
        }
        
        @Override
        public int read () {
            int ch;
            
            if (charbuf != -1) {
                int tmp = charbuf;
                charbuf = -1;
                return tmp;
            }
            
            if ((ch = this.src.read()) == -1)
                return -1;
            switch ((char)ch) {
                case 'ä':
                    charbuf = 'e';
                    return 'a';
                case 'ö':
                    charbuf = 'e';
                    return 'o';
                case 'ü':
                    charbuf = 'e';
                    return 'u';
                case 'Ä':
                    charbuf = 'e';
                    return 'A';
                case 'Ö':
                    charbuf = 'e';
                    return 'O';
                case 'Ü':
                    charbuf = 'e';
                    return 'U';
                case 'ß':
                    charbuf = 's';
                    return 's';
                default:
                    return ch;
            }
        }
    }
}