@Override
  protected void onInitialize() {
    super.onInitialize();
    InjectorHolder.getInjector().inject(this);
    modelName.setObject(_user.getName());
    addFeedback(this, "feedback");

    Form<String> form =
        new Form<String>("form") {
          @Override
          protected void onSubmit() {
            onSubmitForm();
          }
        };

    Button cancel =
        new Button("cancel") {
          public void onSubmit() {
            setResponsePage(UserOverviewPage.class);
          }
        };
    cancel.setDefaultFormProcessing(false);
    form.add(cancel);

    addTextInputField(form, "username", modelName, true);
    form.add(new PasswordTextField("password1", modelPassword1));
    form.add(new PasswordTextField("password2", modelPassword2));

    form.add(new Button("submit"));

    List<UserRoles> current = new ArrayList<UserRoles>();
    current.add(UserRoles.NONE);
    modelRoles = new MyModel(current);

    List<? extends UserRoles> choices = UserRoles.asList();
    ListMultipleChoice<UserRoles> roleSelect =
        new ListMultipleChoice<UserRoles>("roleSelect", modelRoles, choices);
    form.add(roleSelect);

    List<String> providers = facade.availableProviders();
    selectedProvider = providers.get(0);
    ListChoice<String> providerSelect =
        new ListChoice<String>(
            "providerSelect", new PropertyModel<String>(this, "selectedProvider"), providers);
    form.add(providerSelect);
    add(form);
  }
Beispiel #2
0
  public void initialiseDetailForm() {
    customFieldGroupTxtFld = new TextField<String>("customFieldGroup.name");
    description = new TextArea<String>("customFieldGroup.description");
    publishedStatusCb = new CheckBox("customFieldGroup.published");
    publishedStatusCb.add(
        new AjaxFormComponentUpdatingBehavior("onChange") {

          private static final long serialVersionUID = 1L;

          @Override
          protected void onUpdate(AjaxRequestTarget target) {
            // Check what was selected and then toggle
            if (publishedStatusCb.getModelObject().booleanValue()) {
              error("Custom Fields may not be added or removed once the Data Set is published.");
              target.add(feedBackPanel);
            } else {
              target.add(feedBackPanel);
            }
          }
        });

    fileUploadField = new FileUploadField("customFieldFileUploadField");
    fileUploadButton =
        new Button("uploadCustomFieldField") {

          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            setSelectedCustomFieldsFromFile();
          }
        };
    fileUploadButton.setDefaultFormProcessing(false);

    if (addCustomFieldDisplayList) {
      initCustomFieldDataListPanel();
    } else {
      arkCrudContainerVO
          .getWmcForCustomFieldDisplayListPanel()
          .addOrReplace(new EmptyPanel("cfdListPanel"));
    }

    initCustomFieldPalette();
    addDetailFormComponents();
    attachValidators();
  }
  private Button novoBotaoConsultar() {
    Button btnConsultar =
        new Button("btnConsultar") {
          @Override
          public void onSubmit() {
            if (edtDataDeReferencia.getValue().isEmpty()) {
              error("A data de referência deve ser informada.");
            } else {
              try {
                transacoes =
                    AutorizadorAdapter.get()
                        .consultaTransacoes(UtilHelper.getData(edtDataDeReferencia.getValue()));
              } catch (Exception e) {
                error(e.getMessage());
              }
            }
          }
        };

    btnConsultar.setDefaultFormProcessing(false);

    return btnConsultar;
  }
 @Override
 protected void onInitialize() {
   super.onInitialize();
   add(new FeedbackPanel("feedback").setOutputMarkupId(true));
   _form =
       new Form<String>("form") {
         @Override
         protected void onSubmit() {
           onSubmitForm();
         }
       };
   Button cancel =
       new Button("cancel") {
         public void onSubmit() {
           onCancel();
         }
       };
   cancel.setDefaultFormProcessing(false);
   _form.add(cancel);
   _form.add(new Button("submit"));
   initForm(_form);
   add(_form);
 }
Beispiel #5
0
  @Override
  public void onInitialize() {
    super.onInitialize();

    // get settings data
    final GradebookInformation settings = this.businessService.getGradebookSettings();

    // setup page model
    final GbSettings gbSettings = new GbSettings(settings);
    final CompoundPropertyModel<GbSettings> formModel =
        new CompoundPropertyModel<GbSettings>(gbSettings);

    final SettingsGradeEntryPanel gradeEntryPanel =
        new SettingsGradeEntryPanel("gradeEntryPanel", formModel, gradeEntryExpanded);
    final SettingsGradeReleasePanel gradeReleasePanel =
        new SettingsGradeReleasePanel("gradeReleasePanel", formModel, gradeReleaseExpanded);
    final SettingsCategoryPanel categoryPanel =
        new SettingsCategoryPanel("categoryPanel", formModel, categoryExpanded);
    final SettingsGradingSchemaPanel gradingSchemaPanel =
        new SettingsGradingSchemaPanel("gradingSchemaPanel", formModel, gradingSchemaExpanded);

    // form
    final Form<GbSettings> form =
        new Form<GbSettings>("form", formModel) {
          private static final long serialVersionUID = 1L;

          @Override
          public void onValidate() {
            super.onValidate();

            final GbSettings model = getModelObject();

            final List<CategoryDefinition> categories =
                model.getGradebookInformation().getCategories();

            // validate the categories
            if (model.getGradebookInformation().getCategoryType()
                == GbCategoryType.WEIGHTED_CATEGORY.getValue()) {

              BigDecimal totalWeight = BigDecimal.ZERO;
              for (final CategoryDefinition cat : categories) {

                if (cat.getWeight() == null) {
                  error(getString("settingspage.update.failure.categorymissingweight"));
                } else {
                  // extra credit items do not participate in the weightings, so exclude from the
                  // tally
                  if (!cat.isExtraCredit()) {
                    totalWeight = totalWeight.add(BigDecimal.valueOf(cat.getWeight()));
                  }
                }
              }

              if (totalWeight.compareTo(BigDecimal.ONE) != 0) {
                error(getString("settingspage.update.failure.categoryweighttotals"));
              }
            }

            // if categories and weighting selected AND if course grade display points was selected,
            // give error message
            if (model.getGradebookInformation().getCategoryType()
                    == GbCategoryType.WEIGHTED_CATEGORY.getValue()
                && model.getGradebookInformation().isCourseGradeDisplayed()
                && model.getGradebookInformation().isCoursePointsDisplayed()) {
              error(getString("settingspage.displaycoursegrade.incompatible"));
            }

            // validate the course grade display settings
            if (model.getGradebookInformation().isCourseGradeDisplayed()) {
              int displayOptions = 0;

              if (model.getGradebookInformation().isCourseLetterGradeDisplayed()) {
                displayOptions++;
              }

              if (model.getGradebookInformation().isCourseAverageDisplayed()) {
                displayOptions++;
              }

              if (model.getGradebookInformation().isCoursePointsDisplayed()) {
                displayOptions++;
              }

              if (displayOptions == 0) {
                error(getString("settingspage.displaycoursegrade.notenough"));
              }
            }
          }

          @Override
          public void onSubmit() {

            final GbSettings model = getModelObject();

            Page responsePage =
                new SettingsPage(
                    gradeEntryPanel.isExpanded(),
                    gradeReleasePanel.isExpanded(),
                    categoryPanel.isExpanded(),
                    gradingSchemaPanel.isExpanded());

            // update settings
            try {
              SettingsPage.this.businessService.updateGradebookSettings(
                  model.getGradebookInformation());
              getSession().info(getString("settingspage.update.success"));
            } catch (ConflictingCategoryNameException e) {
              getSession().error(getString("settingspage.update.failure.categorynameconflict"));
              responsePage = this.getPage();
            } catch (IllegalArgumentException e) {
              getSession().error(e.getMessage());
              responsePage = this.getPage();
            }

            setResponsePage(responsePage);
          }
        };

    // cancel button
    final Button cancel =
        new Button("cancel") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            setResponsePage(new GradebookPage());
          }
        };
    cancel.setDefaultFormProcessing(false);
    form.add(cancel);

    // panels
    form.add(gradeEntryPanel);
    form.add(gradeReleasePanel);
    form.add(categoryPanel);
    form.add(gradingSchemaPanel);

    add(form);

    // expand/collapse panel actions
    add(
        new AjaxLink<String>("expandAll") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onClick(final AjaxRequestTarget target) {
            target.appendJavaScript("$('#settingsAccordion .panel-collapse').collapse('show');");
          }
        });
    add(
        new AjaxLink<String>("collapseAll") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onClick(final AjaxRequestTarget target) {
            target.appendJavaScript("$('#settingsAccordion .panel-collapse').collapse('hide');");
          }
        });
  }
Beispiel #6
0
    public TemplateForm(String id, final String section, boolean custom, UserData u) {
      super(id);
      this.user = u;
      this.section = section;
      final com.rectang.xsm.site.Site site = user.getSite();

      Button create =
          new Button("create") {
            public void onSubmit() {
              InputStream in = null;
              OutputStream out = null;
              try {
                in = getDefault(section, user.getSite());
                out = new FileOutputStream(getCustomFile(section));
                IOUtil.copyStream(in, out);

                if (section.equals("layout")) {
                  site.setLayout("custom");
                  site.save();
                } else if (section.equals("style")) {
                  site.setStylesheet("custom");
                  site.save();
                }

                // Here we need to redirect back to this page to refresh the models - not sure
                // why...
                setResponsePage(EditTemplate.class, getPageParameters());
              } catch (IOException e) {
                error("Unable to create custom copy of template " + section);
              } finally {
                if (in != null) {
                  IOUtil.close(in);
                }
                if (out != null) {
                  IOUtil.close(out);
                }
              }
            }
          };
      create.setDefaultFormProcessing(false);
      add(create);

      Button save = new Button("save");
      add(save);

      Button revert = new Button("revert");
      add(revert);

      Button delete =
          new Button("delete") {
            public void onSubmit() {
              if (getCustomFile(section).delete()) {
                if (section.equals("layout")) {
                  site.setLayout("menu-left");
                  site.save();
                } else if (section.equals("style")) {
                  site.setStylesheet("grey");
                  site.getPublishedDoc("style.css").delete();
                  site.save();
                }

                if (section.equals("template")) {
                  site.publish(user);
                } else {
                  site.publishTheme();
                }
                // Here we need to redirect back to this page to refresh the models - not sure
                // why...
                setResponsePage(EditTemplate.class, getPageParameters());
              } else {
                error("Unable to delete custom template " + section);
              }
            }
          };
      delete.setDefaultFormProcessing(false);
      add(delete);

      if (custom) {
        add(new TextArea("customise", new StringFileModel(getCustomFile(section))));

        create.setVisible(false);
      } else {
        StringBuffer content = new StringBuffer();
        BufferedReader reader = null;
        try {
          reader = new BufferedReader(new InputStreamReader(getDefault(section, site)));

          String line = reader.readLine();
          while (line != null) {
            content.append(line);
            content.append('\n');

            line = reader.readLine();
          }
        } catch (IOException e) {
          e.printStackTrace();
        } finally {
          if (reader != null) {
            IOUtil.close(reader);
          }
        }

        TextArea area = new TextArea("customise", new Model(content.toString()));

        area.setEnabled(false);
        add(area);

        save.setVisible(false);
        revert.setVisible(false);
        delete.setVisible(false);
      }

      BookmarkablePageLink back;
      back = new BookmarkablePageLink("back", Theme.class);
      back.add(new Label("back-label", "Back to Theme page"));
      add(back);
    }
Beispiel #7
0
  protected void setupPage(final TeamModel teamModel) {
    if (isCreate) {
      super.setupPage(getString("gb.newTeam"), "");
    } else {
      super.setupPage(getString("gb.edit"), teamModel.name);
    }

    CompoundPropertyModel<TeamModel> model = new CompoundPropertyModel<TeamModel>(teamModel);

    List<String> repos = getAccessRestrictedRepositoryList(true, null);

    List<String> teamUsers = new ArrayList<String>(teamModel.users);
    List<String> preReceiveScripts = new ArrayList<String>();
    List<String> postReceiveScripts = new ArrayList<String>();

    final String oldName = teamModel.name;
    final List<RegistrantAccessPermission> permissions = teamModel.getRepositoryPermissions();

    // users palette
    final Palette<UserChoice> users =
        new Palette<UserChoice>(
            "users",
            new ListModel<UserChoice>(getTeamUsers(teamUsers)),
            new CollectionModel<UserChoice>(
                sortByDisplayName(getTeamUsers(app().users().getAllUsernames()))),
            new ChoiceRenderer<UserChoice>(null, "userId"),
            10,
            false);

    // pre-receive palette
    if (teamModel.preReceiveScripts != null) {
      preReceiveScripts.addAll(teamModel.preReceiveScripts);
    }
    final Palette<String> preReceivePalette =
        new Palette<String>(
            "preReceiveScripts",
            new ListModel<String>(preReceiveScripts),
            new CollectionModel<String>(app().repositories().getPreReceiveScriptsUnused(null)),
            new StringChoiceRenderer(),
            12,
            true);

    // post-receive palette
    if (teamModel.postReceiveScripts != null) {
      postReceiveScripts.addAll(teamModel.postReceiveScripts);
    }
    final Palette<String> postReceivePalette =
        new Palette<String>(
            "postReceiveScripts",
            new ListModel<String>(postReceiveScripts),
            new CollectionModel<String>(app().repositories().getPostReceiveScriptsUnused(null)),
            new StringChoiceRenderer(),
            12,
            true);

    Form<TeamModel> form =
        new Form<TeamModel>("editForm", model) {

          private static final long serialVersionUID = 1L;

          /*
           * (non-Javadoc)
           *
           * @see org.apache.wicket.markup.html.form.Form#onSubmit()
           */
          @Override
          protected void onSubmit() {
            String teamname = teamModel.name;
            if (StringUtils.isEmpty(teamname)) {
              error(getString("gb.pleaseSetTeamName"));
              return;
            }
            if (isCreate) {
              TeamModel model = app().users().getTeamModel(teamname);
              if (model != null) {
                error(MessageFormat.format(getString("gb.teamNameUnavailable"), teamname));
                return;
              }
            }
            // update team permissions
            for (RegistrantAccessPermission repositoryPermission : permissions) {
              teamModel.setRepositoryPermission(
                  repositoryPermission.registrant, repositoryPermission.permission);
            }

            Iterator<UserChoice> selectedUsers = users.getSelectedChoices();
            List<String> members = new ArrayList<String>();
            while (selectedUsers.hasNext()) {
              members.add(selectedUsers.next().getUserId().toLowerCase());
            }
            teamModel.users.clear();
            teamModel.users.addAll(members);

            // set mailing lists
            String ml = mailingLists.getObject();
            if (!StringUtils.isEmpty(ml)) {
              Set<String> list = new HashSet<String>();
              for (String address : ml.split("(,|\\s)")) {
                if (StringUtils.isEmpty(address)) {
                  continue;
                }
                list.add(address.toLowerCase());
              }
              teamModel.mailingLists.clear();
              teamModel.mailingLists.addAll(list);
            }

            // pre-receive scripts
            List<String> preReceiveScripts = new ArrayList<String>();
            Iterator<String> pres = preReceivePalette.getSelectedChoices();
            while (pres.hasNext()) {
              preReceiveScripts.add(pres.next());
            }
            teamModel.preReceiveScripts.clear();
            teamModel.preReceiveScripts.addAll(preReceiveScripts);

            // post-receive scripts
            List<String> postReceiveScripts = new ArrayList<String>();
            Iterator<String> post = postReceivePalette.getSelectedChoices();
            while (post.hasNext()) {
              postReceiveScripts.add(post.next());
            }
            teamModel.postReceiveScripts.clear();
            teamModel.postReceiveScripts.addAll(postReceiveScripts);

            try {
              if (isCreate) {
                app().gitblit().addTeam(teamModel);
              } else {
                app().gitblit().reviseTeam(oldName, teamModel);
              }
            } catch (GitBlitException e) {
              error(e.getMessage());
              return;
            }
            setRedirect(false);
            if (isCreate) {
              // create another team
              info(MessageFormat.format(getString("gb.teamCreated"), teamModel.name));
            }
            // back to users page
            setResponsePage(UsersPage.class);
          }
        };

    // do not let the browser pre-populate these fields
    form.add(new SimpleAttributeModifier("autocomplete", "off"));

    // not all user services support manipulating team memberships
    boolean editMemberships = app().authentication().supportsTeamMembershipChanges(teamModel);

    // field names reflective match TeamModel fields
    form.add(new TextField<String>("name"));
    form.add(new CheckBox("canAdmin"));
    form.add(
        new CheckBox("canFork")
            .setEnabled(app().settings().getBoolean(Keys.web.allowForking, true)));
    form.add(new CheckBox("canCreate"));
    form.add(users.setEnabled(editMemberships));
    mailingLists =
        new Model<String>(
            teamModel.mailingLists == null
                ? ""
                : StringUtils.flattenStrings(teamModel.mailingLists, " "));
    form.add(new TextField<String>("mailingLists", mailingLists));

    form.add(
        new RegistrantPermissionsPanel(
            "repositories", RegistrantType.REPOSITORY, repos, permissions, getAccessPermissions()));
    form.add(preReceivePalette);
    form.add(
        new BulletListPanel(
            "inheritedPreReceive",
            "inherited",
            app().repositories().getPreReceiveScriptsInherited(null)));
    form.add(postReceivePalette);
    form.add(
        new BulletListPanel(
            "inheritedPostReceive",
            "inherited",
            app().repositories().getPostReceiveScriptsInherited(null)));

    form.add(new Button("save"));
    Button cancel =
        new Button("cancel") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            setResponsePage(UsersPage.class);
          }
        };
    cancel.setDefaultFormProcessing(false);
    form.add(cancel);

    add(form);
  }
  @SuppressWarnings("serial")
  public IncluirUsuarioPage(final PageParameters parameters) {
    super(parameters, "Usuário", "Incluir usuário");
    @SuppressWarnings("rawtypes")
    Form form = new Form("form");
    add(form);

    form.add(new FeedbackPanel("mensagem"));

    TextField<String> textFieldNome =
        new TextField<String>("nome", new PropertyModel<String>(this, "usuario.nome"));
    textFieldNome.setRequired(true);

    form.add(textFieldNome);

    TextField<String> textFieldLogin =
        new TextField<String>("login", new PropertyModel<String>(this, "usuario.login"));
    textFieldLogin.setRequired(true);
    form.add(textFieldLogin);

    form.add(new PasswordTextField("senha", new PropertyModel<String>(this, "usuario.senha")));

    form.add(
        new PasswordTextField(
            "confirmarSenha", new PropertyModel<String>(this, "senhaConfirmada")));

    List<Permissao> permissoes = (List<Permissao>) new PermissaoBO().getListaTodasPermissoes();

    @SuppressWarnings("rawtypes")
    IChoiceRenderer renderer = new ChoiceRenderer("descricao", "codigo");

    @SuppressWarnings({"rawtypes", "unchecked"})
    final Palette palette =
        new Palette(
            "palette",
            new ListModel<Permissao>(new ArrayList<Permissao>()),
            new CollectionModel<Permissao>(permissoes),
            renderer,
            10,
            true);

    form.add(palette);

    form.add(
        new Button("btnSalvar") {

          @Override
          public void onSubmit() {
            // Verifica se o login já foi cadastrado
            UsuarioBO usuarioBO = new UsuarioBO();

            if (isSenhaValida()) {
              usuario.setLogin(usuario.getLogin().toLowerCase());
              if (!usuarioBO.isLoginCadastrado(usuario)) {
                @SuppressWarnings("unchecked")
                ListModel<Permissao> modelPermissao =
                    (ListModel<Permissao>) palette.getDefaultModel();
                usuario.setListaPermissao(modelPermissao.getObject());
                usuarioBO.inserir(usuario);

                setResponsePage(new ListarUsuarioPage(usuario.getId()));
              } else {
                error("Login já cadastrado.");
              }

            } else {
              error("A Senha confirmada é diferente da Senha informada.");
            }
          }
        });

    Button btnVoltar =
        new Button("btnVoltar") {
          @Override
          public void onSubmit() {
            setResponsePage(ListarUsuarioPage.class);
          }
        };

    btnVoltar.setDefaultFormProcessing(false);

    form.add(btnVoltar);
  }
  protected void setupPage(final RepositoryModel repositoryModel) {
    // ensure this user can create or edit this repository
    checkPermissions(repositoryModel);

    List<String> federationSets = new ArrayList<String>();
    List<String> repositoryUsers = new ArrayList<String>();
    if (isCreate) {
      super.setupPage(getString("gb.newRepository"), "");
    } else {
      super.setupPage(getString("gb.edit"), repositoryModel.name);
      if (repositoryModel.accessRestriction.exceeds(AccessRestrictionType.NONE)) {
        repositoryUsers.addAll(GitBlit.self().getRepositoryUsers(repositoryModel));
        Collections.sort(repositoryUsers);
      }
      federationSets.addAll(repositoryModel.federationSets);
    }

    final String oldName = repositoryModel.name;
    // users palette
    final Palette<String> usersPalette =
        new Palette<String>(
            "users",
            new ListModel<String>(repositoryUsers),
            new CollectionModel<String>(GitBlit.self().getAllUsernames()),
            new ChoiceRenderer<String>("", ""),
            10,
            false);

    // federation sets palette
    List<String> sets = GitBlit.getStrings(Keys.federation.sets);
    final Palette<String> federationSetsPalette =
        new Palette<String>(
            "federationSets",
            new ListModel<String>(federationSets),
            new CollectionModel<String>(sets),
            new ChoiceRenderer<String>("", ""),
            10,
            false);

    CompoundPropertyModel<RepositoryModel> model =
        new CompoundPropertyModel<RepositoryModel>(repositoryModel);
    Form<RepositoryModel> form =
        new Form<RepositoryModel>("editForm", model) {

          private static final long serialVersionUID = 1L;

          @Override
          protected void onSubmit() {
            try {
              // confirm a repository name was entered
              if (StringUtils.isEmpty(repositoryModel.name)) {
                error("Please set repository name!");
                return;
              }

              // automatically convert backslashes to forward slashes
              repositoryModel.name = repositoryModel.name.replace('\\', '/');
              // Automatically replace // with /
              repositoryModel.name = repositoryModel.name.replace("//", "/");

              // prohibit folder paths
              if (repositoryModel.name.startsWith("/")) {
                error("Leading root folder references (/) are prohibited.");
                return;
              }
              if (repositoryModel.name.startsWith("../")) {
                error("Relative folder references (../) are prohibited.");
                return;
              }
              if (repositoryModel.name.contains("/../")) {
                error("Relative folder references (../) are prohibited.");
                return;
              }

              // confirm valid characters in repository name
              Character c = StringUtils.findInvalidCharacter(repositoryModel.name);
              if (c != null) {
                error(MessageFormat.format("Illegal character ''{0}'' in repository name!", c));
                return;
              }

              // confirm access restriction selection
              if (repositoryModel.accessRestriction == null) {
                error("Please select access restriction!");
                return;
              }

              // save federation set preferences
              if (repositoryModel.federationStrategy.exceeds(FederationStrategy.EXCLUDE)) {
                repositoryModel.federationSets.clear();
                Iterator<String> sets = federationSetsPalette.getSelectedChoices();
                while (sets.hasNext()) {
                  repositoryModel.federationSets.add(sets.next());
                }
              }

              // save the repository
              GitBlit.self().updateRepositoryModel(oldName, repositoryModel, isCreate);

              // save the repository access list
              if (repositoryModel.accessRestriction.exceeds(AccessRestrictionType.NONE)) {
                Iterator<String> users = usersPalette.getSelectedChoices();
                List<String> repositoryUsers = new ArrayList<String>();
                while (users.hasNext()) {
                  repositoryUsers.add(users.next());
                }
                // ensure the owner is added to the user list
                if (repositoryModel.owner != null
                    && !repositoryUsers.contains(repositoryModel.owner)) {
                  repositoryUsers.add(repositoryModel.owner);
                }
                GitBlit.self().setRepositoryUsers(repositoryModel, repositoryUsers);
              }
            } catch (GitBlitException e) {
              error(e.getMessage());
              return;
            }
            setRedirect(false);
            setResponsePage(RepositoriesPage.class);
          }
        };

    // field names reflective match RepositoryModel fields
    form.add(new TextField<String>("name").setEnabled(isCreate || isAdmin));
    form.add(new TextField<String>("description"));
    form.add(
        new DropDownChoice<String>("owner", GitBlit.self().getAllUsernames())
            .setEnabled(GitBlitWebSession.get().canAdmin()));
    form.add(
        new DropDownChoice<AccessRestrictionType>(
            "accessRestriction",
            Arrays.asList(AccessRestrictionType.values()),
            new AccessRestrictionRenderer()));
    form.add(new CheckBox("isFrozen"));
    // TODO enable origin definition
    form.add(new TextField<String>("origin").setEnabled(false /* isCreate */));

    // federation strategies - remove ORIGIN choice if this repository has
    // no origin.
    List<FederationStrategy> federationStrategies =
        new ArrayList<FederationStrategy>(Arrays.asList(FederationStrategy.values()));
    if (StringUtils.isEmpty(repositoryModel.origin)) {
      federationStrategies.remove(FederationStrategy.FEDERATE_ORIGIN);
    }
    form.add(
        new DropDownChoice<FederationStrategy>(
            "federationStrategy", federationStrategies, new FederationTypeRenderer()));
    form.add(new CheckBox("useTickets"));
    form.add(new CheckBox("useDocs"));
    form.add(new CheckBox("showRemoteBranches"));
    form.add(new CheckBox("showReadme"));
    form.add(usersPalette);
    form.add(federationSetsPalette);

    form.add(new Button("save"));
    Button cancel =
        new Button("cancel") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            setResponsePage(RepositoriesPage.class);
          }
        };
    cancel.setDefaultFormProcessing(false);
    form.add(cancel);

    add(form);
  }
  public SaveCancelFormPanel(String id, boolean ajax) {
    super(id);

    form = new Form("form");
    form.add(new SetFocusBehavior(form));
    feedbackPanel = new FeedbackPanel("feedback");
    feedbackPanel.setOutputMarkupId(true);
    titleLabel = new Label("title", getTitleModel());

    if (ajax) {
      submitButton =
          new AjaxButton("submitButton") {
            @Override
            protected void onSubmit(AjaxRequestTarget target, Form form) {
              onSave(target);
              if (!Session.get()
                  .getFeedbackMessages()
                  .hasMessage(new ErrorLevelFeedbackMessageFilter(FeedbackMessage.ERROR))) {
                defaultReturnAction(target);
              }
            }

            @Override
            protected void onError(AjaxRequestTarget target, Form form) {
              target.addComponent(feedbackPanel);
            }
          };
      cancelButton =
          new AjaxButton("cancelButton") {
            @Override
            protected void onSubmit(AjaxRequestTarget target, Form form) {
              onCancel(target);
              defaultReturnAction(target);
            }
          };
    } else {
      submitButton =
          new Button("submitButton") {
            @Override
            public void onSubmit() {
              onSave(null);
              if (!Session.get()
                  .getFeedbackMessages()
                  .hasMessage(new ErrorLevelFeedbackMessageFilter(FeedbackMessage.ERROR))) {
                defaultReturnAction();
              }
            }
          };
      cancelButton =
          new Button("cancelButton") {
            @Override
            public void onSubmit() {
              onCancel(null);
              defaultReturnAction();
            }
          };
    }
    cancelButton.setDefaultFormProcessing(false);

    add(form);
    form.add(feedbackPanel);
    form.add(titleLabel);
    form.add(submitButton);
    form.add(cancelButton);
  }
  protected void setupPage(final UserModel userModel) {
    if (isCreate) {
      super.setupPage(getString("gb.newUser"), "");
    } else {
      super.setupPage(getString("gb.edit"), userModel.username);
    }

    final Model<String> confirmPassword =
        new Model<String>(StringUtils.isEmpty(userModel.password) ? "" : userModel.password);
    CompoundPropertyModel<UserModel> model = new CompoundPropertyModel<UserModel>(userModel);

    // build list of projects including all repositories wildcards
    List<String> repos = getAccessRestrictedRepositoryList(true, userModel);

    List<String> userTeams = new ArrayList<String>();
    for (TeamModel team : userModel.getTeams()) {
      userTeams.add(team.name);
    }
    Collections.sort(userTeams);

    final String oldName = userModel.username;
    final List<RegistrantAccessPermission> permissions =
        app().repositories().getUserAccessPermissions(userModel);

    final Palette<String> teams =
        new Palette<String>(
            "teams",
            new ListModel<String>(new ArrayList<String>(userTeams)),
            new CollectionModel<String>(app().users().getAllTeamNames()),
            new StringChoiceRenderer(),
            10,
            false);
    Form<UserModel> form =
        new Form<UserModel>("editForm", model) {

          private static final long serialVersionUID = 1L;

          /*
           * (non-Javadoc)
           *
           * @see org.apache.wicket.markup.html.form.Form#onSubmit()
           */
          @Override
          protected void onSubmit() {
            if (StringUtils.isEmpty(userModel.username)) {
              error(getString("gb.pleaseSetUsername"));
              return;
            }
            // force username to lower-case
            userModel.username = userModel.username.toLowerCase();
            String username = userModel.username;
            if (isCreate) {
              UserModel model = app().users().getUserModel(username);
              if (model != null) {
                error(MessageFormat.format(getString("gb.usernameUnavailable"), username));
                return;
              }
            }
            boolean rename = !StringUtils.isEmpty(oldName) && !oldName.equalsIgnoreCase(username);
            if (app().authentication().supportsCredentialChanges(userModel)) {
              if (!userModel.password.equals(confirmPassword.getObject())) {
                error(getString("gb.passwordsDoNotMatch"));
                return;
              }
              String password = userModel.password;
              if (!password.toUpperCase().startsWith(StringUtils.MD5_TYPE)
                  && !password.toUpperCase().startsWith(StringUtils.COMBINED_MD5_TYPE)) {
                // This is a plain text password.
                // Check length.
                int minLength = app().settings().getInteger(Keys.realm.minPasswordLength, 5);
                if (minLength < 4) {
                  minLength = 4;
                }
                if (password.trim().length() < minLength) {
                  error(MessageFormat.format(getString("gb.passwordTooShort"), minLength));
                  return;
                }

                // change the cookie
                userModel.cookie = StringUtils.getSHA1(userModel.username + password);

                // Optionally store the password MD5 digest.
                String type = app().settings().getString(Keys.realm.passwordStorage, "md5");
                if (type.equalsIgnoreCase("md5")) {
                  // store MD5 digest of password
                  userModel.password =
                      StringUtils.MD5_TYPE + StringUtils.getMD5(userModel.password);
                } else if (type.equalsIgnoreCase("combined-md5")) {
                  // store MD5 digest of username+password
                  userModel.password =
                      StringUtils.COMBINED_MD5_TYPE
                          + StringUtils.getMD5(username + userModel.password);
                }
              } else if (rename
                  && password.toUpperCase().startsWith(StringUtils.COMBINED_MD5_TYPE)) {
                error(getString("gb.combinedMd5Rename"));
                return;
              }
            }

            // update user permissions
            for (RegistrantAccessPermission repositoryPermission : permissions) {
              if (repositoryPermission.mutable) {
                userModel.setRepositoryPermission(
                    repositoryPermission.registrant, repositoryPermission.permission);
              }
            }

            Iterator<String> selectedTeams = teams.getSelectedChoices();
            userModel.removeAllTeams();
            while (selectedTeams.hasNext()) {
              TeamModel team = app().users().getTeamModel(selectedTeams.next());
              if (team == null) {
                continue;
              }
              userModel.addTeam(team);
            }

            try {
              if (isCreate) {
                app().gitblit().addUser(userModel);
              } else {
                app().gitblit().reviseUser(oldName, userModel);
              }
            } catch (GitBlitException e) {
              error(e.getMessage());
              return;
            }
            setRedirect(false);
            if (isCreate) {
              // create another user
              info(MessageFormat.format(getString("gb.userCreated"), userModel.username));
              setResponsePage(EditUserPage.class);
            } else {
              // back to users page
              setResponsePage(UsersPage.class);
            }
          }
        };

    // do not let the browser pre-populate these fields
    form.add(new SimpleAttributeModifier("autocomplete", "off"));

    // not all user providers support manipulating username and password
    boolean editCredentials = app().authentication().supportsCredentialChanges(userModel);

    // not all user providers support manipulating display name
    boolean editDisplayName = app().authentication().supportsDisplayNameChanges(userModel);

    // not all user providers support manipulating email address
    boolean editEmailAddress = app().authentication().supportsEmailAddressChanges(userModel);

    // not all user providers support manipulating team memberships
    boolean editTeams = app().authentication().supportsTeamMembershipChanges(userModel);

    // not all user providers support manipulating the admin role
    boolean changeAdminRole = app().authentication().supportsRoleChanges(userModel, Role.ADMIN);

    // not all user providers support manipulating the create role
    boolean changeCreateRole = app().authentication().supportsRoleChanges(userModel, Role.CREATE);

    // not all user providers support manipulating the fork role
    boolean changeForkRole = app().authentication().supportsRoleChanges(userModel, Role.FORK);

    // field names reflective match UserModel fields
    form.add(new TextField<String>("username").setEnabled(editCredentials));
    NonTrimmedPasswordTextField passwordField = new NonTrimmedPasswordTextField("password");
    passwordField.setResetPassword(false);
    form.add(passwordField.setEnabled(editCredentials));
    NonTrimmedPasswordTextField confirmPasswordField =
        new NonTrimmedPasswordTextField("confirmPassword", confirmPassword);
    confirmPasswordField.setResetPassword(false);
    form.add(confirmPasswordField.setEnabled(editCredentials));
    form.add(new TextField<String>("displayName").setEnabled(editDisplayName));
    form.add(new TextField<String>("emailAddress").setEnabled(editEmailAddress));

    if (userModel.canAdmin() && !userModel.canAdmin) {
      // user inherits Admin permission
      // display a disabled-yet-checked checkbox
      form.add(new CheckBox("canAdmin", Model.of(true)).setEnabled(false));
    } else {
      form.add(new CheckBox("canAdmin").setEnabled(changeAdminRole));
    }

    if (userModel.canFork() && !userModel.canFork) {
      // user inherits Fork permission
      // display a disabled-yet-checked checkbox
      form.add(new CheckBox("canFork", Model.of(true)).setEnabled(false));
    } else {
      final boolean forkingAllowed = app().settings().getBoolean(Keys.web.allowForking, true);
      form.add(new CheckBox("canFork").setEnabled(forkingAllowed && changeForkRole));
    }

    if (userModel.canCreate() && !userModel.canCreate) {
      // user inherits Create permission
      // display a disabled-yet-checked checkbox
      form.add(new CheckBox("canCreate", Model.of(true)).setEnabled(false));
    } else {
      form.add(new CheckBox("canCreate").setEnabled(changeCreateRole));
    }

    form.add(new CheckBox("excludeFromFederation"));
    form.add(new CheckBox("disabled"));

    form.add(
        new RegistrantPermissionsPanel(
            "repositories", RegistrantType.REPOSITORY, repos, permissions, getAccessPermissions()));
    form.add(teams.setEnabled(editTeams));

    form.add(new TextField<String>("organizationalUnit").setEnabled(editDisplayName));
    form.add(new TextField<String>("organization").setEnabled(editDisplayName));
    form.add(new TextField<String>("locality").setEnabled(editDisplayName));
    form.add(new TextField<String>("stateProvince").setEnabled(editDisplayName));
    form.add(new TextField<String>("countryCode").setEnabled(editDisplayName));
    form.add(new Button("save"));
    Button cancel =
        new Button("cancel") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            setResponsePage(UsersPage.class);
          }
        };
    cancel.setDefaultFormProcessing(false);
    form.add(cancel);

    add(form);
  }
  @Override
  public void onInitialize() {
    super.onInitialize();

    // unpack model
    final ImportWizardModel importWizardModel = this.model.getObject();

    final List<ProcessedGradeItem> itemsToCreate = importWizardModel.getItemsToCreate();
    final List<ProcessedGradeItem> itemsToUpdate = importWizardModel.getItemsToUpdate();
    final List<Assignment> assignmentsToCreate = importWizardModel.getAssignmentsToCreate();

    final Form<?> form =
        new Form("form") {
          private static final long serialVersionUID = 1L;

          boolean errors = false;

          @Override
          protected void onSubmit() {

            final Map<String, Long> assignmentMap = new HashMap<>();

            // Create new GB items
            assignmentsToCreate.forEach(
                assignment -> {
                  final Long assignmentId =
                      GradeImportConfirmationStep.this.businessService.addAssignment(assignment);
                  assignmentMap.put(StringUtils.trim(assignment.getName()), assignmentId);
                });

            final List<ProcessedGradeItem> itemsToSave = new ArrayList<ProcessedGradeItem>();
            itemsToSave.addAll(itemsToUpdate);
            itemsToSave.addAll(itemsToCreate);

            itemsToSave.forEach(
                processedGradeItem -> {
                  log.debug("Looping through items to save");

                  List<ProcessedGradeItemDetail> processedGradeItemDetails =
                      processedGradeItem.getProcessedGradeItemDetails();

                  processedGradeItemDetails.forEach(
                      processedGradeItemDetail -> {
                        log.debug("Looping through detail items to save");

                        // get data
                        Long assignmentId = processedGradeItem.getItemId();
                        String assignmentTitle =
                            StringUtils.trim(
                                processedGradeItem
                                    .getItemTitle()); // trim to match the gbservice behaviour

                        if (assignmentId == null) {
                          // Should be a newly created GB item
                          assignmentId = assignmentMap.get(assignmentTitle);
                        }

                        final GradeSaveResponse saved =
                            GradeImportConfirmationStep.this.businessService.saveGrade(
                                assignmentId,
                                processedGradeItemDetail.getStudentUuid(),
                                processedGradeItemDetail.getGrade(),
                                processedGradeItemDetail.getComment());

                        // if no change, try just the comment
                        if (saved == GradeSaveResponse.NO_CHANGE) {

                          // Check for changed comments
                          final String currentComment =
                              StringUtils.trimToNull(
                                  GradeImportConfirmationStep.this.businessService
                                      .getAssignmentGradeComment(
                                          assignmentId, processedGradeItemDetail.getStudentUuid()));
                          final String newComment =
                              StringUtils.trimToNull(processedGradeItemDetail.getComment());

                          if (!StringUtils.equals(currentComment, newComment)) {
                            final boolean success =
                                GradeImportConfirmationStep.this.businessService
                                    .updateAssignmentGradeComment(
                                        assignmentId,
                                        processedGradeItemDetail.getStudentUuid(),
                                        newComment);
                            log.info(
                                "Saving comment: "
                                    + success
                                    + ", "
                                    + assignmentId
                                    + ", "
                                    + processedGradeItemDetail.getStudentEid()
                                    + ", "
                                    + processedGradeItemDetail.getComment());
                            if (!success) {
                              errors = true;
                            }
                          }
                        } else if (saved != GradeSaveResponse.OK) {
                          // Anything other than OK is bad
                          errors = true;
                        }
                        log.info(
                            "Saving grade: "
                                + saved
                                + ", "
                                + assignmentId
                                + ", "
                                + processedGradeItemDetail.getStudentEid()
                                + ", "
                                + processedGradeItemDetail.getGrade()
                                + ", "
                                + processedGradeItemDetail.getComment());
                      });
                });

            if (!errors) {
              getSession().success(getString("importExport.confirmation.success"));
              setResponsePage(new GradebookPage());
            } else {
              getSession().error(getString("importExport.confirmation.failure"));
            }
          }
        };
    add(form);

    // back button
    final Button backButton =
        new Button("backbutton") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            log.debug("Clicking back button...");
            Component newPanel = null;
            if (assignmentsToCreate.size() > 0) {
              newPanel =
                  new CreateGradeItemStep(
                      GradeImportConfirmationStep.this.panelId, Model.of(importWizardModel));
            } else {
              newPanel =
                  new GradeItemImportSelectionStep(
                      GradeImportConfirmationStep.this.panelId, Model.of(importWizardModel));
            }
            newPanel.setOutputMarkupId(true);
            GradeImportConfirmationStep.this.replaceWith(newPanel);
          }
        };
    backButton.setDefaultFormProcessing(false);
    form.add(backButton);

    // finish button
    form.add(new Button("finishbutton"));

    // items to be updated
    final boolean hasItemsToUpdate = !itemsToUpdate.isEmpty();
    final WebMarkupContainer gradesUpdateContainer =
        new WebMarkupContainer("grades_update_container") {
          private static final long serialVersionUID = 1L;

          @Override
          public boolean isVisible() {
            return hasItemsToUpdate;
          }
        };
    add(gradesUpdateContainer);

    if (hasItemsToUpdate) {
      final ListView<ProcessedGradeItem> updateList = makeListView("grades_update", itemsToUpdate);

      updateList.setReuseItems(true);
      gradesUpdateContainer.add(updateList);
    }

    // items to be created
    final boolean hasItemsToCreate = !itemsToCreate.isEmpty();
    final WebMarkupContainer gradesCreateContainer =
        new WebMarkupContainer("grades_create_container") {
          private static final long serialVersionUID = 1L;

          @Override
          public boolean isVisible() {
            return hasItemsToCreate;
          }
        };
    add(gradesCreateContainer);

    if (hasItemsToCreate) {
      final ListView<ProcessedGradeItem> createList = makeListView("grades_create", itemsToCreate);

      createList.setReuseItems(true);
      gradesCreateContainer.add(createList);
    }
  }
  @Override
  public void onInitialize() {
    super.onInitialize();

    // unpack model
    final ImportWizardModel importWizardModel = this.model.getObject();

    final CheckGroup<ProcessedGradeItem> group =
        new CheckGroup<ProcessedGradeItem>("group", new ArrayList<ProcessedGradeItem>());

    final Form<?> form =
        new Form("form") {
          private static final long serialVersionUID = 1L;

          @Override
          protected void onSubmit() {
            boolean validated = true;

            final List<ProcessedGradeItem> selectedGradeItems =
                (List<ProcessedGradeItem>) group.getModelObject();
            log.debug("Processed items: " + selectedGradeItems.size());

            // this has an odd model so we need to have the validation in the onSubmit.
            if (selectedGradeItems.size() == 0) {
              validated = false;
              error(getString("importExport.selection.noneselected"));
            }

            if (validated) {

              // clear any previous errors
              final ImportExportPage page = (ImportExportPage) getPage();
              page.clearFeedback();

              // Process the selected items into the create/update lists
              final List<ProcessedGradeItem> itemsToUpdate =
                  filterListByStatus(
                      selectedGradeItems,
                      Arrays.asList(
                          ProcessedGradeItemStatus.STATUS_UPDATE,
                          ProcessedGradeItemStatus.STATUS_NA));
              final List<ProcessedGradeItem> itemsToCreate =
                  filterListByStatus(
                      selectedGradeItems, Arrays.asList(ProcessedGradeItemStatus.STATUS_NEW));

              log.debug("Filtered Update items: " + itemsToUpdate.size());
              log.debug("Filtered Create items: " + itemsToCreate.size());

              final List<ProcessedGradeItem> gbItemsToCreate = new ArrayList<ProcessedGradeItem>();
              itemsToCreate.forEach(
                  item -> {
                    // Don't want comment items here
                    if (!"N/A".equals(item.getItemPointValue())) {
                      gbItemsToCreate.add(item);
                    }
                  });

              log.debug("Actual items to create: " + gbItemsToCreate.size());

              // repaint panel
              Component newPanel = null;
              importWizardModel.setSelectedGradeItems(selectedGradeItems);
              importWizardModel.setGbItemsToCreate(gbItemsToCreate);
              importWizardModel.setItemsToCreate(itemsToCreate);
              importWizardModel.setItemsToUpdate(itemsToUpdate);
              if (gbItemsToCreate.size() > 0) {
                importWizardModel.setStep(1);
                importWizardModel.setTotalSteps(gbItemsToCreate.size());
                newPanel =
                    new CreateGradeItemStep(
                        GradeItemImportSelectionStep.this.panelId, Model.of(importWizardModel));
              } else {
                newPanel =
                    new GradeImportConfirmationStep(
                        GradeItemImportSelectionStep.this.panelId, Model.of(importWizardModel));
              }
              newPanel.setOutputMarkupId(true);
              GradeItemImportSelectionStep.this.replaceWith(newPanel);
            }
          }
        };
    add(form);
    form.add(group);

    final Button backButton =
        new Button("backbutton") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {

            // clear any previous errors
            final ImportExportPage page = (ImportExportPage) getPage();
            page.clearFeedback();

            final Component newPanel =
                new GradeImportUploadStep(GradeItemImportSelectionStep.this.panelId);
            newPanel.setOutputMarkupId(true);
            GradeItemImportSelectionStep.this.replaceWith(newPanel);
          }
        };
    backButton.setDefaultFormProcessing(false);
    group.add(backButton);

    group.add(new Button("nextbutton"));

    group.add(new CheckGroupSelector("groupselector"));
    final ListView<ProcessedGradeItem> gradeList =
        new ListView<ProcessedGradeItem>("grades", importWizardModel.getProcessedGradeItems()) {
          private static final long serialVersionUID = 1L;

          @Override
          protected void populateItem(final ListItem<ProcessedGradeItem> item) {

            final Check<ProcessedGradeItem> checkbox = new Check<>("checkbox", item.getModel());
            final Label itemTitle =
                new Label(
                    "itemTitle", new PropertyModel<String>(item.getDefaultModel(), "itemTitle"));
            final Label itemPointValue =
                new Label(
                    "itemPointValue",
                    new PropertyModel<String>(item.getDefaultModel(), "itemPointValue"));
            final Label itemStatus = new Label("itemStatus");

            item.add(checkbox);
            item.add(itemTitle);
            item.add(itemPointValue);
            item.add(itemStatus);

            // Use the status code to look up the text representation
            final PropertyModel<ProcessedGradeItemStatus> statusProp =
                new PropertyModel<ProcessedGradeItemStatus>(item.getDefaultModel(), "status");
            final ProcessedGradeItemStatus status = statusProp.getObject();

            // For external items, set a different label and disable the control
            if (status.getStatusCode() == ProcessedGradeItemStatus.STATUS_EXTERNAL) {
              itemStatus.setDefaultModel(
                  new StringResourceModel(
                      "importExport.status." + status.getStatusCode(),
                      statusProp,
                      null,
                      status.getStatusValue()));
              item.setEnabled(false);
              item.add(new AttributeModifier("class", "external"));
            } else {

              itemStatus.setDefaultModel(
                  new ResourceModel("importExport.status." + status.getStatusCode()));

              // if no changes, grey it out and remove checkbox
              if (status.getStatusCode() == ProcessedGradeItemStatus.STATUS_NA) {
                checkbox.setVisible(false);
                item.add(new AttributeAppender("class", Model.of("no_changes"), " "));
              }
            }

            final String naString =
                getString("importExport.selection.pointValue.na", new Model(), "N/A");
            if (naString.equals(item.getModelObject().getItemPointValue())) {
              item.add(new AttributeAppender("class", Model.of("comment"), " "));
            }

            // add an additional row for the comments for each
            final PropertyModel<String> commentLabelProp =
                new PropertyModel<String>(item.getDefaultModel(), "commentLabel");
            final PropertyModel<ProcessedGradeItemStatus> commentStatusProp =
                new PropertyModel<ProcessedGradeItemStatus>(
                    item.getDefaultModel(), "commentStatus");
            final String commentLabel = commentLabelProp.getObject();
            final ProcessedGradeItemStatus commentStatus = commentStatusProp.getObject();

            item.add(
                new Behavior() {
                  private static final long serialVersionUID = 1L;

                  @Override
                  public void afterRender(final Component component) {
                    super.afterRender(component);
                    if (commentLabel != null) {
                      String rowClass = "comment";
                      String statusValue =
                          getString("importExport.status." + commentStatus.getStatusCode());
                      if (commentStatus.getStatusCode()
                          == ProcessedGradeItemStatus.STATUS_EXTERNAL) {
                        rowClass += " external";
                        statusValue =
                            new StringResourceModel(
                                    "importExport.status." + commentStatus.getStatusCode(),
                                    commentStatusProp,
                                    null,
                                    commentStatus.getStatusValue())
                                .getString();
                      }
                      if (commentStatus.getStatusCode() == ProcessedGradeItemStatus.STATUS_NA) {
                        rowClass += " no_changes";
                      }

                      component
                          .getResponse()
                          .write(
                              "<tr class=\""
                                  + rowClass
                                  + "\">"
                                  + "<td></td>"
                                  + "<td class=\"item_title\">"
                                  + commentLabel
                                  + "</td>"
                                  + "<td class=\"item_points\">"
                                  + naString
                                  + "</td>"
                                  + "<td class=\"item_status\">"
                                  + statusValue
                                  + "</td>"
                                  + "</tr>");
                    }
                  }
                });
          }
        };

    gradeList.setReuseItems(true);
    group.add(gradeList);
  }
Beispiel #14
0
  protected void setupPage(RepositoryModel model) {
    this.repositoryModel = model;

    // ensure this user can create or edit this repository
    checkPermissions(repositoryModel);

    List<String> indexedBranches = new ArrayList<String>();
    List<String> federationSets = new ArrayList<String>();
    final List<RegistrantAccessPermission> repositoryUsers =
        new ArrayList<RegistrantAccessPermission>();
    final List<RegistrantAccessPermission> repositoryTeams =
        new ArrayList<RegistrantAccessPermission>();
    List<String> preReceiveScripts = new ArrayList<String>();
    List<String> postReceiveScripts = new ArrayList<String>();

    GitBlitWebSession session = GitBlitWebSession.get();
    final UserModel user = session.getUser() == null ? UserModel.ANONYMOUS : session.getUser();
    final boolean allowEditName =
        isCreate || isAdmin || repositoryModel.isUsersPersonalRepository(user.username);

    if (isCreate) {
      if (user.canAdmin()) {
        super.setupPage(getString("gb.newRepository"), "");
      } else {
        super.setupPage(getString("gb.newRepository"), user.getDisplayName());
      }
    } else {
      super.setupPage(getString("gb.edit"), repositoryModel.name);
      repositoryUsers.addAll(GitBlit.self().getUserAccessPermissions(repositoryModel));
      repositoryTeams.addAll(GitBlit.self().getTeamAccessPermissions(repositoryModel));
      Collections.sort(repositoryUsers);
      Collections.sort(repositoryTeams);

      federationSets.addAll(repositoryModel.federationSets);
      if (!ArrayUtils.isEmpty(repositoryModel.indexedBranches)) {
        indexedBranches.addAll(repositoryModel.indexedBranches);
      }
    }

    final String oldName = repositoryModel.name;

    final RegistrantPermissionsPanel usersPalette =
        new RegistrantPermissionsPanel(
            "users",
            RegistrantType.USER,
            GitBlit.self().getAllUsernames(),
            repositoryUsers,
            getAccessPermissions());
    final RegistrantPermissionsPanel teamsPalette =
        new RegistrantPermissionsPanel(
            "teams",
            RegistrantType.TEAM,
            GitBlit.self().getAllTeamnames(),
            repositoryTeams,
            getAccessPermissions());

    // owners palette
    List<String> owners = new ArrayList<String>(repositoryModel.owners);
    List<String> persons = GitBlit.self().getAllUsernames();
    final Palette<String> ownersPalette =
        new Palette<String>(
            "owners",
            new ListModel<String>(owners),
            new CollectionModel<String>(persons),
            new StringChoiceRenderer(),
            12,
            true);

    // indexed local branches palette
    List<String> allLocalBranches = new ArrayList<String>();
    allLocalBranches.add(Constants.DEFAULT_BRANCH);
    allLocalBranches.addAll(repositoryModel.getLocalBranches());
    boolean luceneEnabled = GitBlit.getBoolean(Keys.web.allowLuceneIndexing, true);
    final Palette<String> indexedBranchesPalette =
        new Palette<String>(
            "indexedBranches",
            new ListModel<String>(indexedBranches),
            new CollectionModel<String>(allLocalBranches),
            new StringChoiceRenderer(),
            8,
            false);
    indexedBranchesPalette.setEnabled(luceneEnabled);

    // federation sets palette
    List<String> sets = GitBlit.getStrings(Keys.federation.sets);
    final Palette<String> federationSetsPalette =
        new Palette<String>(
            "federationSets",
            new ListModel<String>(federationSets),
            new CollectionModel<String>(sets),
            new StringChoiceRenderer(),
            8,
            false);

    // pre-receive palette
    if (!ArrayUtils.isEmpty(repositoryModel.preReceiveScripts)) {
      preReceiveScripts.addAll(repositoryModel.preReceiveScripts);
    }
    final Palette<String> preReceivePalette =
        new Palette<String>(
            "preReceiveScripts",
            new ListModel<String>(preReceiveScripts),
            new CollectionModel<String>(GitBlit.self().getPreReceiveScriptsUnused(repositoryModel)),
            new StringChoiceRenderer(),
            12,
            true);

    // post-receive palette
    if (!ArrayUtils.isEmpty(repositoryModel.postReceiveScripts)) {
      postReceiveScripts.addAll(repositoryModel.postReceiveScripts);
    }
    final Palette<String> postReceivePalette =
        new Palette<String>(
            "postReceiveScripts",
            new ListModel<String>(postReceiveScripts),
            new CollectionModel<String>(
                GitBlit.self().getPostReceiveScriptsUnused(repositoryModel)),
            new StringChoiceRenderer(),
            12,
            true);

    // custom fields
    final Map<String, String> customFieldsMap = GitBlit.getMap(Keys.groovy.customFields);
    List<String> customKeys = new ArrayList<String>(customFieldsMap.keySet());
    final ListView<String> customFieldsListView =
        new ListView<String>("customFieldsListView", customKeys) {

          private static final long serialVersionUID = 1L;

          @Override
          protected void populateItem(ListItem<String> item) {
            String key = item.getModelObject();
            item.add(new Label("customFieldLabel", customFieldsMap.get(key)));

            String value = "";
            if (repositoryModel.customFields != null
                && repositoryModel.customFields.containsKey(key)) {
              value = repositoryModel.customFields.get(key);
            }
            TextField<String> field =
                new TextField<String>("customFieldValue", new Model<String>(value));
            item.add(field);
          }
        };
    customFieldsListView.setReuseItems(true);

    CompoundPropertyModel<RepositoryModel> rModel =
        new CompoundPropertyModel<RepositoryModel>(repositoryModel);
    Form<RepositoryModel> form =
        new Form<RepositoryModel>("editForm", rModel) {

          private static final long serialVersionUID = 1L;

          @Override
          protected void onSubmit() {
            try {
              // confirm a repository name was entered
              if (repositoryModel.name == null && StringUtils.isEmpty(repositoryModel.name)) {
                error(getString("gb.pleaseSetRepositoryName"));
                return;
              }

              // ensure name is trimmed
              repositoryModel.name = repositoryModel.name.trim();

              // automatically convert backslashes to forward slashes
              repositoryModel.name = repositoryModel.name.replace('\\', '/');
              // Automatically replace // with /
              repositoryModel.name = repositoryModel.name.replace("//", "/");

              // prohibit folder paths
              if (repositoryModel.name.startsWith("/")) {
                error(getString("gb.illegalLeadingSlash"));
                return;
              }
              if (repositoryModel.name.startsWith("../")) {
                error(getString("gb.illegalRelativeSlash"));
                return;
              }
              if (repositoryModel.name.contains("/../")) {
                error(getString("gb.illegalRelativeSlash"));
                return;
              }
              if (repositoryModel.name.endsWith("/")) {
                repositoryModel.name =
                    repositoryModel.name.substring(0, repositoryModel.name.length() - 1);
              }

              // confirm valid characters in repository name
              Character c = StringUtils.findInvalidCharacter(repositoryModel.name);
              if (c != null) {
                error(MessageFormat.format(getString("gb.illegalCharacterRepositoryName"), c));
                return;
              }

              if (user.canCreate() && !user.canAdmin() && allowEditName) {
                // ensure repository name begins with the user's path
                if (!repositoryModel.name.startsWith(user.getPersonalPath())) {
                  error(
                      MessageFormat.format(
                          getString("gb.illegalPersonalRepositoryLocation"),
                          user.getPersonalPath()));
                  return;
                }

                if (repositoryModel.name.equals(user.getPersonalPath())) {
                  // reset path prefix and show error
                  repositoryModel.name = user.getPersonalPath() + "/";
                  error(getString("gb.pleaseSetRepositoryName"));
                  return;
                }
              }

              // confirm access restriction selection
              if (repositoryModel.accessRestriction == null) {
                error(getString("gb.selectAccessRestriction"));
                return;
              }

              // confirm federation strategy selection
              if (repositoryModel.federationStrategy == null) {
                error(getString("gb.selectFederationStrategy"));
                return;
              }

              // save federation set preferences
              if (repositoryModel.federationStrategy.exceeds(FederationStrategy.EXCLUDE)) {
                repositoryModel.federationSets.clear();
                Iterator<String> sets = federationSetsPalette.getSelectedChoices();
                while (sets.hasNext()) {
                  repositoryModel.federationSets.add(sets.next());
                }
              }

              // set author metric exclusions
              String ax = metricAuthorExclusions.getObject();
              if (!StringUtils.isEmpty(ax)) {
                Set<String> list = new HashSet<String>();
                for (String exclusion : StringUtils.getStringsFromValue(ax, " ")) {
                  if (StringUtils.isEmpty(exclusion)) {
                    continue;
                  }
                  if (exclusion.indexOf(' ') > -1) {
                    list.add("\"" + exclusion + "\"");
                  } else {
                    list.add(exclusion);
                  }
                }
                repositoryModel.metricAuthorExclusions = new ArrayList<String>(list);
              }

              // set mailing lists
              String ml = mailingLists.getObject();
              if (!StringUtils.isEmpty(ml)) {
                Set<String> list = new HashSet<String>();
                for (String address : ml.split("(,|\\s)")) {
                  if (StringUtils.isEmpty(address)) {
                    continue;
                  }
                  list.add(address.toLowerCase());
                }
                repositoryModel.mailingLists = new ArrayList<String>(list);
              }

              // indexed branches
              List<String> indexedBranches = new ArrayList<String>();
              Iterator<String> branches = indexedBranchesPalette.getSelectedChoices();
              while (branches.hasNext()) {
                indexedBranches.add(branches.next());
              }
              repositoryModel.indexedBranches = indexedBranches;

              // owners
              repositoryModel.owners.clear();
              Iterator<String> owners = ownersPalette.getSelectedChoices();
              while (owners.hasNext()) {
                repositoryModel.addOwner(owners.next());
              }

              // pre-receive scripts
              List<String> preReceiveScripts = new ArrayList<String>();
              Iterator<String> pres = preReceivePalette.getSelectedChoices();
              while (pres.hasNext()) {
                preReceiveScripts.add(pres.next());
              }
              repositoryModel.preReceiveScripts = preReceiveScripts;

              // post-receive scripts
              List<String> postReceiveScripts = new ArrayList<String>();
              Iterator<String> post = postReceivePalette.getSelectedChoices();
              while (post.hasNext()) {
                postReceiveScripts.add(post.next());
              }
              repositoryModel.postReceiveScripts = postReceiveScripts;

              // custom fields
              repositoryModel.customFields = new LinkedHashMap<String, String>();
              for (int i = 0; i < customFieldsListView.size(); i++) {
                ListItem<String> child = (ListItem<String>) customFieldsListView.get(i);
                String key = child.getModelObject();

                TextField<String> field = (TextField<String>) child.get("customFieldValue");
                String value = field.getValue();

                repositoryModel.customFields.put(key, value);
              }

              // save the repository
              GitBlit.self().updateRepositoryModel(oldName, repositoryModel, isCreate);

              // repository access permissions
              if (repositoryModel.accessRestriction.exceeds(AccessRestrictionType.NONE)) {
                GitBlit.self().setUserAccessPermissions(repositoryModel, repositoryUsers);
                GitBlit.self().setTeamAccessPermissions(repositoryModel, repositoryTeams);
              }
            } catch (GitBlitException e) {
              error(e.getMessage());
              return;
            }
            setRedirect(false);
            setResponsePage(RepositoriesPage.class);
          }
        };

    // do not let the browser pre-populate these fields
    form.add(new SimpleAttributeModifier("autocomplete", "off"));

    // field names reflective match RepositoryModel fields
    form.add(new TextField<String>("name").setEnabled(allowEditName));
    form.add(new TextField<String>("description"));
    form.add(ownersPalette);
    form.add(
        new CheckBox("allowForks").setEnabled(GitBlit.getBoolean(Keys.web.allowForking, true)));
    DropDownChoice<AccessRestrictionType> accessRestriction =
        new DropDownChoice<AccessRestrictionType>(
            "accessRestriction",
            Arrays.asList(AccessRestrictionType.values()),
            new AccessRestrictionRenderer());
    form.add(accessRestriction);
    form.add(new CheckBox("isFrozen"));
    // TODO enable origin definition
    form.add(new TextField<String>("origin").setEnabled(false /* isCreate */));

    // allow relinking HEAD to a branch or tag other than master on edit repository
    List<String> availableRefs = new ArrayList<String>();
    if (!ArrayUtils.isEmpty(repositoryModel.availableRefs)) {
      availableRefs.addAll(repositoryModel.availableRefs);
    }
    form.add(
        new DropDownChoice<String>("HEAD", availableRefs).setEnabled(availableRefs.size() > 0));

    boolean gcEnabled = GitBlit.getBoolean(Keys.git.enableGarbageCollection, false);
    List<Integer> gcPeriods = Arrays.asList(1, 2, 3, 4, 5, 7, 10, 14);
    form.add(
        new DropDownChoice<Integer>("gcPeriod", gcPeriods, new GCPeriodRenderer())
            .setEnabled(gcEnabled));
    form.add(new TextField<String>("gcThreshold").setEnabled(gcEnabled));

    // federation strategies - remove ORIGIN choice if this repository has
    // no origin.
    List<FederationStrategy> federationStrategies =
        new ArrayList<FederationStrategy>(Arrays.asList(FederationStrategy.values()));
    if (StringUtils.isEmpty(repositoryModel.origin)) {
      federationStrategies.remove(FederationStrategy.FEDERATE_ORIGIN);
    }
    form.add(
        new DropDownChoice<FederationStrategy>(
            "federationStrategy", federationStrategies, new FederationTypeRenderer()));
    form.add(new CheckBox("useTickets"));
    form.add(new CheckBox("useDocs"));
    form.add(new CheckBox("useIncrementalPushTags"));
    form.add(new CheckBox("showRemoteBranches"));
    form.add(new CheckBox("showReadme"));
    form.add(new CheckBox("skipSizeCalculation"));
    form.add(new CheckBox("skipSummaryMetrics"));
    List<Integer> maxActivityCommits = Arrays.asList(-1, 0, 25, 50, 75, 100, 150, 200, 250, 500);
    form.add(
        new DropDownChoice<Integer>(
            "maxActivityCommits", maxActivityCommits, new MaxActivityCommitsRenderer()));

    metricAuthorExclusions =
        new Model<String>(
            ArrayUtils.isEmpty(repositoryModel.metricAuthorExclusions)
                ? ""
                : StringUtils.flattenStrings(repositoryModel.metricAuthorExclusions, " "));
    form.add(new TextField<String>("metricAuthorExclusions", metricAuthorExclusions));

    mailingLists =
        new Model<String>(
            ArrayUtils.isEmpty(repositoryModel.mailingLists)
                ? ""
                : StringUtils.flattenStrings(repositoryModel.mailingLists, " "));
    form.add(new TextField<String>("mailingLists", mailingLists));
    form.add(indexedBranchesPalette);

    List<AuthorizationControl> acList = Arrays.asList(AuthorizationControl.values());
    final RadioChoice<AuthorizationControl> authorizationControl =
        new RadioChoice<Constants.AuthorizationControl>(
            "authorizationControl", acList, new AuthorizationControlRenderer());
    form.add(authorizationControl);

    final CheckBox verifyCommitter = new CheckBox("verifyCommitter");
    verifyCommitter.setOutputMarkupId(true);
    form.add(verifyCommitter);

    form.add(usersPalette);
    form.add(teamsPalette);
    form.add(federationSetsPalette);
    form.add(preReceivePalette);
    form.add(
        new BulletListPanel(
            "inheritedPreReceive",
            getString("gb.inherited"),
            GitBlit.self().getPreReceiveScriptsInherited(repositoryModel)));
    form.add(postReceivePalette);
    form.add(
        new BulletListPanel(
            "inheritedPostReceive",
            getString("gb.inherited"),
            GitBlit.self().getPostReceiveScriptsInherited(repositoryModel)));

    WebMarkupContainer customFieldsSection = new WebMarkupContainer("customFieldsSection");
    customFieldsSection.add(customFieldsListView);
    form.add(
        customFieldsSection.setVisible(!GitBlit.getString(Keys.groovy.customFields, "").isEmpty()));

    // initial enable/disable of permission controls
    if (repositoryModel.accessRestriction.equals(AccessRestrictionType.NONE)) {
      // anonymous everything, disable all controls
      usersPalette.setEnabled(false);
      teamsPalette.setEnabled(false);
      authorizationControl.setEnabled(false);
      verifyCommitter.setEnabled(false);
    } else {
      // authenticated something
      // enable authorization controls
      authorizationControl.setEnabled(true);
      verifyCommitter.setEnabled(true);

      boolean allowFineGrainedControls =
          repositoryModel.authorizationControl.equals(AuthorizationControl.NAMED);
      usersPalette.setEnabled(allowFineGrainedControls);
      teamsPalette.setEnabled(allowFineGrainedControls);
    }

    accessRestriction.add(
        new AjaxFormComponentUpdatingBehavior("onchange") {

          private static final long serialVersionUID = 1L;

          protected void onUpdate(AjaxRequestTarget target) {
            // enable/disable permissions panel based on access restriction
            boolean allowAuthorizationControl =
                repositoryModel.accessRestriction.exceeds(AccessRestrictionType.NONE);
            authorizationControl.setEnabled(allowAuthorizationControl);
            verifyCommitter.setEnabled(allowAuthorizationControl);

            boolean allowFineGrainedControls =
                allowAuthorizationControl
                    && repositoryModel.authorizationControl.equals(AuthorizationControl.NAMED);
            usersPalette.setEnabled(allowFineGrainedControls);
            teamsPalette.setEnabled(allowFineGrainedControls);

            if (allowFineGrainedControls) {
              repositoryModel.authorizationControl = AuthorizationControl.NAMED;
            }

            target.addComponent(authorizationControl);
            target.addComponent(verifyCommitter);
            target.addComponent(usersPalette);
            target.addComponent(teamsPalette);
          }
        });

    authorizationControl.add(
        new AjaxFormChoiceComponentUpdatingBehavior() {

          private static final long serialVersionUID = 1L;

          protected void onUpdate(AjaxRequestTarget target) {
            // enable/disable permissions panel based on access restriction
            boolean allowAuthorizationControl =
                repositoryModel.accessRestriction.exceeds(AccessRestrictionType.NONE);
            authorizationControl.setEnabled(allowAuthorizationControl);

            boolean allowFineGrainedControls =
                allowAuthorizationControl
                    && repositoryModel.authorizationControl.equals(AuthorizationControl.NAMED);
            usersPalette.setEnabled(allowFineGrainedControls);
            teamsPalette.setEnabled(allowFineGrainedControls);

            if (allowFineGrainedControls) {
              repositoryModel.authorizationControl = AuthorizationControl.NAMED;
            }

            target.addComponent(authorizationControl);
            target.addComponent(usersPalette);
            target.addComponent(teamsPalette);
          }
        });

    form.add(new Button("save"));
    Button cancel =
        new Button("cancel") {
          private static final long serialVersionUID = 1L;

          @Override
          public void onSubmit() {
            setResponsePage(RepositoriesPage.class);
          }
        };
    cancel.setDefaultFormProcessing(false);
    form.add(cancel);

    add(form);
  }