package fr.openwide.maven.artifact.notifier.web.application.artifact.form;
import java.io.File;
import java.util.List;
import org.apache.commons.io.FileUtils;
import org.apache.wicket.Session;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.StatelessForm;
import org.apache.wicket.markup.html.form.SubmitLink;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.upload.FileUpload;
import org.apache.wicket.markup.html.form.upload.FileUploadField;
import org.apache.wicket.markup.html.navigation.paging.IPageable;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.model.util.ListModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import fr.openwide.core.spring.config.CoreConfigurer;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.autosize.AutosizeBehavior;
import fr.openwide.maven.artifact.notifier.core.business.search.model.PomBean;
import fr.openwide.maven.artifact.notifier.core.business.search.service.IMavenCentralSearchApiService;
public class ArtifactPomSearchPanel extends Panel {
private static final long serialVersionUID = 6273289257800090393L;
private static final Logger LOGGER = LoggerFactory.getLogger(ArtifactPomSearchPanel.class);
@SpringBean
private IMavenCentralSearchApiService mavenCentralSearchApiService;
@SpringBean
private CoreConfigurer configurer;
private IModel<List<FileUpload>> fileUploadsModel;
private IModel<String> pomContentModel;
private IModel<PomBean> pomBeanModel;
public ArtifactPomSearchPanel(String id, final List<IPageable> pageableList, final IModel<PomBean> pomBeanModel) {
super(id);
this.pomBeanModel = pomBeanModel;
this.fileUploadsModel = new ListModel<FileUpload>();
this.pomContentModel = Model.of();
// File select form
final FileUploadField fileSelect = new FileUploadField("fileSelectInput", this.fileUploadsModel);
Form<Void> fileSelectForm = new StatelessForm<Void>("fileSelectForm") {
private static final long serialVersionUID = 1L;
@Override
protected void onSubmit() {
File pomFile = null;
try {
FileUpload fileUpload = fileSelect.getFileUpload();
if (fileUpload == null) {
getSession().error(getString("artifact.follow.pom.error.noFile"));
return;
}
pomFile = File.createTempFile("uploaded-pom-", ".xml", configurer.getTmpDirectory());
fileUpload.writeTo(pomFile);
PomBean pomBean = mavenCentralSearchApiService.searchFromPom(pomFile);
ArtifactPomSearchPanel.this.pomBeanModel.setObject(pomBean);
ArtifactPomSearchPanel.this.pomContentModel.setObject(null);
} catch (Exception e) {
LOGGER.error("Unable to parse " + fileSelect.getFileUpload().getClientFileName() + " file", e);
Session.get().error(getString("artifact.follow.pom.error"));
} finally {
FileUtils.deleteQuietly(pomFile);
}
// Lors de la soumission d'un formulaire de recherche, on retourne sur la première page
for (IPageable pageable : pageableList) {
pageable.setCurrentPage(0);
}
}
};
fileSelectForm.add(fileSelect);
fileSelectForm.add(new SubmitLink("fileSelectSubmit"));
add(new Label("fileSelectLabel", new ResourceModel("artifact.follow.pom.search.file")));
add(fileSelectForm);
// File content form
Form<Void> fileContentForm = new StatelessForm<Void>("fileContentForm") {
private static final long serialVersionUID = 1L;
@Override
protected void onSubmit() {
if (ArtifactPomSearchPanel.this.pomContentModel.getObject() == null) {
getSession().error(getString("artifact.follow.pom.error.noContent"));
return;
}
try {
PomBean pomBean = mavenCentralSearchApiService.searchFromPom(ArtifactPomSearchPanel.this.pomContentModel.getObject());
ArtifactPomSearchPanel.this.pomBeanModel.setObject(pomBean);
} catch (Exception e) {
LOGGER.error("Unable to parse the pom content from the provided string", e);
Session.get().error(getString("artifact.follow.pom.error"));
}
// Lors de la soumission d'un formulaire de recherche, on retourne sur la première page
for (IPageable pageable : pageableList) {
pageable.setCurrentPage(0);
}
}
};
final TextArea<String> fileContent = new TextArea<String>("fileContentInput", this.pomContentModel);
fileContent.setOutputMarkupId(true);
fileContent.add(new AutosizeBehavior());
fileContentForm.add(fileContent);
fileContentForm.add(new SubmitLink("fileContentSubmit"));
add(new Label("fileContentLabel", new ResourceModel("artifact.follow.pom.search.content")));
add(fileContentForm);
}
@Override
protected void onDetach() {
super.onDetach();
if (fileUploadsModel != null) {
this.fileUploadsModel.detach();
}
if (pomContentModel != null) {
this.pomContentModel.detach();
}
if (pomBeanModel != null) {
this.pomBeanModel.detach();
}
}
}