public Map<String, Object> update(
      final JsonCommand command, final PlatformPasswordEncoder platformPasswordEncoder) {

    final Map<String, Object> actualChanges = new LinkedHashMap<String, Object>(7);

    // unencoded password provided
    final String passwordParamName = "password";
    final String passwordEncodedParamName = "passwordEncoded";
    if (command.hasParameter(passwordParamName)) {
      if (command.isChangeInPasswordParameterNamed(
          passwordParamName, this.password, platformPasswordEncoder, this.getId())) {
        final String passwordEncodedValue =
            command.passwordValueOfParameterNamed(
                passwordParamName, platformPasswordEncoder, this.getId());
        actualChanges.put(passwordEncodedParamName, passwordEncodedValue);
        updatePassword(passwordEncodedValue);
      }
    }

    if (command.hasParameter(passwordEncodedParamName)) {
      if (command.isChangeInStringParameterNamed(passwordEncodedParamName, this.password)) {
        final String newValue = command.stringValueOfParameterNamed(passwordEncodedParamName);
        actualChanges.put(passwordEncodedParamName, newValue);
        updatePassword(newValue);
      }
    }

    final String officeIdParamName = "officeId";
    if (command.isChangeInLongParameterNamed(officeIdParamName, this.office.getId())) {
      final Long newValue = command.longValueOfParameterNamed(officeIdParamName);
      actualChanges.put(officeIdParamName, newValue);
    }

    final String rolesParamName = "roles";
    if (command.isChangeInArrayParameterNamed(rolesParamName, getRolesAsIdStringArray())) {
      final String[] newValue = command.arrayValueOfParameterNamed(rolesParamName);
      actualChanges.put(rolesParamName, newValue);
    }

    final String usernameParamName = "username";
    if (command.isChangeInStringParameterNamed(usernameParamName, this.username)) {
      final String newValue = command.stringValueOfParameterNamed(usernameParamName);
      actualChanges.put(usernameParamName, newValue);
      this.username = newValue;
    }

    final String firstnameParamName = "firstname";
    if (command.isChangeInStringParameterNamed(firstnameParamName, this.firstname)) {
      final String newValue = command.stringValueOfParameterNamed(firstnameParamName);
      actualChanges.put(firstnameParamName, newValue);
      this.firstname = newValue;
    }

    final String lastnameParamName = "lastname";
    if (command.isChangeInStringParameterNamed(lastnameParamName, this.lastname)) {
      final String newValue = command.stringValueOfParameterNamed(lastnameParamName);
      actualChanges.put(lastnameParamName, newValue);
      this.lastname = newValue;
    }

    final String emailParamName = "email";
    if (command.isChangeInStringParameterNamed(emailParamName, this.email)) {
      final String newValue = command.stringValueOfParameterNamed(emailParamName);
      actualChanges.put(emailParamName, newValue);
      this.email = newValue;
    }

    return actualChanges;
  }