package org.orienteer.core.component.widget.oclass;
import com.orientechnologies.orient.core.metadata.schema.OClass;
import com.orientechnologies.orient.core.metadata.security.ORole;
import com.orientechnologies.orient.core.metadata.security.ORule;
import com.orientechnologies.orient.core.record.impl.ODocument;
import org.apache.wicket.Component;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.model.AbstractCheckBoxModel;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.ResourceModel;
import org.orienteer.core.behavior.UpdateOnActionPerformedEventBehavior;
import org.orienteer.core.component.FAIcon;
import org.orienteer.core.component.FAIconType;
import org.orienteer.core.component.command.AbstractSaveCommand;
import org.orienteer.core.component.command.Command;
import org.orienteer.core.component.property.BooleanEditPanel;
import org.orienteer.core.component.property.LinkViewPanel;
import org.orienteer.core.component.table.OrienteerDataTable;
import org.orienteer.core.component.table.component.GenericTablePanel;
import org.orienteer.core.widget.AbstractWidget;
import org.orienteer.core.widget.Widget;
import ru.ydn.wicket.wicketorientdb.OrientDbWebSession;
import ru.ydn.wicket.wicketorientdb.behavior.DisableIfPrototypeBehavior;
import ru.ydn.wicket.wicketorientdb.model.EnumNamingModel;
import ru.ydn.wicket.wicketorientdb.model.OClassNamingModel;
import ru.ydn.wicket.wicketorientdb.model.OQueryDataProvider;
import ru.ydn.wicket.wicketorientdb.security.OSecurityHelper;
import ru.ydn.wicket.wicketorientdb.security.OrientPermission;
import java.util.ArrayList;
import java.util.List;
/**
* Widget to show and modify security settings of a {@link OClass}
*/
@Widget(id="class-security", domain="class", tab="security", order=30, autoEnable=true)
public class OClassSecurityWidget extends AbstractWidget<OClass> {
private class SecurityRightsColumn extends AbstractColumn<ORole, String>
{
private final OrientPermission permission;
public SecurityRightsColumn(OrientPermission permission)
{
super(new EnumNamingModel<OrientPermission>(permission));
this.permission = permission;
}
@Override
public void populateItem(Item<ICellPopulator<ORole>> cellItem,
String componentId, IModel<ORole> rowModel) {
cellItem.add(new BooleanEditPanel(componentId, getSecurityRightsModel(rowModel)));
}
protected IModel<Boolean> getSecurityRightsModel(final IModel<ORole> rowModel)
{
return new AbstractCheckBoxModel() {
@Override
public void unselect() {
ORole oRole = rowModel.getObject();
oRole.revoke(ORule.ResourceGeneric.CLASS, getSecurityResourceSpecific(), permission.getPermissionFlag());
oRole.revoke(ORule.ResourceGeneric.CLUSTER, getSecurityResourceSpecific(), permission.getPermissionFlag());
oRole.save();
}
@Override
public void select() {
ORole oRole = rowModel.getObject();
oRole.grant(ORule.ResourceGeneric.CLASS, getSecurityResourceSpecific(), permission.getPermissionFlag());
oRole.grant(ORule.ResourceGeneric.CLUSTER, getSecurityResourceSpecific(), permission.getPermissionFlag());
oRole.save();
}
@Override
public boolean isSelected() {
ORole oRole = rowModel.getObject();
return oRole.allow(ORule.ResourceGeneric.CLASS, getSecurityResourceSpecific(), permission.getPermissionFlag());
}
private String getSecurityResourceSpecific()
{
return OClassSecurityWidget.this.getModelObject().getName();
}
};
}
}
public OClassSecurityWidget(String id, IModel<OClass> model,
IModel<ODocument> widgetDocumentModel) {
super(id, model, widgetDocumentModel);
List<IColumn<ORole, String>> sColumns = new ArrayList<IColumn<ORole,String>>();
OClass oRoleClass = OrientDbWebSession.get().getDatabase().getMetadata().getSchema().getClass("ORole");
sColumns.add(new AbstractColumn<ORole, String>(new OClassNamingModel(oRoleClass), "name") {
@Override
public void populateItem(Item<ICellPopulator<ORole>> cellItem,
String componentId, IModel<ORole> rowModel) {
cellItem.add(new LinkViewPanel(componentId, new PropertyModel<ODocument>(rowModel, "document")));
}
});
sColumns.add(new SecurityRightsColumn(OrientPermission.CREATE));
sColumns.add(new SecurityRightsColumn(OrientPermission.READ));
sColumns.add(new SecurityRightsColumn(OrientPermission.UPDATE));
sColumns.add(new SecurityRightsColumn(OrientPermission.DELETE));
OQueryDataProvider<ORole> sProvider = new OQueryDataProvider<ORole>("select from ORole", ORole.class);
sProvider.setSort("name", SortOrder.ASCENDING);
GenericTablePanel<ORole> tablePanel = new GenericTablePanel<ORole>("tablePanel", sColumns, sProvider ,20);
OSecurityHelper.secureComponent(tablePanel, OSecurityHelper.requireOClass("ORole", Component.ENABLE, OrientPermission.UPDATE));
OrienteerDataTable<ORole, String> sTable = tablePanel.getDataTable();
Command<ORole> saveCommand = new AbstractSaveCommand<ORole>(sTable, null);
sTable.addCommand(saveCommand);
sTable.setCaptionModel(new ResourceModel("class.security"));
add(tablePanel);
add(DisableIfPrototypeBehavior.INSTANCE, UpdateOnActionPerformedEventBehavior.INSTANCE_ALL_CONTINUE);
}
@Override
protected FAIcon newIcon(String id) {
return new FAIcon(id, FAIconType.shield);
}
@Override
protected IModel<String> getDefaultTitleModel() {
return new ResourceModel("class.security");
}
@Override
protected String getWidgetStyleClass() {
return "strict";
}
}