public void onSelectedArtistChange(int viewId, int time) {
    // check login
    if (!userBean.getLoggedIn()) {
      return;
    }

    // execute action
    Performance p = performances.get(viewId).get(time);

    UltimateFestivalOrganizerSoap ufo = UFOService.getInstance();

    if (p.getId() == 0 && p.getArtist().getId() == 0) {
      return;
    }

    // send to server
    boolean success = true;
    if (p.getId() == 0 && p.getArtist().getId() != 0) {
      success = ufo.addPerformance(p);
    } else if (p.getId() != 0 && p.getArtist().getId() == 0) {
      ufo.deletePerformance(p);
      success = true;
    } else if (p.getId() != 0 && p.getArtist().getId() != 0) {
      success = ufo.updatePerformance(p);
    }

    // message
    FacesContext facesContext = FacesContext.getCurrentInstance();
    FacesMessage facesMessage;
    if (success) {
      facesMessage =
          new FacesMessage(FacesMessage.SEVERITY_INFO, "Saved", "Data was saved on the server.");
    } else {
      facesMessage =
          new FacesMessage(
              FacesMessage.SEVERITY_ERROR,
              "Error",
              "The selected artist was invalid. The item will be reset.");
      reload();
    }
    facesContext.addMessage(null, facesMessage);
  }
  private void reload() {
    UltimateFestivalOrganizerSoap ufo = UFOService.getInstance();

    venues = ufo.getAllVenues().getVenue();
    artists = ufo.getAllButDeletedArtists().getArtist();

    // Performances
    performances.clear();

    if (performancesSessionBean.getSelectedDate() == null) {
      return;
    }

    // fill with new
    for (Venue v : venues) {
      performances.put(v.getId(), new HashMap<>());

      for (int hour = 14; hour <= 23; ++hour) {
        Performance p = new Performance();
        p.setVenue(v);

        Calendar c = new GregorianCalendar();
        c.setTime(performancesSessionBean.getSelectedDate());
        c.add(Calendar.HOUR_OF_DAY, hour);
        p.setDateTime(dateToGregorian(c.getTime()));

        Artist a = new Artist();
        a.setId(0);
        p.setArtist(a);

        performances.get(v.getId()).put(hour, p);
      }
    }

    // fill with existing
    List<Performance> allPerformances =
        ufo.getPerformancesByDate(dateToGregorian(performancesSessionBean.getSelectedDate()))
            .getPerformance();
    for (Performance p : allPerformances) {
      int venueId = p.getVenue().getId();
      int hour = p.getDateTime().getHour();

      performances.get(venueId).put(hour, p);
    }
  }