/* * ModeShape (http://www.modeshape.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.modeshape.web.client.contents; import com.smartgwt.client.types.Alignment; import com.smartgwt.client.types.VerticalAlignment; import com.smartgwt.client.util.BooleanCallback; import com.smartgwt.client.util.SC; import com.smartgwt.client.widgets.Label; import com.smartgwt.client.widgets.events.ClickEvent; import com.smartgwt.client.widgets.events.ClickHandler; import com.smartgwt.client.widgets.form.DynamicForm; import com.smartgwt.client.widgets.form.fields.ComboBoxItem; import com.smartgwt.client.widgets.layout.HLayout; import java.util.ArrayList; import org.modeshape.web.client.contents.PermissionsEditor.AclRecord; import org.modeshape.web.client.grid.BooleanField; import org.modeshape.web.client.grid.TabGrid; import org.modeshape.web.shared.Align; import org.modeshape.web.shared.Columns; import org.modeshape.web.shared.JcrNode; import org.modeshape.web.shared.JcrPermission; import org.modeshape.web.shared.Policy; /** * Permissions editor. * * @author kulikov */ public class PermissionsEditor extends TabGrid<AclRecord, JcrPermission> { private final Policy ALL_PERMISSIONS_FOR_EVERYONE = new Policy(); //header hight in pixels private final static int HEADER_HEIGHT = 30; protected final Contents contents; private JcrNode node; private ComboBoxItem principal; protected AddPolicyDialog addPolicyDialog; /** * Creates new Editor. * * @param contents */ public PermissionsEditor(Contents contents) { super(""); this.contents = contents; for (JcrPermission p : ALL_PERMISSIONS_FOR_EVERYONE.permissions()) { p.setStatus(true); } addPolicyDialog = new AddPolicyDialog(contents); } /** * Displays permissions for the given node. * * @param node */ public void show(JcrNode node) { this.node = node; if (node.getAcl() == null) { this.displayDisabledEditor(); } else if (this.isAclDefined(node)) { this.selectFirstPrincipalAndDisplayPermissions(node); } else { this.displayEveryonePermissions(); } } @Override protected AclRecord[] records() { int n = new Policy().permissions().size(); AclRecord[] records = new AclRecord[n]; for (int i = 0; i < n; i++) { records[i] = new AclRecord(); } return records; } @Override protected HLayout tableHeader() { HLayout layout = new HLayout(); layout.setHeight(30); layout.setWidth100(); layout.setBackgroundColor("#e6f1f6"); Label name = new Label("<b>Permission</b>"); name.setWidth100(); Label type = new Label("<b>Status</b>"); type.setWidth(50); layout.addMember(name); layout.addMember(type); return layout; } @Override protected HLayout toolBar() { Columns layout = new Columns(Align.LEFT, Align.CENTER); layout.setBackgroundColor("#ffffff"); layout.setHeight(HEADER_HEIGHT); layout.setWidth100(); //prepare form for the principal combobox DynamicForm form = new DynamicForm(); form.setWidth100(); //put into layout layout.addMember(form); //prepare combobox for principal selection principal = new ComboBoxItem("Principal"); principal.setWidth("100%"); //append on form form.setItems(principal); //buttons Label addPrincipalButton = new Label(); addPrincipalButton.setStyleName("button-label"); addPrincipalButton.setWidth(16); addPrincipalButton.setHeight(16); addPrincipalButton.setIcon("icons/group_blue_add.png"); addPrincipalButton.setTooltip("Add new principal name"); addPrincipalButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { addPrincipal(); } }); layout.addMember(addPrincipalButton); Label delPrincipalButton = new Label(); delPrincipalButton.setStyleName("button-label"); delPrincipalButton.setWidth(16); delPrincipalButton.setHeight(16); delPrincipalButton.setIcon("icons/group_blue_remove.png"); delPrincipalButton.setTooltip("Delete this principal"); delPrincipalButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { delPrincipal(); } }); layout.addMember(delPrincipalButton); return layout; } private void addPrincipal() { addPolicyDialog.showModal(); } private void delPrincipal() { SC.ask("Do you want to delete principal " + principal.getValueAsString(), new BooleanCallback() { @Override public void execute(Boolean status) { if (status) { contents.removeAccessList(principal.getValueAsString()); } } }); } @SuppressWarnings("synthetic-access") @Override protected void updateRecord(int pos, AclRecord record, JcrPermission value) { record.name.setContents(value.getDisplayName()); record.value.setValue(value.getStatus()); record.permission = value; } private boolean isAclDefined(JcrNode node) { return !(node.getAcl() == null || node.getAcl().principals().length == 0); } private void displayEveryonePermissions() { principal.setValueMap(new String[]{"Everyone"}); principal.setValue("Everyone"); principal.setDisabled(false); setValues(ALL_PERMISSIONS_FOR_EVERYONE.permissions()); } private void displayDisabledEditor() { principal.setValueMap(new String[]{"Permission denied"}); principal.setValue("Permission denied"); principal.setDisabled(true); setValues(new ArrayList()); } private void selectFirstPrincipalAndDisplayPermissions(JcrNode node) { String[] principals = node.getAcl().principals(); principal.setValueMap(principals); principal.setValue(principals[0]); principal.setDisabled(false); setValues(node.getAcl().getPolicy(principals[0]).permissions()); } @SuppressWarnings("synthetic-access") public class AclRecord extends HLayout { private JcrPermission permission; private Label name = new Label(); private BooleanField value = new BooleanField(); public AclRecord() { super(); setStyleName("grid"); setHeight(30); setWidth100(); setDefaultLayoutAlign(VerticalAlignment.CENTER); setDefaultLayoutAlign(Alignment.LEFT); setLayoutAlign(VerticalAlignment.CENTER); setLayoutAlign(Alignment.CENTER); setAlign(VerticalAlignment.CENTER); setAlign(Alignment.LEFT); name.setIcon("icons/shield.png"); name.setStyleName("text"); name.setWidth100(); value.setWidth(50); value.setStyleName("button-label"); value.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { changePermission(); } }); addMember(name); addMember(value); } private void changePermission() { //this is everyone "principal"? if (node.getAcl() == null) { return; } permission.setStatus(!permission.getStatus()); contents.updateAccessList(principal.getValueAsString(), permission, permission.getStatus()); } } }