package org.orienteer.core.component.property; import java.util.List; import org.apache.wicket.Component; import org.apache.wicket.markup.html.form.FormComponentPanel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.LoadableDetachableModel; import org.orienteer.core.CustomAttribute; import org.orienteer.core.OrienteerWebApplication; import org.orienteer.core.component.meta.ODocumentMetaPanel; import org.orienteer.core.component.structuretable.OrienteerStructureTable; import org.orienteer.core.service.IOClassIntrospector; import com.google.common.base.Predicate; import com.orientechnologies.orient.core.metadata.schema.OClass; import com.orientechnologies.orient.core.metadata.schema.OProperty; import com.orientechnologies.orient.core.record.impl.ODocument; import ru.ydn.wicket.wicketorientdb.model.ODocumentModel; /** * Panel to show/edit some embedded document */ public class EmbeddedDocumentPanel extends FormComponentPanel<ODocument> { private IModel<OClass> classModel; private IModel<DisplayMode> modeModel; private IModel<ODocument> inputDocumentModel; public EmbeddedDocumentPanel(String id, IModel<ODocument> model, IModel<OClass> classModel, IModel<DisplayMode> modeModel) { super(id, model); this.classModel = classModel; this.modeModel = modeModel; this.inputDocumentModel = new ODocumentModel(); IModel<List<OProperty>> propertiesModel = new LoadableDetachableModel<List<OProperty>>() { @Override protected List<OProperty> load() { IOClassIntrospector oClassIntrospector = OrienteerWebApplication.get().getOClassIntrospector(); OClass linkedClass = EmbeddedDocumentPanel.this.classModel.getObject(); return oClassIntrospector.listProperties(linkedClass, new Predicate<OProperty>() { @Override public boolean apply(OProperty input) { return !((Boolean)CustomAttribute.HIDDEN.getValue(input)); } }); } }; add(new OrienteerStructureTable<ODocument, OProperty>("table", inputDocumentModel, propertiesModel) { @Override protected Component getValueComponent(String id, IModel rowModel) { return new ODocumentMetaPanel<>(id, EmbeddedDocumentPanel.this.modeModel, getModel(), rowModel); } }); } @Override protected void onBeforeRender() { ODocument currentDocument = getModelObject(); if(currentDocument==null) currentDocument = new ODocument(classModel.getObject()); inputDocumentModel.setObject(currentDocument); super.onBeforeRender(); } @Override public void convertInput() { setConvertedInput(inputDocumentModel.getObject()); } @Override public void detachModels() { super.detachModels(); if(classModel!=null) classModel.detach(); if(modeModel!=null) modeModel.detach(); inputDocumentModel.detach(); } }