package org.orienteer.core.web; import com.google.common.base.Function; import com.google.common.collect.Ordering; import com.google.inject.Inject; import com.orientechnologies.orient.core.metadata.schema.OClass; import com.orientechnologies.orient.core.record.impl.ODocument; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.util.string.Strings; import org.orienteer.core.MountPath; import org.orienteer.core.component.TabsPanel; import org.orienteer.core.component.command.EditODocumentsCommand; import org.orienteer.core.component.command.SaveODocumentsCommand; import org.orienteer.core.component.property.DisplayMode; import org.orienteer.core.component.table.OrienteerDataTable; import org.orienteer.core.component.table.component.GenericTablePanel; import org.orienteer.core.service.IOClassIntrospector; import ru.ydn.wicket.wicketorientdb.model.OClassModel; import ru.ydn.wicket.wicketorientdb.model.OClassNamingModel; import ru.ydn.wicket.wicketorientdb.model.OQueryDataProvider; import java.util.List; /** * Page to search and display search results */ @MountPath("/search") public class SearchPage extends OrienteerBasePage<String> { public final static Ordering<OClass> CLASSES_ORDERING = Ordering.natural().nullsFirst().onResultOf(new Function<OClass, String>() { @Override public String apply(OClass input) { return new OClassNamingModel(input).getObject(); } }); private WebMarkupContainer resultsContainer; private IModel<OClass> selectedClassModel; @Inject private IOClassIntrospector oClassIntrospector; public SearchPage() { super(Model.of("")); } public SearchPage(IModel<String> model) { super(model); } public SearchPage(PageParameters parameters) { super(parameters); } @Override protected IModel<String> resolveByPageParameters( PageParameters pageParameters) { String query = pageParameters.get("q").toOptionalString(); return Model.of(query); } public List<OClass> getClasses() { return CLASSES_ORDERING.sortedCopy(getDatabase().getMetadata().getSchema().getClasses()); } @Override public void initialize() { super.initialize(); selectedClassModel = new OClassModel(getClasses().get(0)); Form<String> form = new Form<String>("form", getModel()); form.add(new TextField<String>("query", getModel())); form.add(new AjaxButton("search") { @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { super.onSubmit(target, form); target.add(resultsContainer); } }); form.add(new TabsPanel<OClass>("tabs", selectedClassModel, new PropertyModel<List<OClass>>(this, "classes")) { @Override public void onTabClick(AjaxRequestTarget target) { prepareResults(); target.add(resultsContainer); } }); resultsContainer = new WebMarkupContainer("resultsContainer") { { setOutputMarkupPlaceholderTag(true); } @Override protected void onConfigure() { super.onConfigure(); setVisible(!Strings.isEmpty(SearchPage.this.getModelObject())); } }; prepareResults(); form.add(resultsContainer); add(form); } private void prepareResults() { prepareResults(selectedClassModel.getObject()); } private void prepareResults(OClass oClass) { OQueryDataProvider<ODocument> provider = oClassIntrospector.getDataProviderForGenericSearch(oClass, getModel()); oClassIntrospector.defineDefaultSorting(provider, oClass); IModel<DisplayMode> modeModel = DisplayMode.VIEW.asModel(); GenericTablePanel<ODocument> tablePanel = new GenericTablePanel<ODocument>("results", oClassIntrospector.getColumnsFor(oClass, false, modeModel), provider, 20); OrienteerDataTable<ODocument, String> table = tablePanel.getDataTable(); table.addCommand(new EditODocumentsCommand(table, modeModel, oClass)); table.addCommand(new SaveODocumentsCommand(table, modeModel)); resultsContainer.addOrReplace(tablePanel); } @Override public IModel<String> getTitleModel() { return new ResourceModel("search.title"); } }