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 md...@apache.org on 2013/03/22 18:35:36 UTC
svn commit: r1459908 -
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/LocalNameMapper.java
Author: mduerig
Date: Fri Mar 22 17:35:36 2013
New Revision: 1459908
URL: http://svn.apache.org/r1459908
Log:
OAK-714: Potential unsynchronised concurrent access to name space map in LocalNameMapper
synchronize access to name space map
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/LocalNameMapper.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/LocalNameMapper.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/LocalNameMapper.java?rev=1459908&r1=1459907&r2=1459908&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/LocalNameMapper.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/namepath/LocalNameMapper.java Fri Mar 22 17:35:36 2013
@@ -16,12 +16,13 @@
*/
package org.apache.jackrabbit.oak.namepath;
-import java.util.Map;
-import javax.annotation.CheckForNull;
-
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
+import java.util.Map;
+
+import javax.annotation.CheckForNull;
+
/**
* Name mapper with local namespace mappings.
*/
@@ -49,25 +50,27 @@ public abstract class LocalNameMapper ex
"No namespace mapping found for " + oakName);
}
- for (Map.Entry<String, String> entry : local.entrySet()) {
- if (uri.equals(entry.getValue())) {
- String jcrPrefix = entry.getKey();
- if (jcrPrefix.equals(oakPrefix)) {
- return oakName;
- } else {
- return jcrPrefix + oakName.substring(colon);
+ synchronized (local) {
+ for (Map.Entry<String, String> entry : local.entrySet()) {
+ if (uri.equals(entry.getValue())) {
+ String jcrPrefix = entry.getKey();
+ if (jcrPrefix.equals(oakPrefix)) {
+ return oakName;
+ } else {
+ return jcrPrefix + oakName.substring(colon);
+ }
}
}
- }
- // local mapping not found for this URI, make sure there
- // is no conflicting local mapping for the prefix
- if (local.containsKey(oakPrefix)) {
- for (int i = 2; true; i++) {
- String jcrPrefix = oakPrefix + i;
- if (!local.containsKey(jcrPrefix)) {
- local.put(jcrPrefix, uri);
- return jcrPrefix + oakName.substring(colon);
+ // local mapping not found for this URI, make sure there
+ // is no conflicting local mapping for the prefix
+ if (local.containsKey(oakPrefix)) {
+ for (int i = 2; true; i++) {
+ String jcrPrefix = oakPrefix + i;
+ if (!local.containsKey(jcrPrefix)) {
+ local.put(jcrPrefix, uri);
+ return jcrPrefix + oakName.substring(colon);
+ }
}
}
}
@@ -88,23 +91,25 @@ public abstract class LocalNameMapper ex
if (hasSessionLocalMappings()) {
int colon = jcrName.indexOf(':');
if (colon > 0) {
- String jcrPrefix = jcrName.substring(0, colon);
- String uri = local.get(jcrPrefix);
- if (uri != null) {
- String oakPrefix = getOakPrefixOrNull(uri);
- if (jcrPrefix.equals(oakPrefix)) {
- return jcrName;
- } else if (oakPrefix != null) {
- return oakPrefix + jcrName.substring(colon);
- } else {
- return null;
+ synchronized (local) {
+ String jcrPrefix = jcrName.substring(0, colon);
+ String uri = local.get(jcrPrefix);
+ if (uri != null) {
+ String oakPrefix = getOakPrefixOrNull(uri);
+ if (jcrPrefix.equals(oakPrefix)) {
+ return jcrName;
+ } else if (oakPrefix != null) {
+ return oakPrefix + jcrName.substring(colon);
+ } else {
+ return null;
+ }
}
- }
- // Check that a global mapping is present and not remapped
- uri = getNamespaceMap().get(jcrPrefix);
- if (uri == null || local.values().contains(uri)) {
- return null;
+ // Check that a global mapping is present and not remapped
+ uri = getNamespaceMap().get(jcrPrefix);
+ if (uri == null || local.values().contains(uri)) {
+ return null;
+ }
}
}
}
@@ -114,7 +119,9 @@ public abstract class LocalNameMapper ex
@Override
public boolean hasSessionLocalMappings() {
- return !local.isEmpty();
+ synchronized (local) {
+ return !local.isEmpty();
+ }
}
}