You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by ju...@apache.org on 2013/04/16 16:29:00 UTC
svn commit: r1468435 -
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/SecureNodeState.java
Author: jukka
Date: Tue Apr 16 14:28:59 2013
New Revision: 1468435
URL: http://svn.apache.org/r1468435
Log:
OAK-709: Consider moving permission evaluation to the node state level
Fix semantics of SecureNodeState.equals(), using a basic optimization to avoid most of the performance cost.
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/SecureNodeState.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/SecureNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/SecureNodeState.java?rev=1468435&r1=1468434&r2=1468435&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/SecureNodeState.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/core/SecureNodeState.java Tue Apr 16 14:28:59 2013
@@ -47,6 +47,12 @@ import static com.google.common.base.Pre
public class SecureNodeState extends AbstractNodeState {
/**
+ * Underlying root state, used to optimize a common case
+ * in {@link #equals(Object)}.
+ */
+ private final NodeState root;
+
+ /**
* Underlying node state.
*/
private final NodeState state;
@@ -123,7 +129,8 @@ public class SecureNodeState extends Abs
public SecureNodeState(@Nonnull NodeState rootState,
@Nonnull PermissionProvider permissionProvider,
@Nonnull TreeTypeProvider typeProvider) {
- this.state = checkNotNull(rootState);
+ this.root = checkNotNull(rootState);
+ this.state = rootState;
this.base = new ImmutableTree(rootState, typeProvider);
this.permissionProvider = permissionProvider;
// calculate the readstatus for the root
@@ -133,6 +140,7 @@ public class SecureNodeState extends Abs
private SecureNodeState(
@Nonnull SecureNodeState parent,
@Nonnull String name, @Nonnull NodeState nodeState) {
+ this.root = checkNotNull(parent).root;
this.state = checkNotNull(nodeState);
this.base = new ImmutableTree(parent.base, name, nodeState);
this.permissionProvider = parent.permissionProvider;
@@ -246,10 +254,23 @@ public class SecureNodeState extends Abs
}
//-------------------------------------------------------------< Object >---
- // FIXME: add proper equals/hashcode implementation (see OAK-709)
+
@Override
- public boolean equals(Object obj) {
- return state.equals(obj);
+ public boolean equals(Object object) {
+ if (object == this) {
+ return true;
+ } else if (object instanceof SecureNodeState) {
+ SecureNodeState that = (SecureNodeState) object;
+ // TODO: We should be able to do this optimization also across
+ // different revisions (root states) as long as the path,
+ // the subtree, and any security-related areas like the
+ // permission store are equal for both states.
+ if (root.equals(that.root)
+ && base.getPath().equals(that.base.getPath())) {
+ return true;
+ }
+ }
+ return super.equals(object);
}
//------------------------------------------------------------< private >---