import java.util.*;
import java.io.*;
import java.net.*;

/** Dieses Implementierung des Uhrwerk-Interfaces erhaelt ihre
  * Zeitinformationen von einem Zeitserver
  **/
public class Serverzeit implements Uhrwerk {
  
  /** Der Rechnername des Zeitservers */
  private String rechner;
  
  /** Die Nummer des Ports */
  private int port;
  
  /** Konstruktor */
  public Serverzeit(String rechner, int port) {
    this.rechner = rechner;
    this.port = port;
  }
  
  /** Hilfsmethode: Oeffnet eine Verbindung, schickt eine
    * einzelne Anfrage und schliesst die Verbindung.
    **/
  private String anfrage(String kommando) {
    Socket s = null;
    try {
      s = new Socket(rechner,port);
      PrintWriter out = new 
        PrintWriter(s.getOutputStream(),true);
      BufferedReader in = new BufferedReader(
        new InputStreamReader(s.getInputStream()));
      out.println(kommando);
      String resultat = in.readLine();
      out.println("ENDE");
      out.flush();
      return resultat;
    }
    catch(Exception e) {
      e.printStackTrace();
    }
    finally {
      if (s != null) {
        try {
          s.close();
        }
        catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
    return null;      
  }

  /** Gibt die aktuelle Uhrzeit in Form eines Date-Objektes
    * zurueck.
    * @return die aktuelle Zeit
    **/
  public Date getZeit() {
    try {
      String zeit = anfrage("WIESPAET");
      return new Date(Long.parseLong(zeit));
    }
    catch(Exception e) {
      e.printStackTrace();
      return new Date();
    }
  }
  
  /** Stellt das Werk dieser Uhr auf eine bestimmte Zeit.
    * Diese Methode ist optional und muss nicht immer 
    * implementiert sein.
    * @param zeit die aktuelle Uhrzeit
    * @exception UnsupportedOperationException falls diese Methode
    *  nicht unterstuetzt wird
    **/
  public void setZeit(Date zeit) throws UnsupportedOperationException {
    throw new UnsupportedOperationException();
  }
  
  /** Fragt einen Teststring vom Zeitserver ab. Liefert null zurueck,
    * wenn die Kommunikation fehlschlaegt.
    **/
  public String testString() {
    return anfrage("TEST");
  }

}
