package fr.openwide.maven.artifact.notifier.web.application.artifact.component;
import org.apache.wicket.markup.html.link.ExternalLink;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import fr.openwide.core.wicket.markup.html.basic.HideableExternalLink;
import fr.openwide.core.wicket.markup.html.panel.GenericPanel;
import fr.openwide.core.wicket.more.model.BindingModel;
import fr.openwide.maven.artifact.notifier.core.business.artifact.model.ArtifactVersion;
import fr.openwide.maven.artifact.notifier.core.business.artifact.service.IArtifactService;
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.common.model.EitherModel;
public class ArtifactVersionLinksPanel extends GenericPanel<ArtifactVersion> {
private static final long serialVersionUID = 6624055534980328744L;
@SpringBean
private IMavenCentralSearchUrlService mavenCentralSearchUrlService;
@SpringBean
private IArtifactService artifactService;
public ArtifactVersionLinksPanel(String id, IModel<? extends ArtifactVersion> model) {
super(id, model);
// Changelog link
IModel<String> versionChangelogUrlModel = new ArtifactVersionAdditionalInformationModel<String>(
BindingModel.of(getModel(), Binding.artifactVersion().additionalInformation().changelogUrl().url()),
BindingModel.of(getModel(), Binding.artifactVersion().projectVersion().additionalInformation().changelogUrl().url()));
IModel<String> changelogUrlModel = new ArtifactVersionAdditionalInformationModel<String>(
versionChangelogUrlModel,
BindingModel.of(getModel(), Binding.artifactVersion().projectVersion().project().additionalInformation().changelogUrl().url()));
add(new HideableExternalLink("changelogLink", changelogUrlModel));
// Release notes link
IModel<String> releaseNotesUrlModel = new ArtifactVersionAdditionalInformationModel<String>(
BindingModel.of(getModel(), Binding.artifactVersion().additionalInformation().releaseNotesUrl().url()),
BindingModel.of(getModel(), Binding.artifactVersion().projectVersion().additionalInformation().releaseNotesUrl().url()));
add(new HideableExternalLink("releaseNotesLink", releaseNotesUrlModel));
// Announce link
IModel<String> announceUrlModel = new ArtifactVersionAdditionalInformationModel<String>(
BindingModel.of(getModel(), Binding.artifactVersion().additionalInformation().announceUrl().url()),
BindingModel.of(getModel(), Binding.artifactVersion().projectVersion().additionalInformation().announceUrl().url()));
add(new HideableExternalLink("announceLink", announceUrlModel));
// Maven central link
add(new ExternalLink("mavenCentralLink", new LoadableDetachableModel<String>() {
private static final long serialVersionUID = 1L;
@Override
protected String load() {
ArtifactVersion artifactVersion = getModelObject();
return artifactVersion != null ? mavenCentralSearchUrlService.getVersionUrl(artifactVersion) : null;
}
}));
}
private class ArtifactVersionAdditionalInformationModel<T> extends EitherModel<T> {
private static final long serialVersionUID = 8116743900640164832L;
private IModel<? extends T> artifactVersionAdditionalInformationModel;
public ArtifactVersionAdditionalInformationModel(IModel<? extends T> artifactVersionAdditionalInformationModel,
IModel<? extends T> projectVersionAdditionalInformationModel) {
super(artifactVersionAdditionalInformationModel, projectVersionAdditionalInformationModel);
this.artifactVersionAdditionalInformationModel = artifactVersionAdditionalInformationModel;
}
@Override
protected boolean shouldGetFirstModel() {
ArtifactVersion artifactVersion = ArtifactVersionLinksPanel.this.getModelObject();
return artifactVersion != null ? !artifactService.hasProject(artifactVersion.getArtifact()) ||
artifactVersionAdditionalInformationModel.getObject() != null : true;
}
}
}