/* * Copyright (C) 2007-2012 Argeo GmbH * * 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.argeo.cms.ui.workbench.internal.jcr.parts; import java.util.ArrayList; import java.util.List; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.RepositoryException; import javax.jcr.Value; import org.argeo.cms.ui.workbench.WorkbenchUiPlugin; import org.argeo.eclipse.ui.EclipseUiException; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.editor.FormEditor; import org.eclipse.ui.forms.editor.FormPage; import org.eclipse.ui.forms.widgets.ScrolledForm; /** * Display and edit a given node privilege. For the time being it is completely * JackRabbit specific (and hard coded for this) and will display an empty page * if using any other implementation */ public class NodePrivilegesPage extends FormPage { private Node context; private TableViewer viewer; public NodePrivilegesPage(FormEditor editor, String title, Node context) { super(editor, "NodePrivilegesPage", title); this.context = context; } protected void createFormContent(IManagedForm managedForm) { ScrolledForm form = managedForm.getForm(); form.setText(WorkbenchUiPlugin.getMessage("nodeRightsManagementPageTitle")); FillLayout layout = new FillLayout(); layout.marginHeight = 5; layout.marginWidth = 5; form.getBody().setLayout(layout); if (isJackRabbit()) createRightsPart(form.getBody()); } /** Creates the authorization part */ protected void createRightsPart(Composite parent) { Table table = new Table(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); table.setLinesVisible(true); table.setHeaderVisible(true); viewer = new TableViewer(table); // Group / user name TableViewerColumn column = createTableViewerColumn(viewer, "User/Group Name", 280); column.setLabelProvider(new ColumnLabelProvider() { private static final long serialVersionUID = -2290781173498395973L; public String getText(Object element) { Node node = (Node) element; try { if (node.hasProperty("rep:principalName")) return node.getProperty("rep:principalName").getString(); } catch (RepositoryException e) { throw new EclipseUiException("Unable to retrieve " + "principal name on " + node, e); } return ""; } public Image getImage(Object element) { return null; } }); // Privileges column = createTableViewerColumn(viewer, "Assigned privileges", 300); column.setLabelProvider(new ColumnLabelProvider() { private static final long serialVersionUID = -2290781173498395973L; private String propertyName = "rep:privileges"; public String getText(Object element) { Node node = (Node) element; try { if (node.hasProperty(propertyName)) { String separator = ", "; Value[] langs = node.getProperty(propertyName).getValues(); StringBuilder builder = new StringBuilder(); for (Value val : langs) { String currStr = val.getString(); builder.append(currStr).append(separator); } if (builder.lastIndexOf(separator) >= 0) return builder.substring(0, builder.length() - separator.length()); else return builder.toString(); } } catch (RepositoryException e) { throw new EclipseUiException("Unable to retrieve " + "privileges on " + node, e); } return ""; } public Image getImage(Object element) { return null; } }); // Relevant node column = createTableViewerColumn(viewer, "Relevant node", 300); column.setLabelProvider(new ColumnLabelProvider() { private static final long serialVersionUID = 4245522992038244849L; public String getText(Object element) { Node node = (Node) element; try { return node.getParent().getParent().getPath(); } catch (RepositoryException e) { throw new EclipseUiException("Unable get path for " + node, e); } } public Image getImage(Object element) { return null; } }); viewer.setContentProvider(new RightsContentProvider()); viewer.setInput(getEditorSite()); } protected TableViewerColumn createTableViewerColumn(TableViewer viewer, String title, int bound) { TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE); TableColumn column = viewerColumn.getColumn(); column.setText(title); column.setWidth(bound); column.setResizable(true); column.setMoveable(true); return viewerColumn; } private class RightsContentProvider implements IStructuredContentProvider { private static final long serialVersionUID = -7631476348552802706L; public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } // TODO JackRabbit specific retrieval of authorization. Clean and // generalize public Object[] getElements(Object inputElement) { try { List privs = new ArrayList(); Node currNode = context; String currPath = currNode.getPath(); loop: while (true) { if (currNode.hasNode("rep:policy")) { NodeIterator nit = currNode.getNode("rep:policy").getNodes(); while (nit.hasNext()) { Node currPrivNode = nit.nextNode(); if (currPrivNode.getName().startsWith("allow")) privs.add(currPrivNode); } } if ("/".equals(currPath)) break loop; else { currNode = currNode.getParent(); currPath = currNode.getPath(); } } // AccessControlManager acm = context.getSession() // .getAccessControlManager(); // AccessControlPolicyIterator acpi = acm // .getApplicablePolicies(context.getPath()); // // List acps = new // ArrayList(); // try { // while (true) { // Object obj = acpi.next(); // acps.add((AccessControlPolicy) obj); // } // } catch (Exception e) { // // No more elements // } // // AccessControlList acl = ((AccessControlList) acps.get(0)); // AccessControlEntry[] entries = acl.getAccessControlEntries(); return privs.toArray(); } catch (Exception e) { throw new EclipseUiException("Cannot retrieve authorization for " + context, e); } } } /** * Simply checks if we are using jackrabbit without adding code dependencies */ private boolean isJackRabbit() { try { String cname = context.getSession().getClass().getName(); return cname.startsWith("org.apache.jackrabbit"); } catch (RepositoryException e) { throw new EclipseUiException("Cannot check JCR implementation used on " + context, e); } } }