You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by gn...@apache.org on 2012/08/29 10:10:39 UTC
svn commit: r1378473 -
/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/namespace/NamespaceHandlerRegistryImpl.java
Author: gnodet
Date: Wed Aug 29 08:10:38 2012
New Revision: 1378473
URL: http://svn.apache.org/viewvc?rev=1378473&view=rev
Log:
[ARIES-899] Fix test failures
Modified:
aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/namespace/NamespaceHandlerRegistryImpl.java
Modified: aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/namespace/NamespaceHandlerRegistryImpl.java
URL: http://svn.apache.org/viewvc/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/namespace/NamespaceHandlerRegistryImpl.java?rev=1378473&r1=1378472&r2=1378473&view=diff
==============================================================================
--- aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/namespace/NamespaceHandlerRegistryImpl.java (original)
+++ aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/namespace/NamespaceHandlerRegistryImpl.java Wed Aug 29 08:10:38 2012
@@ -44,8 +44,6 @@ import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
import javax.xml.XMLConstants;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
@@ -92,13 +90,10 @@ public class NamespaceHandlerRegistryImp
private final ConcurrentHashMap<URI, CopyOnWriteArraySet<NamespaceHandler>> handlers =
new ConcurrentHashMap<URI, CopyOnWriteArraySet<NamespaceHandler>>();
- // Access to the LRU schemas map is synchronized on the lock object
- private final Map<Map<URI, NamespaceHandler>, Reference<Schema>> schemas =
+ // Access to the LRU schemas map is synchronized on itself
+ private final LRUMap<Map<URI, NamespaceHandler>, Reference<Schema>> schemas =
new LRUMap<Map<URI, NamespaceHandler>, Reference<Schema>>(10);
- // Lock to protect access to the schema list
- private final ReadWriteLock lock = new ReentrantReadWriteLock();
-
// Access to this factory is synchronized on itself
private final SchemaFactory schemaFactory =
SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
@@ -249,87 +244,67 @@ public class NamespaceHandlerRegistryImp
// Find a schema that can handle all the requested namespaces
// If it contains additional namespaces, it should not be a problem since
// they won't be used at all
- lock.readLock().lock();
- try {
- Schema schema = getExistingSchema(handlers);
- if (schema != null) {
- return schema;
- }
- } finally {
- lock.readLock().unlock();
- }
- // Create schema
- lock.writeLock().lock();
- try {
- Schema schema = getExistingSchema(handlers);
- if (schema == null) {
- schema = createSchema(handlers, bundle, schemaMap);
- cacheSchema(handlers, schema);
- }
- return schema;
- } finally {
- lock.writeLock().unlock();
+ Schema schema = getExistingSchema(handlers);
+ if (schema == null) {
+ // Create schema
+ schema = createSchema(handlers, bundle, schemaMap);
+ cacheSchema(handlers, schema);
}
+ return schema;
}
private Schema getExistingSchema(Map<URI, NamespaceHandler> handlers) {
- for (Map<URI, NamespaceHandler> key : schemas.keySet()) {
- boolean found = true;
- for (URI uri : handlers.keySet()) {
- if (!handlers.get(uri).equals(key.get(uri))) {
- found = false;
- break;
+ synchronized (schemas) {
+ for (Map<URI, NamespaceHandler> key : schemas.keySet()) {
+ boolean found = true;
+ for (URI uri : handlers.keySet()) {
+ if (!handlers.get(uri).equals(key.get(uri))) {
+ found = false;
+ break;
+ }
+ }
+ if (found) {
+ return schemas.get(key).get();
}
}
- if (found) {
- return schemas.get(key).get();
- }
+ return null;
}
- return null;
}
private void removeSchemasFor(NamespaceHandler handler) {
- List<Map<URI, NamespaceHandler>> keys = new ArrayList<Map<URI, NamespaceHandler>>();
- lock.readLock().lock();
- try {
+ synchronized (schemas) {
+ List<Map<URI, NamespaceHandler>> keys = new ArrayList<Map<URI, NamespaceHandler>>();
for (Map<URI, NamespaceHandler> key : schemas.keySet()) {
if (key.values().contains(handler)) {
keys.add(key);
}
}
- } finally {
- lock.readLock().unlock();
- }
- if (!keys.isEmpty()) {
- lock.writeLock().lock();
- try {
- for (Map<URI, NamespaceHandler> key : keys) {
- schemas.remove(key);
- }
- } finally {
- lock.writeLock().unlock();
+ for (Map<URI, NamespaceHandler> key : keys) {
+ schemas.remove(key);
}
}
}
private void cacheSchema(Map<URI, NamespaceHandler> handlers, Schema schema) {
- // Remove schemas that are fully included
- for (Iterator<Map<URI, NamespaceHandler>> iterator = schemas.keySet().iterator(); iterator.hasNext();) {
- Map<URI, NamespaceHandler> key = iterator.next();
- boolean found = true;
- for (URI uri : key.keySet()) {
- if (!key.get(uri).equals(handlers.get(uri))) {
- found = false;
+ synchronized (schemas) {
+ // Remove schemas that are fully included
+ for (Iterator<Map<URI, NamespaceHandler>> iterator = schemas.keySet().iterator(); iterator.hasNext();) {
+ Map<URI, NamespaceHandler> key = iterator.next();
+ boolean found = true;
+ for (URI uri : key.keySet()) {
+ if (!key.get(uri).equals(handlers.get(uri))) {
+ found = false;
+ break;
+ }
+ }
+ if (found) {
+ iterator.remove();
break;
}
}
- if (found) {
- iterator.remove();
- break;
- }
+ // Add our new schema
+ schemas.put(handlers, new SoftReference<Schema>(schema));
}
- // Add our new schema
- schemas.put(handlers, new SoftReference<Schema>(schema));
}
private Schema createSchema(Map<URI, NamespaceHandler> handlers,