private List<IColumn<PasswordAccountDto, String>> initColumns() {
    List<IColumn<PasswordAccountDto, String>> columns =
        new ArrayList<IColumn<PasswordAccountDto, String>>();

    IColumn column =
        new IconColumn<PasswordAccountDto>(new Model<String>()) {
          private static final long serialVersionUID = 1L;

          @Override
          protected IModel<String> createIconModel(final IModel<PasswordAccountDto> rowModel) {
            return new AbstractReadOnlyModel<String>() {
              private static final long serialVersionUID = 1L;

              @Override
              public String getObject() {
                PasswordAccountDto item = rowModel.getObject();
                if (item.getCssClass() == null || item.getCssClass().trim().equals("")) {
                  if (item.isMidpoint()) {
                    item.setCssClass(SELECTED_ACCOUNT_ICON_CSS);
                  } else if (item.isPasswordOutbound()) {
                    item.setCssClass(PROPAGATED_ACCOUNT_ICON_CSS);
                  } else {
                    item.setCssClass(DESELECTED_ACCOUNT_ICON_CSS);
                  }
                }
                return item.getCssClass();
              }
            };
          }

          @Override
          public void populateItem(
              Item<ICellPopulator<PasswordAccountDto>> item,
              String componentId,
              final IModel<PasswordAccountDto> rowModel) {
            super.populateItem(item, componentId, rowModel);
            final ImagePanel imagePanel = (ImagePanel) item.get(0);

            final PasswordAccountDto passwordAccountDto = rowModel.getObject();

            imagePanel.add(
                new AjaxEventBehavior("click") {
                  private static final long serialVersionUID = 1L;

                  protected void onEvent(final AjaxRequestTarget target) {
                    if (!passwordAccountDto.isMidpoint()) {
                      if (passwordAccountDto.getCssClass().equals(PROPAGATED_ACCOUNT_ICON_CSS)) {
                        passwordAccountDto.setCssClass(SELECTED_ACCOUNT_ICON_CSS);
                      } else if (passwordAccountDto.getCssClass().equals(SELECTED_ACCOUNT_ICON_CSS)
                          && passwordAccountDto.isPasswordOutbound()
                          && midpointAccountSelected) {
                        passwordAccountDto.setCssClass(PROPAGATED_ACCOUNT_ICON_CSS);
                      } else if (passwordAccountDto
                          .getCssClass()
                          .equals(SELECTED_ACCOUNT_ICON_CSS)) {
                        passwordAccountDto.setCssClass(DESELECTED_ACCOUNT_ICON_CSS);
                      } else if (passwordAccountDto
                          .getCssClass()
                          .equals(DESELECTED_ACCOUNT_ICON_CSS)) {
                        passwordAccountDto.setCssClass(SELECTED_ACCOUNT_ICON_CSS);
                      }
                      target.add(imagePanel);
                    } else {
                      midpointAccountSelected = !midpointAccountSelected;
                      if (passwordAccountDto.getCssClass().equals(SELECTED_ACCOUNT_ICON_CSS)) {
                        passwordAccountDto.setCssClass(DESELECTED_ACCOUNT_ICON_CSS);
                        updatePropagatedAccountIconsCssClass(DESELECTED_ACCOUNT_ICON_CSS);
                        target.add(imagePanel.findParent(SelectableDataTable.class));
                      } else if (passwordAccountDto
                          .getCssClass()
                          .equals(DESELECTED_ACCOUNT_ICON_CSS)) {
                        passwordAccountDto.setCssClass(SELECTED_ACCOUNT_ICON_CSS);
                        updatePropagatedAccountIconsCssClass(PROPAGATED_ACCOUNT_ICON_CSS);
                        target.add(imagePanel.findParent(SelectableDataTable.class));
                      }
                    }
                  }
                });
          }
        };
    columns.add(column);

    columns.add(
        new AbstractColumn<PasswordAccountDto, String>(
            createStringResource("ChangePasswordPanel.name")) {
          private static final long serialVersionUID = 1L;

          @Override
          public void populateItem(
              Item<ICellPopulator<PasswordAccountDto>> item,
              String componentId,
              final IModel<PasswordAccountDto> rowModel) {
            item.add(
                new Label(
                    componentId,
                    new AbstractReadOnlyModel<Object>() {
                      private static final long serialVersionUID = 1L;

                      @Override
                      public Object getObject() {
                        PasswordAccountDto dto = rowModel.getObject();
                        return dto.getDisplayName();
                      }
                    }));
          }
        });

    column =
        new PropertyColumn(
            createStringResource("ChangePasswordPanel.resourceName"),
            PasswordAccountDto.F_RESOURCE_NAME);
    columns.add(column);

    CheckBoxColumn enabled =
        new CheckBoxColumn(
            createStringResource("ChangePasswordPanel.enabled"), PasswordAccountDto.F_ENABLED);
    enabled.setEnabled(false);
    columns.add(enabled);

    return columns;
  }
  private List<IColumn<AppenderConfiguration, String>> initAppenderColumns() {
    List<IColumn<AppenderConfiguration, String>> columns = new ArrayList<>();

    IColumn column = new CheckBoxHeaderColumn<AppenderConfiguration>();
    columns.add(column);

    // name columns (editable)
    column =
        new EditableLinkColumn<AppenderConfiguration>(
            createStringResource("LoggingConfigPanel.appenders.name"), "name") {

          @Override
          public void onClick(AjaxRequestTarget target, IModel<AppenderConfiguration> rowModel) {
            appenderEditPerformed(target, rowModel);
          }

          @Override
          protected Component createInputPanel(
              String componentId, IModel<AppenderConfiguration> model) {
            TextPanel<String> panel =
                new TextPanel<String>(
                    componentId, new PropertyModel(model, getPropertyExpression()));
            panel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
            panel.getBaseFormComponent().add(new NotNullValidator<String>("message.emptyString"));
            addAjaxFormComponentUpdatingBehavior(panel.getBaseFormComponent());
            return panel;
          }
        };
    columns.add(column);

    // pattern column (editable)
    column =
        new EditablePropertyColumn(
            createStringResource("LoggingConfigPanel.appenders.pattern"), "pattern") {

          @Override
          protected InputPanel createInputPanel(String componentId, IModel model) {
            InputPanel panel = super.createInputPanel(componentId, model);
            panel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
            panel.getBaseFormComponent().add(new NotNullValidator<String>("message.emptyString"));
            addAjaxFormComponentUpdatingBehavior(panel.getBaseFormComponent());
            return panel;
          }
        };
    columns.add(column);

    // file path column (editable)
    column =
        new FileAppenderColumn(
            createStringResource("LoggingConfigPanel.appenders.filePath"), "filePath");
    columns.add(column);

    // file pattern column (editable)
    //                jj
    column =
        new FileAppenderColumn(
            createStringResource("LoggingConfigPanel.appenders.filePattern"), "filePattern");
    columns.add(column);

    // max history column (editable)
    column =
        new FileAppenderColumn(
            createStringResource("LoggingConfigPanel.appenders.maxHistory"), "maxHistory") {

          @Override
          protected InputPanel createInputPanel(String componentId, IModel model) {
            TextPanel panel =
                new TextPanel<>(
                    componentId, new PropertyModel<String>(model, getPropertyExpression()));
            FormComponent component = panel.getBaseFormComponent();
            component.add(new AttributeModifier("size", 5));
            component.add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
            addAjaxFormComponentUpdatingBehavior(component);
            return panel;
          }
        };
    columns.add(column);

    // max file size column (editable)
    column =
        new FileAppenderColumn(
            createStringResource("LoggingConfigPanel.appenders.maxFileSize"), "maxFileSize") {

          @Override
          protected InputPanel createInputPanel(String componentId, IModel model) {
            TextPanel<String> panel =
                new TextPanel<>(
                    componentId, new PropertyModel<String>(model, getPropertyExpression()));
            FormComponent component = panel.getBaseFormComponent();
            component.add(new AttributeModifier("size", 5));
            component.add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
            component.add(new NotNullValidator<String>("message.emptyString"));
            addAjaxFormComponentUpdatingBehavior(component);
            return panel;
          }
        };
    columns.add(column);

    CheckBoxColumn check =
        new EditableCheckboxColumn(
            createStringResource("LoggingConfigPanel.appenders.appending"), "appending") {

          @Override
          protected InputPanel createInputPanel(String componentId, IModel model) {
            InputPanel panel = super.createInputPanel(componentId, model);
            panel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
            panel.getBaseFormComponent().add(new NotNullValidator<String>("message.emptyString"));
            addAjaxFormComponentUpdatingBehavior(panel.getBaseFormComponent());
            return panel;
          }
        };
    check.setEnabled(false);
    columns.add(check);

    return columns;
  }