package fr.openwide.maven.artifact.notifier.web.application.project.component;
import java.util.Set;
import org.apache.wicket.Session;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.Button;
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.LoadableDetachableModel;
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 org.wicketstuff.wiquery.core.events.MouseEvent;
import fr.openwide.core.wicket.markup.html.basic.HideableExternalLink;
import fr.openwide.core.wicket.markup.html.panel.GenericPanel;
import fr.openwide.core.wicket.more.markup.html.basic.DateLabel;
import fr.openwide.core.wicket.more.markup.html.feedback.FeedbackUtils;
import fr.openwide.core.wicket.more.markup.html.form.FormPanelMode;
import fr.openwide.core.wicket.more.markup.html.image.BooleanIcon;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.confirm.component.AjaxConfirmLink;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.bootstrap.modal.behavior.AjaxModalOpenBehavior;
import fr.openwide.core.wicket.more.model.BindingModel;
import fr.openwide.core.wicket.more.model.CollectionToListWrapperModel;
import fr.openwide.core.wicket.more.util.DatePattern;
import fr.openwide.maven.artifact.notifier.core.business.project.model.Project;
import fr.openwide.maven.artifact.notifier.core.business.project.model.ProjectVersion;
import fr.openwide.maven.artifact.notifier.core.business.project.model.ProjectVersionStatus;
import fr.openwide.maven.artifact.notifier.core.business.project.service.IProjectService;
import fr.openwide.maven.artifact.notifier.core.business.search.service.IMavenCentralSearchUrlService;
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.ArtifactVersionTagPanel;
import fr.openwide.maven.artifact.notifier.web.application.common.component.AuthenticatedOnlyButton;
import fr.openwide.maven.artifact.notifier.web.application.project.form.ProjectVersionFormPopupPanel;
public class ProjectDescriptionPanel extends GenericPanel<Project> {
private static final long serialVersionUID = 7757299234352613717L;
private static final Logger LOGGER = LoggerFactory.getLogger(ProjectDescriptionPanel.class);
@SpringBean
private IMavenCentralSearchUrlService mavenCentralSearchUrlService;
@SpringBean
private IProjectService projectService;
private ProjectVersionFormPopupPanel projectVersionAddPopup;
private ProjectVersionFormPopupPanel projectVersionEditPopup;
public ProjectDescriptionPanel(String id, IModel<? extends Project> projectModel) {
super(id, projectModel);
// Project version popups
projectVersionAddPopup = new ProjectVersionFormPopupPanel("projectVersionAddPopup", FormPanelMode.ADD) {
private static final long serialVersionUID = 1L;
@Override
protected Project getProject() {
return ProjectDescriptionPanel.this.getModelObject();
}
};
add(projectVersionAddPopup);
projectVersionEditPopup = new ProjectVersionFormPopupPanel("projectVersionEditPopup", FormPanelMode.EDIT);
add(projectVersionEditPopup);
// Add action
Button addButton = new AuthenticatedOnlyButton("add") {
private static final long serialVersionUID = 1L;
@Override
protected void onConfigure() {
super.onConfigure();
setVisible(MavenArtifactNotifierSession.get().hasRoleAdmin());
}
};
addButton.add(new AjaxModalOpenBehavior(projectVersionAddPopup, MouseEvent.CLICK));
add(addButton);
// Versions
IModel<Set<ProjectVersion>> setModel = BindingModel.of(getModel(), Binding.project().versions());
add(new ListView<ProjectVersion>("projectVersions", CollectionToListWrapperModel.of(setModel)) {
private static final long serialVersionUID = 1L;
@Override
protected void populateItem(final ListItem<ProjectVersion> item) {
item.add(new ArtifactVersionTagPanel("version", BindingModel.of(item.getModel(), Binding.projectVersion().version())));
item.add(new DateLabel("lastUpdateDate", BindingModel.of(item.getModel(), Binding.projectVersion().lastUpdateDate()),
DatePattern.SHORT_DATE));
// Changelog link
item.add(new HideableExternalLink("changelogLink",
BindingModel.of(item.getModel(), Binding.projectVersion().additionalInformation().changelogUrl().url())));
// Release notes link
item.add(new HideableExternalLink("releaseNotesLink",
BindingModel.of(item.getModel(), Binding.projectVersion().additionalInformation().releaseNotesUrl().url())));
// Announce link
item.add(new HideableExternalLink("announceLink",
BindingModel.of(item.getModel(), Binding.projectVersion().additionalInformation().announceUrl().url())));
// Status
item.add(new BooleanIcon("centralAvailability", new LoadableDetachableModel<Boolean>() {
private static final long serialVersionUID = 1L;
@Override
protected Boolean load() {
IModel<ProjectVersionStatus> statusModel = BindingModel.of(item.getModel(), Binding.projectVersion().status());
return ProjectVersionStatus.PUBLISHED_ON_MAVEN_CENTRAL.equals(statusModel.getObject());
}
}));
// Edit action
Button editButton = new AuthenticatedOnlyButton("edit");
editButton.add(new AjaxModalOpenBehavior(projectVersionEditPopup, MouseEvent.CLICK) {
private static final long serialVersionUID = 1L;
@Override
protected void onShow(AjaxRequestTarget target) {
super.onShow(target);
projectVersionEditPopup.getModel().setObject(item.getModelObject());
}
});
item.add(editButton);
// Delete action
IModel<String> confirmationTextModel = new StringResourceModel("project.version.delete.confirmation.text", item.getModel());
item.add(new AjaxConfirmLink<ProjectVersion>("delete", item.getModel(),
new ResourceModel("project.version.delete.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 = ProjectDescriptionPanel.this.getModelObject();
ProjectVersion projectVersion = getModelObject();
projectService.deleteProjectVersion(project, projectVersion);
Session.get().success(getString("project.version.delete.success"));
} catch (Exception e) {
LOGGER.error("Error occured while removing artifact", e);
Session.get().error(getString("project.version.delete.error"));
}
target.add(getPage());
FeedbackUtils.refreshFeedback(target, getPage());
}
@Override
protected void onConfigure() {
super.onConfigure();
setVisible(MavenArtifactNotifierSession.get().hasRoleAdmin());
}
});
}
@Override
protected void onConfigure() {
super.onConfigure();
setVisible(!getModelObject().isEmpty());
}
});
add(new WebMarkupContainer("emptyList") {
private static final long serialVersionUID = 1L;
@Override
public void onConfigure() {
super.onConfigure();
setVisible(getModelObject().getVersions().isEmpty());
}
});
}
}