/*
  todo(pm): move function away from this controller
  */
  private RemoteTenant initializeView(HttpServletRequest request, ModelAndView mav) {
    RemoteTenant remoteTenant = null;

    String operatorId = ServletUtils.getSafeParameter(request, "operatorId", "");
    String tenantId = ServletUtils.getSafeParameter(request, "tenantId", "");

    String signedInOperatorId = Security.signedInOperatorId(request);
    Operator signedInOperator = Security.signedInOperator(request);

    if (signedInOperator != null) {
      if (Security.isDeveloper(request) && !Strings.isNullOrEmpty(operatorId))
        remoteTenant = remoteTenantDAO.get(operatorId, tenantId);
      else remoteTenant = remoteTenantDAO.get(signedInOperator.getOperatorId(), tenantId);

      if (remoteTenant != null) mav.addObject("remoteTenant", remoteTenant);
    }

    if (Security.isDeveloper(request) && !Strings.isNullOrEmpty(operatorId))
      mav.addObject("operatorId", operatorId);
    else mav.addObject("operatorId", signedInOperatorId);

    mav.addObject("tenantId", tenantId);
    mav.addObject("tenants", remoteTenantDAO.getTenantsFromOperator(operatorId));

    String apiKey = Operator.DEFAULT_API_KEY;

    if (signedInOperator != null) {
      apiKey = signedInOperator.getApiKey();
    }

    if (remoteTenant != null) {
      Set<String> itemTypes = itemTypeDAO.getTypes(remoteTenant.getId(), true);
      mav.addObject("availableItemTypes", itemTypes);

      Set<String> assocTypes = assocTypeDAO.getTypes(remoteTenant.getId(), true);
      assocTypes.add("");
      mav.addObject("availableAssocTypes", assocTypes);
    }

    mav.addObject("apiKey", apiKey);
    mav.addObject("signedIn", Security.isSignedIn(request));

    return remoteTenant;
  }
  @Override
  protected ModelAndView onSubmit(
      HttpServletRequest request,
      HttpServletResponse response,
      Object command,
      BindException errors)
      throws Exception {

    ModelAndView mav = new ModelAndView("page");

    RemoteTenant remoteTenant = viewInitializationService.initializeView(request, mav);

    FileUploadBean bean = (FileUploadBean) command; // cast the bean
    if (bean == null || bean.getFile() == null || bean.getFile().isEmpty()) {
      logger.info("no file or empty file was uploaded, aborting");
      // well, let's do nothing with the bean for now and return
      return super.onSubmit(request, response, command, errors);
    }

    // check if there's content there
    MultipartFile file = bean.getFile();

    CsvInput csvInput = new CsvInput(";", null);
    csvInput.setSource(file.getInputStream(), "UTF-8");

    List<String> validationErrors = new ArrayList<String>();
    List<String> touchedClusters = new ArrayList<String>();

    int lineNumber = 0;
    int numberOfItems = 0;
    int numberOfTouchedClusters = 0;
    int tenantId = 0;

    while (csvInput.hasNext()) {
      lineNumber++;

      List<String> fields = null;
      try {
        fields = csvInput.next(); // read one line
      } catch (InconsistentFieldCountException e) {
        validationErrors.add(
            "ERROR in line number "
                + lineNumber
                + ": column numbers don't equal headerline columns!");
        continue;
      }

      if (lineNumber == 1) {
        continue;
      } // header line
      boolean lineError = false;

      if (fields.size() < 3) {
        validationErrors.add(
            "ERROR in line number " + lineNumber + ": column numbers smaller then 3!");
        continue;
      }

      // init the CSV Columns to Java Variables
      String clusterName = fields.get(0);
      String itemId = fields.get(1);
      String itemType = fields.get(2);

      // the following code is used to validate the CSV line ...
      if (clusterName.equals("")) {
        validationErrors.add("ERROR in line number " + lineNumber + ": clusterName is missing.");
        lineError = true;
      }
      if (itemId.equals("")) {
        validationErrors.add("ERROR in line number " + lineNumber + ": itemId is missing.");
        lineError = true;
      }
      if (itemType.equals("")) {
        validationErrors.add("ERROR in line number " + lineNumber + ": itemType is missing.");
        lineError = true;
      }

      ClusterVO cluster = clusterService.loadCluster(remoteTenant.getId(), clusterName);

      if (cluster == null) {
        validationErrors.add(
            "ERROR in line number "
                + lineNumber
                + ": cluster with name'"
                + clusterName
                + "' does not exist. Please create before importing!");
        lineError = true;
      }

      Integer itemTypeId = itemTypeDAO.getIdOfType(remoteTenant.getId(), itemType);
      Item item = itemDAO.get(remoteTenant, itemId, itemType);

      if (null == item) {
        validationErrors.add(
            "ERROR in line number "
                + lineNumber
                + ": item with id '"
                + itemId
                + "' and type '"
                + itemType
                + "' does not exist.");
        lineError = true;
      }

      if (lineError) {
        continue;
      }

      Integer itemIdInt = idMappingDAO.lookup(item.getItemId());

      try {
        clusterService.addItemToCluster(remoteTenant.getId(), clusterName, itemIdInt, itemTypeId);
      } catch (ClusterException ex) {
        validationErrors.add("ERROR in line number " + lineNumber + ": " + ex.getMessage());
        continue;
      }

      numberOfItems++;

      if (!touchedClusters.contains(clusterName)) {
        numberOfTouchedClusters++;
        touchedClusters.add(clusterName);
      }
    }

    mav.addObject("tenant", remoteTenant);
    mav.addObject("page", "clustermanager/import/importResult");
    mav.addObject("numberOfItems", numberOfItems);
    mav.addObject("numberOfTouchedClusters", numberOfTouchedClusters);
    mav.addObject("validationErrors", validationErrors);
    return mav;
  }