/**
  * Diese Methode kann das übergebene Objekt in die lokale Datenbank einfügen.
  *
  * @param GenericDataObject Das Object, das in die Datenbank eingefügt werden soll.
  * @author Alpay Firato
  */
 public void addTermin(GenericDataObject Object) {
   try {
     if (Object != null) {
       gdo.setCurrentTable("attachable_object");
       AttachableObject a = new AttachableObject();
       a.setTableName(this.tablename.toLowerCase());
       a.setKategorieId(0);
       gdo.addDataObject(a);
       a =
           (AttachableObject)
               gdo.unsafeQuery(
                       "select * from attachable_object where global_id=identity()",
                       new AttachableObject())
                   .get(0);
       Termin l = (Termin) Object;
       l.setId(a.getId());
       l.setGroupID(0);
       gdo.setCurrentTable(this.tablename);
       gdo.addDataObject(l);
     } else {
       JOptionPane.showMessageDialog(
           null,
           "Error: NULL OBJECT kann nicht in die Datenbank eingefügt werden",
           "Error!",
           JOptionPane.ERROR_MESSAGE);
     }
   } catch (Exception e) {
     JOptionPane.showMessageDialog(
         null, "Error: " + e.toString(), "Error!", JOptionPane.ERROR_MESSAGE);
   }
 }
  /**
   * Diese Methode liefert den Inhalt einer Zelle zurück.
   *
   * @param int Reihe der Zelle.
   * @param int Spalte der Zelle.
   * @return Object Wert der Zelle.
   * @author Alpay Firato
   */
  public Object getValueAt(int row, int col) {
    Termin ter = (Termin) objects.get(row);

    if (ter == null) return null;
    else if (col == 0) return ter.getSecondaryTitle();
    else if (col == 1) return ter.getDescription();
    else if (col == 2) return ter.getDate();
    else if (col == 3) return ter.getDuration();
    else return null;
  }
  /**
   * Diese Methode löscht das übergebene Objekt aus der lokalen Datenbank.
   *
   * @param Termin Das ist der Termin der aus dem Datenbank entfernt werden soll.
   * @return boolean Falls das Objekt erfolgreich gelöscht wurde dann wird true zurückgeliefert,
   *     sonnst false.
   * @author Alpay Firato
   */
  public boolean deleteTermin(Termin Object) {
    if (Object == null) return false;

    try {
      GenericDAO gdo = new GenericDAO();
      List<GenericDataObject> loeschen =
          gdo.unsafeQuery(
              "SELECT * FROM " + this.tablename + " WHERE ID =" + Object.getId(), new Termin());
      lastDeletedObjects.add(loeschen.get(0));
      loeschen =
          gdo.unsafeQuery(
              "DELETE FROM " + this.tablename + " WHERE ID =" + Object.getId(), new Termin());
      return true;
    } catch (Exception e) {
      JOptionPane.showMessageDialog(
          null, "Error: " + e.toString(), "Error!", JOptionPane.ERROR_MESSAGE);
    }
    return true;
  }
  /**
   * Diese Methode liest die Daten von der lokalen Datenbank mit Hilfe des Generic-DAO aus. Danach
   * werden alle Objekte, die aus der Datenbank ausgelwsen worden sind, in eine Liste gespeichert.
   * Die Datensätze werden nach order geordnet.
   *
   * @author Alpay Firato
   */
  private void readData() {
    String query =
        "select * from TERMIN as t, ATTACHABLE_OBJECT_KATEGORIE as ok, TERMIN_KATEGORIE as kat where t.TERMIN_KATEGORIE_ID = kat.id AND t.GROUP_ID = ok.id";
    try {
      GenericDAO gdo = new GenericDAO();
      if (searchObject != null) {
        if (searchObject.getSecondaryTitle() != null) {
          query +=
              " AND LOWER(t.SECONDARY_TITLE) LIKE '%"
                  + searchObject.getSecondaryTitle().toLowerCase()
                  + "%'";
        }
        if (searchObject.getDescription() != null) {
          query +=
              " AND LOWER(t.DESCRIPTION) LIKE '%"
                  + searchObject.getDescription().toLowerCase()
                  + "%'";
        }
        if (this.datum != null) {
          query += " AND t.DATE LIKE '%" + this.datum + "%'";
        }
        if (this.type != null && !this.type.equals("-")) {
          query += " AND kat.NAME = '" + this.type + "'";
        }
        if (this.group != null && !this.group.equals("-")) {
          query += " AND ok.TITLE = '" + this.group + "'";
        }
        if (this.order != null) {
          query += " ORDER BY " + columnDBName[this.order];
        }

        this.objects = gdo.unsafeQuery(query, searchObject);
      }
    } catch (Exception e) {
      JOptionPane.showMessageDialog(
          null, "Error: " + e.toString(), "Error!", JOptionPane.ERROR_MESSAGE);
    }
  }
  /**
   * Diese Methode kann aus dem Javaspace gefundene Objekte in die lokale Datenbank integrieren.
   *
   * @author Alpay Firato
   */
  public void downloadObject() {
    if (this.onlinesuche == true && this.objects.size() != 0) {
      for (int i = 0; i < this.objects.size(); i++) {
        Termin temp = (Termin) this.objects.get(i);
        temp.setGroupID(0);
        temp.setTerminContainerID(0);
        temp.setTerminKategorieId(0);

        addTermin(temp);
      }
      JOptionPane.showMessageDialog(
          null,
          "Das ausgewählte Objekt wurde heruntergeladen.",
          "Download abgeschlossen.",
          JOptionPane.INFORMATION_MESSAGE);
    } else {
      JOptionPane.showMessageDialog(
          null,
          "Sie müssen zuerst ein Objekt auswählen.",
          "Kein Objekt zum herunterladen ausgewählt.",
          JOptionPane.INFORMATION_MESSAGE);
    }
  }
  /**
   * Diese Methode löscht die markierten Objekte aus der lokalen Datenbank. Nach einem erfolgreichen
   * Löschvorgang wird fireDataChanged aufgerufen. Alle gelöschten Objekte wird als eine Liste
   * abgespeichert damit man später diese Daten wiederherstellen kann wenn erfordert.
   *
   * @param JTable Das ist die Tabelle bei der die Daten markiert worden sind.
   * @author Alpay Firato
   */
  public void deleteSelectedRow(JTable table) {
    Termin p = new Termin();
    boolean selected = false;
    boolean deleted = false;
    boolean first = true;
    int auswahl = 0;
    p = null;
    //	 Check each cell in the range
    if (this.onlinesuche == false) {
      for (int r = 0; r < this.getRowCount(); r++) {
        if (table.isCellSelected(r, 1)) {
          selected = true;
          p = (Termin) this.getObjects().get(r);
          if (p.getId() != null) {
            if (first) {
              auswahl =
                  JOptionPane.showConfirmDialog(
                      null,
                      "Sind sie sicher dass sie alle markierten Objekte löschen wollen?",
                      "Löschen?",
                      JOptionPane.YES_NO_CANCEL_OPTION,
                      JOptionPane.ERROR_MESSAGE);
            }
            if (auswahl == JOptionPane.YES_OPTION) {
              // weiter mit löschen
              deleted = this.deleteTermin(p);
              if (deleted) {
                if (first) {
                  JOptionPane.showMessageDialog(
                      null,
                      "Das Löschvorgang war erfolgreich.",
                      "Gelöscht!",
                      JOptionPane.INFORMATION_MESSAGE);
                }
              } else {
                JOptionPane.showMessageDialog(
                    null,
                    "Das Objekt konnte nicht gelöscht werden.",
                    "Löschen!",
                    JOptionPane.ERROR_MESSAGE);
              }
            }
          } else {
            JOptionPane.showMessageDialog(
                null,
                "Dieses Objekt kann nicht gelöscht werden.",
                "Null Object!",
                JOptionPane.ERROR_MESSAGE);
          }
          first = false;
        }
      }
    } else {
      JOptionPane.showMessageDialog(
          null,
          "Online Objekte können nicht gelöscht werden.",
          "Online Object!",
          JOptionPane.ERROR_MESSAGE);
    }

    if (selected == false) {
      JOptionPane.showMessageDialog(
          null,
          "Bitte selektieren Sie mindestens eine Reihe in der Tabelle",
          "Data wurde nicht ausgewählt!",
          JOptionPane.ERROR_MESSAGE);
    }
    if (deleted) {
      this.fireDataChanged();
    }
  }