/*
 * "Grundkurs Programmieren in Java - Band 1 (3. Auflage, 2006)I"
 * 2001-2006, Carl Hanser Verlag
 * Loesungsvorschlag zu Aufgabe 12.1 (Version 3.0)
 * (c) 2001-2006 D. Ratz, J. Scheffler, D. Seese, J. Wiesenberger
 *
 */

public class XorInflater extends Encoder {

  /** Hier wird der geheime Schluessel abgespeichert */
  private int key;

  public XorInflater ( int key ) {
    this.key = key;
  }

  public String encode(String s) {
    return xor( inflate(s) );
  }


  public String decode(String s) {
    return deflate( xor(s) );
  }


  // geklaut aus 'Inflater.encode'
  public String inflate (String s) {
    // Wandle den String in ein char-Array um
    // (toCharArray ist Methode der Klasse String)
    char[] c = s.toCharArray();
    // Initialisiere den String res,
    // der das Ergebnis enthalten soll
    String res="";
    // Wende den Algorithmus immer auf zwei Zeichen an
    for (int i=0;i<c.length-1;i=i+2) {
      char c1=c[i];   // das erste Zeichen
      char c2=c[i+1]; // das zweite Zeichen
      // Bestimme ein drittes, zufaelliges Zeichen
      char c3=(char)('a'+26*Math.random());
      // tausche c2,c1 und fuege c3 dazwischen
      res=res+c2+c3+c1;
    }
    // Falls die Laenge des Feldes ungerade war,
    // haben wir ein Zeichen uebersehen
    if (c.length%2!=0) {
      // Dieses Zeichen muessen wir noch hinzufuegen
      res=res+c[c.length-1];
    }
    // Gib das Ergebnis zurueck
    return res;
  }


  // geklaut aus 'Inflater.decode'
  public String deflate (String s) {
    // Wandle den String in ein char-Array um
    char[] c=s.toCharArray();
    // Initialisiere den String res,
    // der das Ergebnis enthalten soll
    String res="";
    // Wende den Algorithmus immer auf drei Zeichen an
    for (int i=0;i<c.length-2;i=i+3) {
      // zuerst das Zeichen c1, das ja an Stelle 3 steht
      res=res+c[i+2];
      // nun das    Zeichen c2
      res=res+c[i];
      // das Zeichen c3 faellt weg!
    }
    // Teste, ob ein Zeichen uebersehen wurde
    if (c.length % 3 != 0) {
      res=res + c[c.length - 1];
    }
    // Gib das Ergebnis zurueck
    return res;
  }


  // geklaut aus 'XorEncode.encode'
  public String xor (String s) {
    // Wandle den String in ein char-Array um
    // (toCharArray ist Methode der Klasse String)
    char[] c = s.toCharArray();
    // Wende auf die einzelnen Zeichen die XOR-Verschluesselung an
    for (int i=0;i<c.length;i++)
      c[i]=(char)(c[i]^key);
    // Gib das verschluesselte Feld als Array zurueck
    return new String(c);
  }

}
