/************************************************************ * Copyright (c) 2010 paperlocator.org - all rights reserved. * * $Id$ * $Revision$ * $Author$ ***********************************************************/ package org.js.model.rbac; import java.util.LinkedList; import java.util.List; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.URIUtil; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.TreeIterator; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.workspace.util.WorkspaceSynchronizer; import org.js.model.feature.Attribute; import org.js.model.feature.Feature; import org.js.model.feature.FeatureModel; /** * @author <a href="mailto:julia.schroeter@tu-dresden.de">Julia Schroeter</a> * */ public final class RBACResolverUtil { public static final String delimiter = "."; public static final String select = "select"; public static final String deselect = "deselect"; public static final String set = "assign"; public static final String view = "view"; public static final String modify = "modify"; /** * find the feature identified by the given id in any feature model referenced by the given accesscontrol model; * * @return */ public static Feature findFeature(AccessControlModel model, String featureId) { Assert.isNotNull(featureId); Assert.isNotNull(model); Feature result = null; FeatureModel featureModel = model.getFeatureModel(); TreeIterator<Object> allContents = EcoreUtil.getAllContents(featureModel, true); while (allContents.hasNext()) { Object next = allContents.next(); if (next instanceof Feature) { Feature feature = (Feature) next; String refFeatureId = EcoreUtil.getID(feature); if (featureId.equals(refFeatureId)) { result = feature; break; } } } return result; } public static Attribute findAttribute(Feature feature, String attributeId) { Assert.isNotNull(feature); Assert.isNotNull(attributeId); Attribute result = null; EList<Attribute> attributes = feature.getAttributes(); for (Attribute attribute : attributes) { String attributeName = attribute.getName(); if (attributeId.equals(attributeName)) { result = attribute; break; } } return result; } /** * returns the permission according to the given identifier, which is in the form "select f1" or "set f1.a1". * * @param model * @param identifier * @return */ public static Permission findPermission(AccessControlModel model, String identifier) { Permission result = null; // List<Permission> permissions = new RBACService().getAllModelPermissions(model); // String keyword = getKeyword(identifier); // String objectId = getObjectIdentifier(keyword, identifier); // boolean isSelectFeature = isSelectFeature(keyword, objectId); // boolean isDeselectFeature = isDeselectFeature(keyword, objectId); // if (isSelectFeature || isDeselectFeature) { // for (Permission permission : permissions) { // if (permission instanceof FeatureOperation) { // FeatureOperation featureOp = (FeatureOperation) permission; // if (RbacHelper.isSelectFeatureOperation(featureOp) == isSelectFeature) { // String featureid = featureOp.getFeature().getId(); // if (objectId.equals(featureid)) { // result = permission; // break; // } // } // } // } // } else if (isSetAttribute(keyword, objectId)) { // String[] split = splitObjectId(delimiter, objectId); // for (Permission permission : permissions) { // if (permission instanceof AttributeOperation) { // AttributeOperation setAttribute = (AttributeOperation) permission; // String featureId = setAttribute.getFeature().getId(); // String attributeName = setAttribute.getAttribute().getName(); // if (split[0].equals(featureId) && split[1].equals(attributeName)) { // result = permission; // break; // } // } // } // } else { // boolean isViewElement = isViewElement(keyword); // if (isViewElement || isModifyElement(keyword)) { // for (Permission permission : permissions) { // if (permission instanceof VisibilityRestriction) { // VisibilityRestriction restriction = (VisibilityRestriction) permission; // if (RbacHelper.isViewElement(restriction) == isViewElement) { // String resourceId = restriction.getResourceId(); // if (objectId.equals(resourceId)) { // result = restriction; // break; // } // } // } // } // } // } return result; } public static String[] splitObjectId(String delimiter, String objectId) { int delimiterPosition = objectId.indexOf(delimiter); String objectFeatureId = objectId.substring(0, delimiterPosition); String objectAttributeId = objectId.substring(delimiterPosition + 1); List<String> objects = new LinkedList<String>(); objects.add(objectFeatureId); objects.add(objectAttributeId); return (String[]) objects.toArray(new String[objects.size()]); } public static boolean isAttributeReference(String objectId) { boolean isAttribute = false; if (objectId != null && objectId.contains(delimiter)) { int firstPosition = objectId.indexOf(delimiter); int lastPosition = objectId.lastIndexOf(delimiter); isAttribute = (firstPosition == lastPosition); } return isAttribute; } public static boolean isSelectFeature(String keyword, String objectId) { return (select.equals(keyword) && !isAttributeReference(objectId)); } public static boolean isModifyElement(String keyword, String objectId) { return (modify.equals(keyword)); } public static boolean isViewElement(String keyword) { return (view.equals(keyword)); } public static boolean isModifyElement(String keyword) { return (modify.equals(keyword)); } public static boolean isDeselectFeature(String keyword, String objectId) { return (deselect.equals(keyword) && !isAttributeReference(objectId)); } public static boolean isSetAttribute(String keyword, String objectId) { return (set.equals(keyword) && isAttributeReference(objectId)); } public static String getKeyword(String permissionId) { String keyword = null; if (permissionId != null) { permissionId = permissionId.trim(); if (permissionId.startsWith(select)) { keyword = select; } else if (permissionId.startsWith(deselect)) { keyword = deselect; } else if (permissionId.startsWith(set)) { keyword = set; } else if (permissionId.startsWith(view)) { keyword = view; } else if (permissionId.startsWith(modify)) { keyword = modify; } } return keyword; } public static String getObjectIdentifier(String keyword, String permissionId) { String text = permissionId; String lastSection = null; if (keyword != null && text != null) { text = text.trim(); int subStringLength = keyword.length() + 1; if (subStringLength < text.length()) { lastSection = text.substring(subStringLength); if (lastSection != null) { lastSection = lastSection.trim(); if (containsWhitespaceOnly(lastSection)) { lastSection = null; } } } } return lastSection; } private static boolean containsWhitespaceOnly(String text) { boolean onlySpace = true; char space = '\u0020'; char[] charArray = text.toCharArray(); for (char c : charArray) { if (c != space) { onlySpace = false; break; } } return onlySpace; } /** * find the relative uri for the given EObjects. * * @param objectToConvert * @param baseObject * @return */ public static String getRelativeURI(EObject objectToConvert, EObject baseObject) { String relative = null; if (objectToConvert != null && baseObject != null) { String fileName = getFileName(objectToConvert); // return relative uri java.net.URI objectToConvertUri = getContainerURI(objectToConvert.eResource()); java.net.URI baseObjectUri = getContainerURI(baseObject.eResource()); if (objectToConvertUri != null && baseObjectUri != null) { java.net.URI relativeUri = URIUtil.makeRelative(objectToConvertUri, baseObjectUri); relative = relativeUri.toString(); // add filename relative += "/" + fileName; } else if (objectToConvertUri == null && baseObjectUri == null) { return fileName; } } return relative; } private static String getFileName(EObject eObject) { String fileName = null; IFile file = getFile(eObject.eResource()); if (file != null) { fileName = file.getName(); } return fileName; } private static java.net.URI getContainerURI(Resource resource) { java.net.URI parent = null; IFile file = getFile(resource); if (file != null) { IContainer container = file.getParent(); if (container != null) { parent = container.getRawLocationURI(); } } return parent; } /** * get the ifile representation of a resource. * * @param modelResource * @return */ public static IFile getFile(Resource modelResource) { IFile file = WorkspaceSynchronizer.getFile(modelResource); return file; } public static String getPermissionIdentifier(Permission permission) { String identifier = null; if (permission instanceof FeatureOperation) { FeatureOperation featureOp = (FeatureOperation) permission; identifier = (RbacHelper.isSelectFeatureOperation(featureOp)) ? select : deselect; Feature feature = featureOp.getFeature(); identifier += " " + feature.getId(); } else if (permission instanceof AttributeOperation) { AttributeOperation attrOp = (AttributeOperation) permission; identifier = set + " " + attrOp.getFeature().getId() + delimiter + attrOp.getAttribute().getName(); } else if (permission instanceof AttributeValueOperation) { AttributeValueOperation dvOp = (AttributeValueOperation) permission; identifier = (RbacHelper.isSelectDomainValueOperation(dvOp)) ? select : deselect; identifier += " " + dvOp.getFeature().getId() + delimiter + dvOp.getAttribute().getName() + delimiter + dvOp.getValue(); } return identifier; } }