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;
}
}
}
}