package org.orienteer.core.component.command; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.model.IModel; 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.table.OrienteerDataTable; import ru.ydn.wicket.wicketorientdb.proto.IPrototype; 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 com.orientechnologies.orient.core.index.OIndex; import com.orientechnologies.orient.core.metadata.schema.OClass; import com.orientechnologies.orient.core.metadata.schema.OProperty; import com.orientechnologies.orient.core.metadata.security.ODatabaseSecurityResources; import com.orientechnologies.orient.core.metadata.security.ORule; /** * {@link Command} to save a schema specific entities: {@link OClass}, {@link OProperty}, {@link OIndex} * * @param <T> the type of an entity to which this command can be applied */ public class SaveSchemaCommand<T> extends SavePrototypeCommand<T> implements ISecuredComponent { public SaveSchemaCommand(ICommandsSupportComponent<T> component, IModel<DisplayMode> displayModeModel, IModel<T> model) { super(component, displayModeModel, model); } public SaveSchemaCommand(ICommandsSupportComponent<T> component, IModel<DisplayMode> displayModeModel) { super(component, displayModeModel); } @Override public void onClick(AjaxRequestTarget target) { boolean isActiveTransaction = getDatabase().getTransaction().isActive(); if(isActiveTransaction) getDatabase().commit(); // Schema changes should be done outside of transaction try { super.onClick(target); getDatabase().getMetadata().reload(); } finally { if(isActiveTransaction) getDatabase().begin(); } } @Override public RequiredOrientResource[] getRequiredResources() { T object = getModelObject(); if(object!=null) { OrientPermission permission = (object instanceof IPrototype<?>)?OrientPermission.CREATE:OrientPermission.UPDATE; return new RequiredOrientResource[] { OSecurityHelper.requireResource(ORule.ResourceGeneric.SCHEMA, null, permission)[0], OSecurityHelper.requireResource(ORule.ResourceGeneric.CLUSTER, "internal", permission)[0] }; } else { return new RequiredOrientResource[0]; } } }