/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/StreamProg.java


public class StreamProg {

    public static void main (String [] args) {
        try {
            int ch;
            CharEingabeStrom cs;
            cs = new StringLeser (args[0]);
            cs = new UmlautSzFilter (cs);
            cs = new GrossBuchstabenFilter (cs);
            
            
            while ((ch = cs.read()) != -1)
                System.out.println ((char) (ch));
        }
        catch (ArrayIndexOutOfBoundsException e) {
            System.out.println ("usage: java StreamProg arg1");
        }
    }
    
    interface CharEingabeStrom {
        int read();
    }

    public static class StringLeser implements CharEingabeStrom {
        private String quelle;
        private int index;
        
        public StringLeser (String quelle) {
            this.quelle = quelle;
        }
    
        @Override
        public int read () {
            if ((index == quelle.length()))
                return -1;
            return quelle.charAt (index++);
        }
    }
    
    public static class GrossBuchstabenFilter implements CharEingabeStrom {
        private CharEingabeStrom quelle;
        
        public GrossBuchstabenFilter (CharEingabeStrom quelle) {
            this.quelle = quelle;
        }
        
        @Override
        public int read () {
            int zeichen = quelle.read();
            if (zeichen == -1)
                return -1;
            return Character.toUpperCase ((char) zeichen);
        }    
    }
    
    public static class UmlautSzFilter implements CharEingabeStrom {
        private CharEingabeStrom quelle;
        private int puffer = -1;
        
        public UmlautSzFilter (CharEingabeStrom quelle) {
            this.quelle = quelle;
        }
        
        @Override 
        public int read () {
            if (puffer != -1) {
                int zeichen = puffer;
                puffer = -1;
                return zeichen;
            }
            else {
                int zeichen = quelle.read ();
                if (zeichen == -1)
                    return -1;
                switch ((char) zeichen) {
                    case '\u00C4':
                        puffer = 'e';
                        return 'A';
                    case '\u00D6':
                        puffer = 'e';
                        return 'O';
                    case '\u00DC':
                        puffer = 'e';
                        return 'U';
                    case '\u00E4':
                        puffer = 'e';
                        return 'a';
                    case '\u00F6':
                        puffer = 'e';
                        return 'o';
                    case '\u00FC':
                        puffer = 'e';
                        return 'u';
                    case '\u00DF':
                        puffer = 's';
                        return 's';
                    default:
                        return zeichen;
                }
            }
        }
    }
}