package fr.openwide.core.wicket.more.console.maintenance.search.page;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.SubmitLink;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.link.Link;
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.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.Sets;
import fr.openwide.core.jpa.business.generic.model.GenericEntity;
import fr.openwide.core.jpa.search.service.IHibernateSearchService;
import fr.openwide.core.spring.util.StringUtils;
import fr.openwide.core.wicket.more.console.common.component.JavaClassesListMultipleChoice;
import fr.openwide.core.wicket.more.console.maintenance.template.ConsoleMaintenanceTemplate;
import fr.openwide.core.wicket.more.console.template.ConsoleTemplate;
import fr.openwide.core.wicket.more.markup.html.template.js.jquery.plugins.autosize.AutosizeBehavior;
public class ConsoleMaintenanceSearchPage extends ConsoleMaintenanceTemplate {
private static final long serialVersionUID = 2718354274888156322L;
private static final Logger LOGGER = LoggerFactory.getLogger(ConsoleMaintenanceSearchPage.class);
@SpringBean(name="hibernateSearchService")
protected IHibernateSearchService hibernateSearchService;
public ConsoleMaintenanceSearchPage(PageParameters parameters) {
super(parameters);
addHeadPageTitleKey("console.maintenance.search");
// Réindexation complète
add(new Link<Void>("reindexContentLink") {
private static final long serialVersionUID = 1L;
@Override
public void onClick() {
try {
hibernateSearchService.reindexAll();
getSession().success(getString("console.maintenance.search.reindex.success"));
} catch(Exception e) {
LOGGER.error("console.maintenance.search.reindex.failure", e);
getSession().error(getString("console.maintenance.search.reindex.failure"));
}
setResponsePage(ConsoleMaintenanceSearchPage.class);
}
});
// Réindexation partielle
Form<?> reindexClassesForm = new Form<Void>("reindexClassesForm");
add(reindexClassesForm);
try {
final IModel<List<Class<?>>> classesModel = new ListModel<Class<?>>(new ArrayList<Class<?>>());
JavaClassesListMultipleChoice classesChoice = new JavaClassesListMultipleChoice("classes", classesModel,
hibernateSearchService.getIndexedRootEntities());
classesChoice.setLabel(new ResourceModel("console.maintenance.search.reindex.partial.form.classes"));
classesChoice.setRequired(true);
reindexClassesForm.add(classesChoice);
final TextArea<String> idsTextArea = new TextArea<String>("ids", new Model<String>(""));
idsTextArea.setLabel(new ResourceModel("console.maintenance.search.reindex.partial.form.ids"));
idsTextArea.add(new AttributeModifier("placeholder",
new ResourceModel("console.maintenance.search.reindex.partial.form.ids.placeholder")));
idsTextArea.add(new AutosizeBehavior());
reindexClassesForm.add(idsTextArea);
reindexClassesForm.add(new SubmitLink("reindexClassesLink", reindexClassesForm) {
private static final long serialVersionUID = 6601566553381397066L;
@SuppressWarnings("unchecked")
@Override
public void onSubmit() {
try {
Set<Long> entityIds = Sets.newHashSet();
for (String entityIdString : StringUtils.splitAsList(
StringUtils.normalizeNewLines(idsTextArea.getModelObject()),
StringUtils.NEW_LINE_ANTISLASH_N)) {
if (StringUtils.hasText(entityIdString)) {
try {
entityIds.add(Long.parseLong(StringUtils.trimWhitespace(entityIdString)));
} catch (NumberFormatException e) {
// On ignore les id saisis qui ne sont pas numériques
}
}
}
if (entityIds.isEmpty()) {
hibernateSearchService.reindexClasses(classesModel.getObject());
} else {
for (Class<?> clazz : classesModel.getObject()) {
for (Long entityId : entityIds) {
try {
hibernateSearchService.reindexEntity((Class<GenericEntity<Long, ?>>) clazz, entityId);
} catch (IllegalArgumentException e) {
// On ignore les classes qui ne sont pas des GenericEntity.
}
}
}
}
classesModel.getObject().clear();
idsTextArea.setModelObject("");
getSession().success(getString("console.maintenance.search.reindex.success"));
} catch (Exception e) {
LOGGER.error("Erreur lors la réindexation d'entités", e);
getSession().error(getString("console.maintenance.search.reindex.failure"));
}
}
});
} catch (Exception e) {
LOGGER.error("Erreur lors de la récupération de la liste des classes indexées", e);
getSession().error(getString("console.maintenance.search.reindex.partial.error.getClasses"));
reindexClassesForm.setVisible(false);
}
}
@Override
protected Class<? extends ConsoleTemplate> getMenuItemPageClass() {
return ConsoleMaintenanceSearchPage.class;
}
}