package org.orienteer.graph.component.command;
import com.orientechnologies.orient.core.metadata.schema.OClass;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.tinkerpop.blueprints.impls.orient.OrientGraph;
import com.tinkerpop.blueprints.impls.orient.OrientGraphFactory;
import com.tinkerpop.blueprints.impls.orient.OrientVertex;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.ResourceModel;
import org.orienteer.core.component.BootstrapType;
import org.orienteer.core.component.FAIconType;
import org.orienteer.core.component.command.AbstractModalWindowCommand;
import org.orienteer.core.component.command.Command;
import org.orienteer.core.component.command.modal.SelectSubOClassDialogPage;
import org.orienteer.core.component.property.DisplayMode;
import org.orienteer.core.component.table.OrienteerDataTable;
import org.orienteer.core.web.ODocumentPage;
import org.orienteer.graph.module.GraphModule;
import ru.ydn.wicket.wicketorientdb.model.OClassModel;
import ru.ydn.wicket.wicketorientdb.model.ODocumentModel;
import ru.ydn.wicket.wicketorientdb.security.ISecuredComponent;
import ru.ydn.wicket.wicketorientdb.security.OSecurityHelper;
import ru.ydn.wicket.wicketorientdb.security.OrientPermission;
import ru.ydn.wicket.wicketorientdb.security.RequiredOrientResource;
/**
* {@link Command} to create neighbour vertex
*/
public class CreateVertexCommand extends AbstractModalWindowCommand<ODocument> implements ISecuredComponent {
private IModel<OClass> classModel;
private IModel<ODocument> documentModel;
public CreateVertexCommand(OrienteerDataTable<ODocument, ?> table, IModel<ODocument> documentIModel) {
super(new ResourceModel("command.create"), table);
setBootstrapType(BootstrapType.PRIMARY);
setIcon(FAIconType.plus);
setAutoNotify(false);
this.classModel = new OClassModel(GraphModule.VERTEX_CLASS_NAME);
this.documentModel = documentIModel;
}
@Override
protected void initializeContent(final ModalWindow modal) {
modal.setTitle(new ResourceModel("dialog.select.vertex.class"));
modal.setAutoSize(true);
modal.setMinimalWidth(300);
SelectSubOClassDialogPage selectVertexClassDialog = new SelectSubOClassDialogPage(modal, new OClassModel(GraphModule.VERTEX_CLASS_NAME)) {
@Override
protected void onSelect(AjaxRequestTarget target, final OClass selectedOVertexClass) {
modal.setTitle(new ResourceModel("dialog.select.edge.class"));
OClassModel edgeOClassModel = new OClassModel(GraphModule.EDGE_CLASS_NAME);
modal.setContent(new SelectSubOClassDialogPage(modal, edgeOClassModel) {
@Override
protected void onSelect(AjaxRequestTarget target, final OClass selectedOEdgeClass) {
createVertex(selectedOVertexClass, selectedOEdgeClass);
modal.setWindowClosedCallback(new ModalWindow.WindowClosedCallback()
{
private static final long serialVersionUID = 1L;
@Override
public void onClose(AjaxRequestTarget target)
{
setResponsePage(new ODocumentPage(new ODocumentModel(documentModel.getObject())).setModeObject(DisplayMode.VIEW));
//target.add(getPage());
}
});
}
});
modal.show(target);
}
};
modal.setContent(selectVertexClassDialog);
}
@Override
public RequiredOrientResource[] getRequiredResources() {
return OSecurityHelper.requireOClass(classModel.getObject(), OrientPermission.CREATE);
}
private void createVertex(OClass vertexClass, OClass edgeClass) {
OrientGraph tx = new OrientGraphFactory(getDatabase().getURL()).getTx();
OrientVertex newVertex = tx.addVertex(vertexClass.getName(), (String) null);
OrientVertex vertex = tx.getVertex(documentModel.getObject().getIdentity());
tx.addEdge(null, vertex, newVertex, edgeClass.getName());
}
}