package org.orienteer.core.component.command; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.model.IModel; import org.apache.wicket.util.string.Strings; import org.orienteer.core.component.BootstrapType; import org.orienteer.core.component.FAIconType; import org.orienteer.core.component.ICommandsSupportComponent; import org.orienteer.core.component.property.DisplayMode; import org.orienteer.core.component.structuretable.OrienteerStructureTable; import org.orienteer.core.component.structuretable.StructureTableCommandsToolbar; import com.orientechnologies.orient.core.db.document.ODatabaseDocument; import com.orientechnologies.orient.core.db.record.OIdentifiable; import com.orientechnologies.orient.core.id.ORID; 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 org.orienteer.core.web.ODocumentPage; 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} for {@link OrienteerStructureTable} to save {@link ODocument} */ public class SaveODocumentCommand extends AbstractSaveCommand<ODocument> implements ISecuredComponent { private static final long serialVersionUID = 1L; private boolean forceCommit = false; public SaveODocumentCommand( OrienteerStructureTable<ODocument, ?> structureTable, IModel<DisplayMode> displayModeModel) { this(structureTable, displayModeModel, structureTable.getModel()); } public SaveODocumentCommand( ICommandsSupportComponent<ODocument> component, IModel<DisplayMode> displayModeModel, IModel<ODocument> model) { super(component, displayModeModel, model); setIcon(FAIconType.save); setBootstrapType(BootstrapType.PRIMARY); } @Override public void onClick(AjaxRequestTarget target) { ODocument doc = getModelObject(); if(doc.getIdentity().isNew()) realizeMandatory(doc); doc.save(); if(forceCommit) { ODatabaseDocument db = getDatabase(); boolean active = db.getTransaction().isActive(); db.commit(); if(active) db.begin(); } super.onClick(target); } public static void realizeMandatory(ODocument doc) { OClass oClass = doc.getSchemaClass(); if(oClass!=null) { for(OProperty property : oClass.properties()) { if(property.isMandatory() && Strings.isEmpty(property.getDefaultValue()) && !doc.containsField(property.getName())) { doc.field(property.getName(), (Object) null); } } } } public boolean isForceCommit() { return forceCommit; } public SaveODocumentCommand setForceCommit(boolean forceCommit) { this.forceCommit = forceCommit; return this; } @Override public RequiredOrientResource[] getRequiredResources() { return getRequiredResources(getModelObject()); } public static RequiredOrientResource[] getRequiredResources(ODocument doc) { ORID orid = doc.getIdentity(); OrientPermission permission = orid.isNew()?OrientPermission.CREATE:OrientPermission.UPDATE; return OSecurityHelper.requireOClass(doc.getSchemaClass(), permission); } }