/**
   * Gets hotspotChoice child with given identifier or null.
   *
   * @param identifier given identifier
   * @return hotspotChoice with given identifier or null
   */
  public HotspotChoice getHotspotChoice(final Identifier identifier) {
    for (final HotspotChoice choice : getHotspotChoices()) {
      if (choice.getIdentifier() != null && choice.getIdentifier().equals(identifier)) {
        return choice;
      }
    }

    return null;
  }
  @Override
  public boolean validateResponse(
      final ItemSessionController itemSessionController, final Value responseValue) {
    /* Extract response values */
    final Set<Identifier> responseChoiceIdentifiers = new HashSet<Identifier>();
    if (responseValue.isNull()) {
      /* (Empty response) */
    } else if (responseValue.getCardinality().isList()) {
      /* (Container response) */
      for (final SingleValue hotspotChoiceIdentifier : (ListValue) responseValue) {
        responseChoiceIdentifiers.add(
            ((IdentifierValue) hotspotChoiceIdentifier).identifierValue());
      }
    } else {
      /* (Single response - this won't actually happen) */
      responseChoiceIdentifiers.add(((IdentifierValue) responseValue).identifierValue());
    }

    /* Chheck min/max (if set) */
    final Integer maxChoices = getMaxChoices();
    final Integer minChoices = getMinChoices();
    if (maxChoices != null && minChoices != null) {
      if (responseChoiceIdentifiers.size() < minChoices.intValue()
          || responseChoiceIdentifiers.size() > maxChoices.intValue()) {
        return false;
      }
    }

    /* Check that each identifier is valid */
    final Set<Identifier> choiceIdentifiers = new HashSet<Identifier>();
    for (final HotspotChoice choice : getHotspotChoices()) {
      choiceIdentifiers.add(choice.getIdentifier());
    }
    for (final Identifier choiceIdentifier : responseChoiceIdentifiers) {
      if (!choiceIdentifiers.contains(choiceIdentifier)) {
        return false;
      }
    }

    return true;
  }