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 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.SelectDialogPanel;
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.security.ISecuredComponent;
import ru.ydn.wicket.wicketorientdb.security.OSecurityHelper;
import ru.ydn.wicket.wicketorientdb.security.OrientPermission;
import ru.ydn.wicket.wicketorientdb.security.RequiredOrientResource;
import java.util.List;
/**
* {@link Command} to create graph edge between {@link ODocument}s.
*/
public class CreateEdgeCommand extends AbstractModalWindowCommand<ODocument> implements ISecuredComponent {
private IModel<OClass> classModel;
private IModel<ODocument> documentModel;
public CreateEdgeCommand(OrienteerDataTable<ODocument, ?> table, IModel<ODocument> documentIModel) {
this(new ResourceModel("command.link"),table,documentIModel);
}
public CreateEdgeCommand(IModel<?> labelModel,OrienteerDataTable<ODocument, ?> table, IModel<ODocument> documentIModel) {
super(labelModel, table);
setBootstrapType(BootstrapType.SUCCESS);
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.edge.class"));
modal.setAutoSize(true);
modal.setMinimalWidth(300);
SelectSubOClassDialogPage selectEdgeClassDialog = new SelectSubOClassDialogPage(modal, new OClassModel(GraphModule.EDGE_CLASS_NAME)) {
@Override
protected void onSelect(AjaxRequestTarget target, final OClass selectedOClass) {
modal.setTitle(new ResourceModel("dialog.select.vertices"));
OClassModel vertexOClassModel = new OClassModel(GraphModule.VERTEX_CLASS_NAME);
modal.setContent(new SelectDialogPanel(modal.getContentId(), modal, vertexOClassModel, true) {
@Override
protected boolean onSelect(AjaxRequestTarget target, List<ODocument> objects, boolean selectMore) {
createEdge(objects, selectedOClass);
modal.setWindowClosedCallback(new ModalWindow.WindowClosedCallback()
{
private static final long serialVersionUID = 1L;
@Override
public void onClose(AjaxRequestTarget target)
{
target.add(getPage());
}
});
return true;
}
});
modal.show(target);
}
};
modal.setContent(selectEdgeClassDialog);
}
@Override
public RequiredOrientResource[] getRequiredResources() {
return OSecurityHelper.requireOClass(classModel.getObject(), OrientPermission.CREATE);
}
private void createEdge(List<ODocument> documents, OClass edgeClass) {
OrientGraph tx = null;
try {
tx = new OrientGraphFactory(getDatabase().getURL()).getTx();
for (ODocument createTo : documents) {
tx.addEdge(null, tx.getVertex(documentModel.getObject().getIdentity()), tx.getVertex(createTo.getIdentity()), edgeClass.getName());
}
}
finally {
if (tx != null)
tx.shutdown();
}
}
}