/**
   * @param sr
   * @return
   * @throws ApplicationException
   */
  @Override
  public List<List<String>> getStudienverlaufsplan(Studienrichtung sr) throws ApplicationException {

    List<List<String>> spalten = new ArrayList<List<String>>();

    ArrayList<String> zeile1 = new ArrayList();

    zeile1.add("Studienverlaufplan\n" + sr.toString());
    zeile1.add("1. Semester");
    zeile1.add("2. Semester");
    zeile1.add("3. Semester");
    zeile1.add("4. Semester");
    zeile1.add("5. Semester");
    zeile1.add("6. Semester");
    zeile1.add("");

    spalten.add(zeile1);

    ArrayList<String> zeile2 = new ArrayList();

    zeile2.add("Nr  Kategorie");
    zeile2.add("Mod  V  Ü  P  Cr");
    zeile2.add("Mod  V  Ü  P  Cr");
    zeile2.add("Mod  V  Ü  P  Cr");
    zeile2.add("Mod  V  Ü  P  Cr");
    zeile2.add("Mod  V  Ü  P  Cr");
    zeile2.add("Mod  V  Ü  P  Cr");
    zeile2.add("Summe");

    spalten.add(zeile2);

    ArrayList<Studienverlauf> studienverlauf = new ArrayList();

    String sql =
        "SELECT SR.SKUERZEL, K.LFDNR, K.NAME, "
            + "KU.SEM, KU.MKUERZEL, M.MODULNAME, M.VL, "
            + "M.UB, M.PR, M.CREDITS "
            + "FROM KATEGORIE K, KATEGORIEUMFANG KU, MODUL M, STUDIENRICHTUNG SR "
            + "WHERE SR.SKUERZEL = '"
            + sr.getKuerzel()
            + "' "
            + "AND SR.SKUERZEL = KU.SKUERZEL "
            + "AND SR.SKUERZEL = K.SKUERZEL "
            + "AND K.LFDNR = KU.LFDNR "
            + "AND M.MKUERZEL = KU.MKUERZEL "
            + "ORDER BY K.LFDNR, KU.SEM";

    ResultSet sqlResult = null;
    try {

      sqlResult = executeQuery(sql);

      Studienverlauf sv = new Studienverlauf(0, "");
      while (sqlResult.next()) {

        int vl = sqlResult.getInt("VL");
        int ub = sqlResult.getInt("UB");
        int pr = sqlResult.getInt("PR");
        project.Modul modul =
            new project.Modul(
                sqlResult.getString("MKUERZEL"),
                sqlResult.getString("MODULNAME"),
                vl,
                ub,
                pr,
                sqlResult.getInt("CREDITS"));
        if (sv.getKategorieNr() == sqlResult.getInt("LFDNR")) {

          sv.addSemesterModul(sqlResult.getInt("SEM"), modul);
        } else {

          sv = new Studienverlauf(sqlResult.getInt("LFDNR"), sqlResult.getString("NAME"));
          sv.addSemesterModul(sqlResult.getInt("SEM"), modul);
          studienverlauf.add(sv);
        }
      }
    } catch (SQLException ex) {

      System.out.println(ex.getMessage());
    }

    for (int i = 0; i < studienverlauf.size(); i++) {

      ArrayList<String> zeile = new ArrayList();
      Studienverlauf aktVerlauf = studienverlauf.get(i);
      zeile.add(aktVerlauf.getKategorieNr() + "  " + aktVerlauf.getKategorie());
      zeile.add(aktVerlauf.getSemesterModulText(1));
      zeile.add(aktVerlauf.getSemesterModulText(2));
      zeile.add(aktVerlauf.getSemesterModulText(3));
      zeile.add(aktVerlauf.getSemesterModulText(4));
      zeile.add(aktVerlauf.getSemesterModulText(5));
      zeile.add(aktVerlauf.getSemesterModulText(6));
      zeile.add("" + aktVerlauf.getVerlaufWochenStunden());
      spalten.add(zeile);
    }

    ArrayList<String> letzteZeile = new ArrayList();
    letzteZeile.add("Summe SWS");

    int gesamtsumme = 0;

    for (int i = 1; i < 7; i++) {

      int zwischensumme = 0;
      for (int j = 0; j < studienverlauf.size(); j++) {
        zwischensumme += studienverlauf.get(j).getWochenStundenVonSemester(i);
      }

      letzteZeile.add("" + zwischensumme);
      gesamtsumme += zwischensumme;
    }

    letzteZeile.add("" + gesamtsumme);

    spalten.add(letzteZeile);

    return spalten;
  }
  @Override
  public JPanel getChart(int type, Object parameter1, Object parameter2)
      throws ApplicationException {
    // TODO Methode ausfertigen

    JFreeChart chart = null;

    switch (type) {
      case VISUALISIERUNG_ANTEIL_TESTATABNAHMEN:
        {

          /* Parameter 1 muss String sein, Parameter 2 muss NULL sein.*/
          if (!(parameter1 instanceof String && parameter2 == null)) {
            throw new ApplicationException(
                "Die übergebenen Basisparameter passen nicht zum Visualisierungstyp.");
          }

          String semester = (String) parameter1;
          DefaultCategoryDataset dataset = new DefaultCategoryDataset();

          /* Iteration über alle Studienrichtungen. */
          for (Studienrichtung studr : this.getAllStudienrichtung()) {

            /* Anzahl der Studenten die sich für ein Praktikum eines
            Moduls in einem bestimmten Semester angemeldet haben. */
            String sql =
                "SELECT M.MKUERZEL AS Modul, Count(*) AS Anmeldungen"
                    + " FROM MODUL M, PRAKTIKUMSTEILNAHME P, STUDENT S"
                    + " WHERE P.MATRIKEL = S.MATRIKEL"
                    + " AND M.MKUERZEL = P.MKUERZEL"
                    + " AND M.PR > 0"
                    + " AND P.SEMESTER = '"
                    + semester
                    + "'"
                    + " AND S.SKUERZEL = '"
                    + studr.getKuerzel()
                    + "'"
                    + " GROUP BY M.MKUERZEL";

            ResultSet resultSet = null;
            try {

              resultSet = executeQuery(sql);
              while (resultSet.next()) {
                /* Speichern der Anzahl der ANmeldungen zu einem
                 * Modul */
                String modul = resultSet.getString("Modul");
                int anmeldungen = resultSet.getInt("Anmeldungen");

                /* Anzahl der Bestandenen Praktikas eines Moduls
                in einem bestimmten Semester*/
                sql =
                    "SELECT M.MKUERZEL AS Modul, Count(*) AS Bestanden"
                        + " FROM MODUL M, PRAKTIKUMSTEILNAHME P, STUDENT S"
                        + " WHERE P.MATRIKEL = S.MATRIKEL"
                        + " AND M.MKUERZEL = P.MKUERZEL"
                        + " AND M.MKUERZEL = '"
                        + modul
                        + "'"
                        + " AND M.PR > 0"
                        + " AND P.SEMESTER = '"
                        + semester
                        + "'"
                        + " AND S.SKUERZEL = '"
                        + studr.getKuerzel()
                        + "'"
                        + " AND P.TESTAT > 0"
                        + " GROUP BY M.MKUERZEL";

                int bestanden = 0;
                ResultSet resultSet1 = executeQuery(sql);
                if (resultSet1.next()) {
                  bestanden = resultSet1.getInt("Bestanden");
                }

                /* Berechnung des Prozentualen Anteils von
                bestanden zu teilgenommen */
                double wert =
                    (bestanden == 0) ? 0 : (double) bestanden / (double) anmeldungen * 100;

                /* Dataset die Werte übergeben
                % - Wert, Modulname, Studienrichtung */
                dataset.addValue(wert, modul, studr.getKuerzel());
              }

            } catch (SQLException ex) {
              System.out.println(ex.getMessage());
            }
          }
          /* Neues Balken Diagramm erzeugen mit folgenden Werte:
           * Titel, X-Achse Beschreibung, Y-Achse Beschreibung, Daten,
           * Vertical/Horizontal, Legende, Tooltip, URL.
           */
          chart =
              ChartFactory.createBarChart(
                  semester,
                  "Praktikumsmodule nach Studienrichtung",
                  "Erfolgreiche Teilnahme in %",
                  dataset,
                  PlotOrientation.VERTICAL,
                  true,
                  true,
                  false);
        }
        break;

      case VISUALISIERUNG_AUFTEILUNG_ANMELDUNGEN:
        {
          if (!(parameter1 instanceof Studienrichtung && parameter2 instanceof String)) {
            throw new ApplicationException(
                "Die übergebenen Basisparameter passen nicht zum Visualisierungstyp.");
          }

          Studienrichtung studienrichtung = (Studienrichtung) parameter1;
          String semester = (String) parameter2;

          DefaultPieDataset dataset = new DefaultPieDataset();

          String sql =
              "SELECT M.MKUERZEL AS Modul, Count(*) AS Anmeldungen"
                  + " FROM MODUL M, PRAKTIKUMSTEILNAHME P, STUDENT S"
                  + " WHERE P.MATRIKEL = S.MATRIKEL"
                  + " AND M.MKUERZEL = P.MKUERZEL"
                  + " AND M.PR > 0"
                  + " AND P.SEMESTER = '"
                  + semester
                  + "'"
                  + " AND S.SKUERZEL = '"
                  + studienrichtung.getKuerzel()
                  + "'"
                  + " GROUP BY M.MKUERZEL";
          try {
            ResultSet resultSet = executeQuery(sql);

            int i = 0;

            while (resultSet.next()) {

              int tmpAnmelungen = resultSet.getInt("Anmeldungen");
              String tmpModul = resultSet.getString("Modul");

              /* SchlüsselText zusammenbauen */
              String key = tmpModul + ": " + tmpAnmelungen + " Anmeldungen";

              dataset.insertValue(i, key, tmpAnmelungen);
              i++;
            }
          } catch (SQLException ex) {
            System.out.println(ex.getMessage());
          }

          /* PieChart erstellen: Titel, Daten, Legende, ToolTip, URL */
          chart =
              ChartFactory.createPieChart(
                  studienrichtung.toString() + " (" + semester + ")", dataset, true, true, false);
        }
        break;

      case VISUALISIERUNG_ENTWICKLUNG_ANMELDUNGEN:
        {
          if (!(parameter1 instanceof Modul && parameter2 == null)) {
            throw new ApplicationException(
                "Die übergebenen Basisparameter passen nicht zum Visualisierungstyp.");
          }

          Modul modul = (Modul) parameter1;

          DefaultCategoryDataset dataset = new DefaultCategoryDataset();

          /* Anmeldungen/Testate zu einem Modul in allen Semestern*/
          String sql =
              "SELECT count(*) AS Anmeldungen, P.SEMESTER, SUM(P.TESTAT) AS Testatvergaben"
                  + " FROM PRAKTIKUMSTEILNAHME P"
                  + " WHERE P.MKUERZEL = '"
                  + modul.getKuerzel()
                  + "'"
                  + " GROUP BY P.SEMESTER";
          try {
            ResultSet resultSet = executeQuery(sql);

            while (resultSet.next()) {
              String semester = resultSet.getString("Semester");
              int anmeldungen = resultSet.getInt("Anmeldungen");
              int testate = resultSet.getInt("Testatvergaben");
              dataset.addValue(anmeldungen, "Anmeldungen", semester);
              dataset.addValue(testate, "Testatvergaben", semester);
            }
          } catch (SQLException ex) {
            System.out.println(ex.getMessage());
          }

          chart =
              ChartFactory.createLineChart(
                  modul.getName() + " (" + modul.getKuerzel() + ")",
                  "Semester",
                  "Studierende",
                  dataset,
                  PlotOrientation.VERTICAL,
                  true,
                  true,
                  false);
        }
        break;

      case VISUALISIERUNG_ANMELDUNGEN_TESTATE:
        {
          if (!(parameter1 instanceof Studienrichtung && parameter2 instanceof String)) {
            throw new ApplicationException(
                "Die übergebenen Basisparameter passen nicht zum Visualisierungstyp.");
          }

          Studienrichtung studienrichtung = (Studienrichtung) parameter1;
          String semester = (String) parameter2;

          DefaultCategoryDataset dataset = new DefaultCategoryDataset();

          String sql =
              "SELECT count(*) AS Anmeldungen, SUM(P.TESTAT) AS Testatvergaben, P.MKUERZEL AS Modul"
                  + " FROM PRAKTIKUMSTEILNAHME P, KATEGORIEUMFANG K"
                  + " WHERE P.SEMESTER = '"
                  + semester
                  + "'"
                  + " AND P.MKUERZEL = K.MKUERZEL"
                  + " AND K.SKUERZEL = '"
                  + studienrichtung.getKuerzel()
                  + "'"
                  + " GROUP BY P.MKUERZEL";
          try {
            ResultSet resultSet = executeQuery(sql);

            while (resultSet.next()) {
              String modulName = resultSet.getString("Modul");
              int anmeldungen = resultSet.getInt("Anmeldungen");
              int testatvergaben = resultSet.getInt("Testatvergaben");

              dataset.addValue(anmeldungen, "Anmeldungen", modulName);
              dataset.addValue(testatvergaben, "Testatvergaben", modulName);
            }

          } catch (SQLException ex) {
            System.out.println(ex.getMessage());
          }

          chart =
              ChartFactory.createBarChart(
                  studienrichtung.getName() + " (" + studienrichtung.getKuerzel() + ")",
                  "Modul",
                  "Studierende",
                  dataset,
                  PlotOrientation.VERTICAL,
                  true,
                  true,
                  false);
        }
        break;

      default:
        {
          throw new ApplicationException("Der Visualisierungstyp ist nicht definiert.");
        }
    }

    return new ChartPanel(chart);
  }