Package fr.openwide.maven.artifact.notifier.web.application.project.component

Source Code of fr.openwide.maven.artifact.notifier.web.application.project.component.ProjectArtifactsPanel$ProjectArtifactSelect2AjaxAdapter

package fr.openwide.maven.artifact.notifier.web.application.project.component;

import java.util.List;
import java.util.Set;

import org.apache.wicket.Session;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.markup.html.form.StatelessForm;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.collect.Lists;

import fr.openwide.core.jpa.exception.ServiceException;
import fr.openwide.core.wicket.markup.html.panel.GenericPanel;
import fr.openwide.core.wicket.more.markup.html.feedback.FeedbackUtils;
import fr.openwide.core.wicket.more.markup.html.form.LabelPlaceholderBehavior;
import fr.openwide.core.wicket.more.markup.html.select2.AbstractLongIdGenericEntitySelect2AjaxAdapter;
import fr.openwide.core.wicket.more.markup.html.select2.util.DropDownChoiceWidth;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.confirm.component.AjaxConfirmLink;
import fr.openwide.core.wicket.more.model.BindingModel;
import fr.openwide.core.wicket.more.model.CollectionToListWrapperModel;
import fr.openwide.core.wicket.more.model.GenericEntityModel;
import fr.openwide.core.wicket.more.model.ReadOnlyModel;
import fr.openwide.maven.artifact.notifier.core.business.artifact.model.Artifact;
import fr.openwide.maven.artifact.notifier.core.business.artifact.service.IArtifactService;
import fr.openwide.maven.artifact.notifier.core.business.project.model.Project;
import fr.openwide.maven.artifact.notifier.core.business.project.service.IProjectService;
import fr.openwide.maven.artifact.notifier.core.business.user.service.IUserService;
import fr.openwide.maven.artifact.notifier.core.util.binding.Binding;
import fr.openwide.maven.artifact.notifier.web.application.MavenArtifactNotifierSession;
import fr.openwide.maven.artifact.notifier.web.application.artifact.component.ArtifactDropDownChoice;
import fr.openwide.maven.artifact.notifier.web.application.artifact.component.ArtifactFollowActionsPanel;
import fr.openwide.maven.artifact.notifier.web.application.artifact.page.ArtifactDescriptionPage;
import fr.openwide.maven.artifact.notifier.web.application.common.behavior.AuthenticatedOnlyBehavior;

public class ProjectArtifactsPanel extends GenericPanel<Project> {

  private static final long serialVersionUID = 4341748125123497634L;

  private static final Logger LOGGER = LoggerFactory.getLogger(ProjectArtifactsPanel.class);

  @SpringBean
  private IProjectService projectService;
 
  @SpringBean
  private IUserService userService;

  private ListView<Artifact> artifactListView;

  public ProjectArtifactsPanel(String id, IModel<Project> projectModel) {
    super(id, projectModel);
   
    // Artifacts list
    IModel<Set<Artifact>> setModel = BindingModel.of(getModel(), Binding.project().artifacts());
    artifactListView = new ListView<Artifact>("artifacts", CollectionToListWrapperModel.of(setModel)) {
      private static final long serialVersionUID = 1L;
     
      @Override
      protected void populateItem(final ListItem<Artifact> item) {
        item.setOutputMarkupId(true);
       
        Link<Void> artifactLink = ArtifactDescriptionPage
            .linkDescriptor(ReadOnlyModel.of(item.getModelObject()))
            .link("artifactLink");
        artifactLink.add(new Label("id", new StringResourceModel("project.description.artifacts.artifact", item.getModel())));
        item.add(artifactLink);
       
        // Follow actions
        item.add(new ArtifactFollowActionsPanel("followActions", item.getModel()));
       
        // Remove link
        IModel<String> confirmationTextModel = new StringResourceModel("project.description.artifacts.remove.confirmation.text", item.getModel());
        item.add(new AjaxConfirmLink<Artifact>("removeLink", item.getModel(),
            new ResourceModel("project.description.artifacts.remove.confirmation.title"),
            confirmationTextModel,
            new ResourceModel("common.confirm"),
            new ResourceModel("common.cancel"), null, false) {
          private static final long serialVersionUID = 1L;

          @Override
          public void onClick(AjaxRequestTarget target) {
            try {
              Project project = ProjectArtifactsPanel.this.getModelObject();
              Artifact artifact = getModelObject();
             
              projectService.removeArtifact(project, artifact);
              Session.get().success(getString("project.description.artifacts.remove.success"));
            } catch (Exception e) {
              LOGGER.error("Error occured while removing artifact", e);
              Session.get().error(getString("project.description.artifacts.remove.error"));
            }
            target.add(getPage());
            FeedbackUtils.refreshFeedback(target, getPage());
          }
         
          @Override
          protected void onConfigure() {
            super.onConfigure();
            setVisible(MavenArtifactNotifierSession.get().hasRoleAdmin());
          }
        }.add(new AuthenticatedOnlyBehavior()));
      }
    };
    add(artifactListView);
   
    add(new WebMarkupContainer("emptyList") {
      private static final long serialVersionUID = 6700720373087584498L;

      @Override
      public void onConfigure() {
        super.onConfigure();
        setVisible(artifactListView.size() <= 0);
      }
    });
   
    // Add artifact form
    IModel<Artifact> emptyArtifactModel = new GenericEntityModel<Long, Artifact>(null);
   
    final ArtifactDropDownChoice artifactDropDown = new ArtifactDropDownChoice("artifact", emptyArtifactModel,
        new ProjectArtifactSelect2AjaxAdapter(ArtifactDropDownChoice.CHOICE_RENDERER));
    artifactDropDown.setWidth(DropDownChoiceWidth.NORMAL);
    artifactDropDown.setRequired(true);
    artifactDropDown.setLabel(new ResourceModel("project.description.artifacts.chooseOne"));
    artifactDropDown.add(new LabelPlaceholderBehavior());
    artifactDropDown.add(new AuthenticatedOnlyBehavior());
   
    final Form<Artifact> addArtifactForm = new StatelessForm<Artifact>("addArtifactForm", emptyArtifactModel) {
      private static final long serialVersionUID = 1L;

      @Override
      protected void onConfigure() {
        super.onConfigure();
        setVisible(MavenArtifactNotifierSession.get().hasRoleAdmin());
      }
    };
    addArtifactForm.add(artifactDropDown);
    addArtifactForm.add(new AjaxSubmitLink("addArtifactLink", addArtifactForm) {
      private static final long serialVersionUID = 1L;

      @Override
      protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
        Project project = ProjectArtifactsPanel.this.getModelObject();
        Artifact selectedArtifact = artifactDropDown.getModelObject();
       
        if (selectedArtifact != null) {
          if (selectedArtifact.getProject() == null) {
            try {
              projectService.addArtifact(project, selectedArtifact);
              getSession().success(getString("project.description.artifacts.add.success"));
            } catch (Exception e) {
              LOGGER.error("Unknown error occured while adding an artifact to a project", e);
              getSession().error(getString("project.description.artifacts.add.error"));
            }
          } else {
            LOGGER.error("Artifact already added to a project");
            getSession().warn(getString("project.description.artifacts.add.alreadyHasProject"));
          }
        }
        artifactDropDown.setModelObject(null);
        target.add(getPage());
        FeedbackUtils.refreshFeedback(target, getPage());
      }
     
      @Override
      protected void onError(AjaxRequestTarget target, Form<?> form) {
        FeedbackUtils.refreshFeedback(target, getPage());
      }
     
      @Override
      protected void onConfigure() {
        super.onConfigure();
        setVisible(MavenArtifactNotifierSession.get().hasRoleAdmin());
      }
    });
    addArtifactForm.add(new AuthenticatedOnlyBehavior());
    add(addArtifactForm);
  }
 
  private class ProjectArtifactSelect2AjaxAdapter extends AbstractLongIdGenericEntitySelect2AjaxAdapter<Artifact> {

    private static final long serialVersionUID = -8852109526432427612L;
   
    @SpringBean
    private IArtifactService artifactService;

    public ProjectArtifactSelect2AjaxAdapter(IChoiceRenderer<Artifact> choiceRenderer) {
      super(Artifact.class, choiceRenderer);
    }

    @Override
    public List<Artifact> getChoices(int start, int count, String term) {
      try {
        return artifactService.searchAutocompleteWithoutProject(term, count, start);
      } catch (ServiceException e) {
        LOGGER.error("Error while searching for artifacts");
        return Lists.newArrayListWithExpectedSize(0);
      }
    }
  }
}
TOP

Related Classes of fr.openwide.maven.artifact.notifier.web.application.project.component.ProjectArtifactsPanel$ProjectArtifactSelect2AjaxAdapter

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.