diff options
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.security/src')
20 files changed, 226 insertions, 127 deletions
diff --git a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/Directory.java b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/Directory.java index 011deb9440..bddd41d7d5 100644 --- a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/Directory.java +++ b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/Directory.java @@ -35,6 +35,21 @@ import org.eclipse.emf.common.util.EList; public interface Directory extends SecurityItem, SecurityItemContainer { /** + * @since 4.3 + */ + public static final String ROLES = "Roles"; + + /** + * @since 4.3 + */ + public static final String GROUPS = "Groups"; + + /** + * @since 4.3 + */ + public static final String USERS = "Users"; + + /** * Returns the value of the '<em><b>Items</b></em>' containment reference list. * The list contents are of type {@link org.eclipse.emf.cdo.security.SecurityItem}. * <!-- begin-user-doc --> diff --git a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/Group.java b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/Group.java index 09d295b23e..6a7b674cf0 100644 --- a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/Group.java +++ b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/Group.java @@ -38,6 +38,11 @@ import org.eclipse.emf.common.util.EList; public interface Group extends Assignee { /** + * @since 4.3 + */ + public static final String ADMINISTRATORS = "Administrators"; + + /** * Returns the value of the '<em><b>Users</b></em>' reference list. * The list contents are of type {@link org.eclipse.emf.cdo.security.User}. * It is bidirectional and its opposite is '{@link org.eclipse.emf.cdo.security.User#getGroups <em>Groups</em>}'. diff --git a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/PermissionFilter.java b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/PermissionFilter.java index 7fddda83c4..abc7c8122a 100644 --- a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/PermissionFilter.java +++ b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/PermissionFilter.java @@ -14,6 +14,7 @@ import org.eclipse.emf.cdo.CDOObject; import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.common.revision.CDORevisionProvider; +import org.eclipse.emf.cdo.security.impl.PermissionImpl.CommitImpactContext; /** * <!-- begin-user-doc --> @@ -32,6 +33,8 @@ public interface PermissionFilter extends CDOObject boolean isApplicable(CDORevision revision, CDORevisionProvider revisionProvider, CDOBranchPoint securityContext, int level) throws Exception; + boolean isImpacted(CommitImpactContext context); + String format(); } // PermissionFilter diff --git a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/Role.java b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/Role.java index 8043046ae4..7f14079d72 100644 --- a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/Role.java +++ b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/Role.java @@ -35,6 +35,31 @@ import org.eclipse.emf.common.util.EList; public interface Role extends SecurityItem { /** + * @since 4.3 + */ + public static final String ADMINISTRATION = "Administration"; + + /** + * @since 4.3 + */ + public static final String RESOURCE_TREE_WRITER = "Resource Tree Writer"; + + /** + * @since 4.3 + */ + public static final String RESOURCE_TREE_READER = "Resource Tree Reader"; + + /** + * @since 4.3 + */ + public static final String ALL_OBJECTS_WRITER = "All Objects Writer"; + + /** + * @since 4.3 + */ + public static final String ALL_OBJECTS_READER = "All Objects Reader"; + + /** * Returns the value of the '<em><b>Assignees</b></em>' reference list. * The list contents are of type {@link org.eclipse.emf.cdo.security.Assignee}. * It is bidirectional and its opposite is '{@link org.eclipse.emf.cdo.security.Assignee#getRoles <em>Roles</em>}'. diff --git a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/User.java b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/User.java index 221815d0aa..0361c9148d 100644 --- a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/User.java +++ b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/User.java @@ -45,6 +45,11 @@ import org.eclipse.emf.common.util.EList; public interface User extends Assignee { /** + * @since 4.3 + */ + public static final String ADMINISTRATOR = "Administrator"; + + /** * Returns the value of the '<em><b>Groups</b></em>' reference list. * The list contents are of type {@link org.eclipse.emf.cdo.security.Group}. * It is bidirectional and its opposite is '{@link org.eclipse.emf.cdo.security.Group#getUsers <em>Users</em>}'. diff --git a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/ClassFilterImpl.java b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/ClassFilterImpl.java index e0503fbded..6ee35dba51 100644 --- a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/ClassFilterImpl.java +++ b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/ClassFilterImpl.java @@ -15,6 +15,7 @@ import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.common.revision.CDORevisionProvider; import org.eclipse.emf.cdo.security.ClassFilter; import org.eclipse.emf.cdo.security.SecurityPackage; +import org.eclipse.emf.cdo.security.impl.PermissionImpl.CommitImpactContext; import org.eclipse.emf.ecore.EClass; @@ -111,6 +112,11 @@ public class ClassFilterImpl extends PermissionFilterImpl implements ClassFilter return applicableClass == actualClass; } + public boolean isImpacted(CommitImpactContext context) + { + return false; + } + public String format() { String label = "?"; diff --git a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/ClassPermissionImpl.java b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/ClassPermissionImpl.java index d115cb6d8a..3383a00258 100644 --- a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/ClassPermissionImpl.java +++ b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/ClassPermissionImpl.java @@ -82,4 +82,10 @@ public class ClassPermissionImpl extends PermissionImpl implements ClassPermissi return actualClass == applicableClass; } + @Override + public boolean isImpacted(CommitImpactContext context) + { + return false; + } + } // ClassPermissionImpl diff --git a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/CombinedFilterImpl.java b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/CombinedFilterImpl.java index 0a88182114..840c595588 100644 --- a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/CombinedFilterImpl.java +++ b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/CombinedFilterImpl.java @@ -13,6 +13,7 @@ package org.eclipse.emf.cdo.security.impl; import org.eclipse.emf.cdo.security.CombinedFilter; import org.eclipse.emf.cdo.security.PermissionFilter; import org.eclipse.emf.cdo.security.SecurityPackage; +import org.eclipse.emf.cdo.security.impl.PermissionImpl.CommitImpactContext; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EClass; @@ -67,6 +68,19 @@ public abstract class CombinedFilterImpl extends PermissionFilterImpl implements return (EList<PermissionFilter>)eGet(SecurityPackage.Literals.COMBINED_FILTER__OPERANDS, true); } + public boolean isImpacted(CommitImpactContext context) + { + for (PermissionFilter operand : getOperands()) + { + if (operand.isImpacted(context)) + { + return true; + } + } + + return false; + } + public String format() { StringBuilder builder = new StringBuilder(); diff --git a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/CachedList.java b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/DerivedList.java index 4b9aa265b3..14df3b5f97 100644 --- a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/CachedList.java +++ b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/DerivedList.java @@ -17,7 +17,6 @@ import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.util.EcoreEList; import org.eclipse.emf.ecore.util.InternalEList; -import java.lang.ref.SoftReference; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; @@ -28,30 +27,18 @@ import java.util.Set; /** * @author Eike Stepper */ -abstract class CachedList<E extends EObject> implements InternalEList<E>, EStructuralFeature.Setting +abstract class DerivedList<E extends EObject> implements InternalEList<E>, EStructuralFeature.Setting { - private SoftReference<Object[]> cache; - - protected CachedList() + protected DerivedList() { } private InternalEList<E> getList() { - Object[] data = null; - if (cache != null) - { - data = cache.get(); - } - - if (data == null) - { - data = getData(); - cache = new SoftReference<Object[]>(data); - } - InternalEObject owner = getOwner(); EStructuralFeature feature = getFeature(); + Object[] data = getData(); + return new EcoreEList.UnmodifiableEList.FastCompare<E>(owner, feature, data.length, data); } @@ -321,7 +308,7 @@ abstract class CachedList<E extends EObject> implements InternalEList<E>, EStruc /** * @author Eike Stepper */ - static abstract class RecursionSafe<E extends EObject, O extends EObject> extends CachedList<E> + static abstract class RecursionSafe<E extends EObject, O extends EObject> extends DerivedList<E> { protected RecursionSafe() { diff --git a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/ExpressionFilterImpl.java b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/ExpressionFilterImpl.java index db7bda9a84..9701fa2776 100644 --- a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/ExpressionFilterImpl.java +++ b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/ExpressionFilterImpl.java @@ -17,6 +17,7 @@ import org.eclipse.emf.cdo.expressions.Expression; import org.eclipse.emf.cdo.expressions.impl.EvaluationContextImpl; import org.eclipse.emf.cdo.security.ExpressionFilter; import org.eclipse.emf.cdo.security.SecurityPackage; +import org.eclipse.emf.cdo.security.impl.PermissionImpl.CommitImpactContext; import org.eclipse.emf.ecore.EClass; @@ -86,6 +87,12 @@ public class ExpressionFilterImpl extends ObjectFilterImpl implements Expression return (Boolean)expression.evaluate(evaluationContext); } + public boolean isImpacted(CommitImpactContext context) + { + // TODO Implement impact analysis in the expression model + return true; + } + public String format() { Expression expression = getExpression(); diff --git a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/FilterPermissionImpl.java b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/FilterPermissionImpl.java index f526a6ad88..ba81320db1 100644 --- a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/FilterPermissionImpl.java +++ b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/FilterPermissionImpl.java @@ -103,4 +103,18 @@ public class FilterPermissionImpl extends PermissionImpl implements FilterPermis return true; } + @Override + public boolean isImpacted(CommitImpactContext context) + { + for (PermissionFilter filter : getFilters()) + { + if (filter.isImpacted(context)) + { + return true; + } + } + + return false; + } + } // FilterPermissionImpl diff --git a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/GroupImpl.java b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/GroupImpl.java index 961e050b8f..3d6f3ad4fd 100644 --- a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/GroupImpl.java +++ b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/GroupImpl.java @@ -42,7 +42,7 @@ import java.util.Set; */ public class GroupImpl extends AssigneeImpl implements Group { - private EList<Group> allInheritedGroups = new CachedList.RecursionSafe<Group, Group>() + private EList<Group> allInheritedGroups = new DerivedList.RecursionSafe<Group, Group>() { @Override protected InternalEObject getOwner() @@ -71,7 +71,7 @@ public class GroupImpl extends AssigneeImpl implements Group } }; - private EList<Group> allInheritingGroups = new CachedList.RecursionSafe<Group, Group>() + private EList<Group> allInheritingGroups = new DerivedList.RecursionSafe<Group, Group>() { @Override protected InternalEObject getOwner() @@ -100,7 +100,7 @@ public class GroupImpl extends AssigneeImpl implements Group } }; - private EList<Role> allRoles = new CachedList.RecursionSafe<Role, Group>() + private EList<Role> allRoles = new DerivedList.RecursionSafe<Role, Group>() { @Override protected InternalEObject getOwner() diff --git a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/LinkedFilterImpl.java b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/LinkedFilterImpl.java index 79168e6ca1..2f5d1cb2f3 100644 --- a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/LinkedFilterImpl.java +++ b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/LinkedFilterImpl.java @@ -16,6 +16,7 @@ import org.eclipse.emf.cdo.common.revision.CDORevisionProvider; import org.eclipse.emf.cdo.security.LinkedFilter; import org.eclipse.emf.cdo.security.PermissionFilter; import org.eclipse.emf.cdo.security.SecurityPackage; +import org.eclipse.emf.cdo.security.impl.PermissionImpl.CommitImpactContext; import org.eclipse.emf.ecore.EClass; @@ -80,7 +81,14 @@ public class LinkedFilterImpl extends PermissionFilterImpl implements LinkedFilt protected boolean filter(CDORevision revision, CDORevisionProvider revisionProvider, CDOBranchPoint securityContext, int level) throws Exception { - return getFilter().isApplicable(revision, revisionProvider, securityContext, level + 1); + PermissionFilter filter = getFilter(); + return filter.isApplicable(revision, revisionProvider, securityContext, level + 1); + } + + public boolean isImpacted(CommitImpactContext context) + { + PermissionFilter filter = getFilter(); + return filter.isImpacted(context); } public String format() diff --git a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/PackageFilterImpl.java b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/PackageFilterImpl.java index e709786507..5426c53e63 100644 --- a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/PackageFilterImpl.java +++ b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/PackageFilterImpl.java @@ -15,6 +15,7 @@ import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.common.revision.CDORevisionProvider; import org.eclipse.emf.cdo.security.PackageFilter; import org.eclipse.emf.cdo.security.SecurityPackage; +import org.eclipse.emf.cdo.security.impl.PermissionImpl.CommitImpactContext; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EPackage; @@ -85,6 +86,11 @@ public class PackageFilterImpl extends PermissionFilterImpl implements PackageFi return actualPackage == applicablePackage; } + public boolean isImpacted(CommitImpactContext context) + { + return false; + } + public String format() { String label = "?"; diff --git a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/PackagePermissionImpl.java b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/PackagePermissionImpl.java index 5cb2053909..e8ade3f45b 100644 --- a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/PackagePermissionImpl.java +++ b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/PackagePermissionImpl.java @@ -83,4 +83,10 @@ public class PackagePermissionImpl extends PermissionImpl implements PackagePerm return actualPackage == applicablePackage; } + @Override + public boolean isImpacted(CommitImpactContext context) + { + return false; + } + } // PackagePermissionImpl diff --git a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/PermissionImpl.java b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/PermissionImpl.java index 28a8585dce..17d28faf4b 100644 --- a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/PermissionImpl.java +++ b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/PermissionImpl.java @@ -10,6 +10,9 @@ */ package org.eclipse.emf.cdo.security.impl; +import org.eclipse.emf.cdo.common.id.CDOID; +import org.eclipse.emf.cdo.common.revision.CDORevision; +import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta; import org.eclipse.emf.cdo.internal.security.PermissionUtil; import org.eclipse.emf.cdo.security.Access; import org.eclipse.emf.cdo.security.Permission; @@ -115,4 +118,50 @@ public abstract class PermissionImpl extends CDOObjectImpl implements Permission { return PermissionUtil.getUser(); } + + /** + * Should be overridden in subclasses to do proper impact analysis! + * + * @since 4.3 + */ + public boolean isImpacted(CommitImpactContext context) + { + return true; + } + + /** + * @author Eike Stepper + * @since 4.3 + */ + public interface CommitImpactContext + { + /** + * Returns the revisions of the new objects of the current commit. + * <p> + * Read only! + */ + public CDORevision[] getNewObjects(); + + /** + * Returns the revisions of the changed objects of the current commit. + * <p> + * Read only! + */ + public CDORevision[] getDirtyObjects(); + + /** + * Returns the revision deltas of the changed objects of the current commit. + * <p> + * Read only! + */ + public CDORevisionDelta[] getDirtyObjectDeltas(); + + /** + * Returns the CDOIDs of the detached objects of the current commit. + * <p> + * Read only! + */ + public CDOID[] getDetachedObjects(); + } + } // PermissionImpl diff --git a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/RealmImpl.java b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/RealmImpl.java index 162dae5728..ab97b36e88 100644 --- a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/RealmImpl.java +++ b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/RealmImpl.java @@ -54,7 +54,7 @@ import org.eclipse.emf.ecore.InternalEObject; */ public class RealmImpl extends SecurityElementImpl implements Realm { - private EList<User> allUsers = new CachedList<User>() + private EList<User> allUsers = new DerivedList<User>() { @Override protected InternalEObject getOwner() @@ -76,7 +76,7 @@ public class RealmImpl extends SecurityElementImpl implements Realm } }; - private EList<Group> allGroups = new CachedList<Group>() + private EList<Group> allGroups = new DerivedList<Group>() { @Override protected InternalEObject getOwner() @@ -98,7 +98,7 @@ public class RealmImpl extends SecurityElementImpl implements Realm } }; - private EList<Role> allRoles = new CachedList<Role>() + private EList<Role> allRoles = new DerivedList<Role>() { @Override protected InternalEObject getOwner() @@ -120,7 +120,7 @@ public class RealmImpl extends SecurityElementImpl implements Realm } }; - private EList<Permission> allPermissions = new CachedList<Permission>() + private EList<Permission> allPermissions = new DerivedList<Permission>() { @Override protected InternalEObject getOwner() diff --git a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/ResourceFilterImpl.java b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/ResourceFilterImpl.java index d401c68fa9..4651a79078 100644 --- a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/ResourceFilterImpl.java +++ b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/ResourceFilterImpl.java @@ -16,11 +16,15 @@ import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.common.revision.CDORevisionProvider; import org.eclipse.emf.cdo.common.revision.CDORevisionUtil; +import org.eclipse.emf.cdo.common.revision.delta.CDOContainerFeatureDelta; +import org.eclipse.emf.cdo.common.revision.delta.CDOFeatureDelta; import org.eclipse.emf.cdo.eresource.EresourcePackage; import org.eclipse.emf.cdo.security.PatternStyle; import org.eclipse.emf.cdo.security.ResourceFilter; import org.eclipse.emf.cdo.security.SecurityPackage; +import org.eclipse.emf.cdo.security.impl.PermissionImpl.CommitImpactContext; import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; +import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionDelta; import org.eclipse.net4j.util.StringUtil; import org.eclipse.net4j.util.WrappedException; @@ -275,103 +279,10 @@ public class ResourceFilterImpl extends PermissionFilterImpl implements Resource return this; } - // private boolean includesExactAndUp(CDORevision revision, CDORevisionProvider revisionProvider) - // { - // if (!revision.isResourceNode()) - // { - // return false; - // } - // - // String revisionPath = CDORevisionUtil.getResourceNodePath(revision, revisionProvider); - // String path = getSubstitutedPath(); - // - // int length = revisionPath.length(); - // if (length > path.length()) - // { - // return false; - // } - // - // path = path.substring(0, length); - // return revisionPath.equals(path); - // } - // - // private boolean includesExactAndDown(CDORevision revision, CDORevisionProvider revisionProvider) - // { - // String revisionPath = CDORevisionUtil.getResourceNodePath(revision, revisionProvider); - // String path = getSubstitutedPath(); - // - // int length = path.length(); - // if (length > revisionPath.length()) - // { - // return false; - // } - // - // revisionPath = revisionPath.substring(0, length); - // return path.equals(revisionPath); - // } - // - // private boolean includesRegex(CDORevision revision, CDORevisionProvider revisionProvider) - // { - // if (pattern == null) - // { - // String path = substituteUserToken(getPath()); - // pattern = compilePattern(path); - // - // if (pattern == null) - // { - // return false; - // } - // } - // - // if (pattern == OMNI_PATTERN) - // { - // return true; - // } - // - // String revisionPath = CDORevisionUtil.getResourceNodePath(revision, revisionProvider); - // - // Matcher matcher = pattern.matcher(revisionPath); - // return matcher.matches(); - // } - // - // private String substituteUserToken(String string) - // { - // int pos = string.indexOf(USER_TOKEN); - // if (pos != -1) - // { - // String user = getUser(); - // if (user == null || user.length() == 0) - // { - // throw new IllegalStateException("User required for evaluation of path " + string); - // } - // - // string = string.substring(0, pos) + user + string.substring(pos + USER_TOKEN.length()); - // } - // - // return string; - // } - // - // private Pattern compilePattern(String value) - // { - // if (value == null) - // { - // return null; - // } - // - // if (OMNI_PATTERN.pattern().equals(value)) - // { - // return OMNI_PATTERN; - // } - // - // try - // { - // return Pattern.compile(value); - // } - // catch (PatternSyntaxException ex) - // { - // return null; - // } - // } + public boolean isImpacted(CommitImpactContext context) + { + return isResourceTreeImpacted(context); + } public String format() { @@ -589,6 +500,32 @@ public class ResourceFilterImpl extends PermissionFilterImpl implements Resource } } + public static boolean isResourceTreeImpacted(CommitImpactContext context) + { + InternalCDORevisionDelta[] revisionDeltas = (InternalCDORevisionDelta[])context.getDirtyObjectDeltas(); + + for (int i = 0; i < revisionDeltas.length; i++) + { + InternalCDORevisionDelta revisionDelta = revisionDeltas[i]; + + // Any tree move might impact this permission + CDOFeatureDelta containerDelta = revisionDelta.getFeatureDelta(CDOContainerFeatureDelta.CONTAINER_FEATURE); + if (containerDelta != null) + { + return true; + } + + // Any change of a resource node name might impact this permission + CDOFeatureDelta nameDelta = revisionDelta.getFeatureDelta(EresourcePackage.Literals.CDO_RESOURCE_NODE__NAME); + if (nameDelta != null) + { + return true; + } + } + + return false; + } + /** * @author Eike Stepper */ diff --git a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/ResourcePermissionImpl.java b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/ResourcePermissionImpl.java index 989a165a8d..d3e8401112 100644 --- a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/ResourcePermissionImpl.java +++ b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/ResourcePermissionImpl.java @@ -113,6 +113,12 @@ public class ResourcePermissionImpl extends PermissionImpl implements ResourcePe return matcher.matches(); } + @Override + public boolean isImpacted(CommitImpactContext context) + { + return ResourceFilterImpl.isResourceTreeImpacted(context); + } + private Pattern compilePattern(String value) { if (value == null) diff --git a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/UserImpl.java b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/UserImpl.java index 0ffb9d90fc..0525a34ecd 100644 --- a/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/UserImpl.java +++ b/plugins/org.eclipse.emf.cdo.security/src/org/eclipse/emf/cdo/security/impl/UserImpl.java @@ -55,7 +55,7 @@ import java.util.Set; */ public class UserImpl extends AssigneeImpl implements User { - private EList<Group> allGroups = new CachedList<Group>() + private EList<Group> allGroups = new DerivedList<Group>() { @Override protected InternalEObject getOwner() @@ -84,7 +84,7 @@ public class UserImpl extends AssigneeImpl implements User } }; - private EList<Role> allRoles = new CachedList<Role>() + private EList<Role> allRoles = new DerivedList<Role>() { @Override protected InternalEObject getOwner() @@ -113,7 +113,7 @@ public class UserImpl extends AssigneeImpl implements User } }; - private EList<Permission> allPermissions = new CachedList<Permission>() + private EList<Permission> allPermissions = new DerivedList<Permission>() { @Override protected InternalEObject getOwner() @@ -141,7 +141,7 @@ public class UserImpl extends AssigneeImpl implements User } }; - private EList<Role> unassignedRoles = new CachedList<Role>() + private EList<Role> unassignedRoles = new DerivedList<Role>() { @Override protected InternalEObject getOwner() |