You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by gp...@apache.org on 2010/07/02 16:17:19 UTC
svn commit: r959996 - in
/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator:
core/ core/factory/ core/metadata/ core/metadata/transformer/
core/metadata/transformer/mapper/ core/property/ core/storage/ core/v...
Author: gpetracek
Date: Fri Jul 2 14:17:18 2010
New Revision: 959996
URL: http://svn.apache.org/viewvc?rev=959996&view=rev
Log:
sync with branch
Added:
myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/util/NullValueAwareConcurrentHashMap.java
Modified:
myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContext.java
myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContextInvocationOrderAwareInternals.java
myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/factory/AbstractNameMapperAwareFactory.java
myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/factory/DefaultFactoryFinder.java
myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/MetaDataEntry.java
myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/DefaultMetaDataTransformerFactory.java
myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/SortedNameMapperList.java
myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/ValidationStrategyToMetaDataTransformerSubMapperAwareNameMapper.java
myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/DefaultPropertyInformation.java
myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/PropertyDetails.java
myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/AbstractStorageManager.java
myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultMappedConstraintSourceStorage.java
myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultMetaDataStorage.java
myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultPropertyStorage.java
myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultStorageManagerFactory.java
myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/message/resolver/DefaultMessageResolverFactory.java
myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/parameter/DefaultValidationParameterFactory.java
myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/strategy/DefaultValidationStrategyFactory.java
Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContext.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContext.java?rev=959996&r1=959995&r2=959996&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContext.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContext.java Fri Jul 2 14:17:18 2010
@@ -42,6 +42,8 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Logger;
/**
@@ -61,10 +63,11 @@ public class ExtValContext
private ViolationSeverityInterpreter violationSeverityInterpreter;
private FactoryFinder factoryFinder = DefaultFactoryFinder.getInstance();
- private Map<String, RendererInterceptor> rendererInterceptors = new HashMap<String, RendererInterceptor>();
- private List<String> deniedInterceptors = new ArrayList<String>();
+ private Map<String, RendererInterceptor> rendererInterceptors =
+ new ConcurrentHashMap<String, RendererInterceptor>();
+ private List<String> deniedInterceptors = new CopyOnWriteArrayList<String>();
private List<ProcessedInformationRecorder> processedInformationRecorders =
- new ArrayList<ProcessedInformationRecorder>();
+ new CopyOnWriteArrayList<ProcessedInformationRecorder>();
private SkipValidationEvaluator skipValidationEvaluator;
Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContextInvocationOrderAwareInternals.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContextInvocationOrderAwareInternals.java?rev=959996&r1=959995&r2=959996&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContextInvocationOrderAwareInternals.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/ExtValContextInvocationOrderAwareInternals.java Fri Jul 2 14:17:18 2010
@@ -27,10 +27,11 @@ import org.apache.myfaces.extensions.val
import org.apache.myfaces.extensions.validator.util.ClassUtils;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Collections;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Logger;
/**
@@ -68,7 +69,7 @@ class ExtValContextInvocationOrderAwareI
List<ComponentInitializer> getComponentInitializers()
{
return this.contextHelper.isComponentInitializationActivated() ?
- this.componentInitializers : new ArrayList<ComponentInitializer>();
+ this.componentInitializers : new CopyOnWriteArrayList<ComponentInitializer>();
}
/*
@@ -154,7 +155,7 @@ class ExtValContextInvocationOrderAwareI
}
else
{
- propertyValidationInterceptorList = new ArrayList<PropertyValidationInterceptor>();
+ propertyValidationInterceptorList = new CopyOnWriteArrayList<PropertyValidationInterceptor>();
this.moduleSpecificPropertyValidationInterceptors.put(moduleKey, propertyValidationInterceptorList);
}
propertyValidationInterceptorList.add(propertyValidationInterceptor);
@@ -214,7 +215,7 @@ class ExtValContextInvocationOrderAwareI
}
else
{
- metaDataExtractionInterceptorList = new ArrayList<MetaDataExtractionInterceptor>();
+ metaDataExtractionInterceptorList = new CopyOnWriteArrayList<MetaDataExtractionInterceptor>();
this.moduleSpecificMetaDataExtractionInterceptors.put(moduleKey, metaDataExtractionInterceptorList);
}
metaDataExtractionInterceptorList.add(metaDataExtractionInterceptor);
@@ -268,7 +269,7 @@ class ExtValContextInvocationOrderAwareI
return;
}
- validationExceptionInterceptors = new ArrayList<ValidationExceptionInterceptor>();
+ validationExceptionInterceptors = new CopyOnWriteArrayList<ValidationExceptionInterceptor>();
List<String> validationExceptionInterceptorClassNames = new ArrayList<String>();
validationExceptionInterceptorClassNames
@@ -300,8 +301,10 @@ class ExtValContextInvocationOrderAwareI
return;
}
- metaDataExtractionInterceptors = new ArrayList<MetaDataExtractionInterceptor>();
- moduleSpecificMetaDataExtractionInterceptors = new HashMap<Class, List<MetaDataExtractionInterceptor>>();
+ metaDataExtractionInterceptors =
+ new CopyOnWriteArrayList<MetaDataExtractionInterceptor>();
+ moduleSpecificMetaDataExtractionInterceptors =
+ new ConcurrentHashMap<Class, List<MetaDataExtractionInterceptor>>();
List<String> metaDataExtractionInterceptorClassNames = new ArrayList<String>();
@@ -332,7 +335,7 @@ class ExtValContextInvocationOrderAwareI
return;
}
- componentInitializers = new ArrayList<ComponentInitializer>();
+ componentInitializers = new CopyOnWriteArrayList<ComponentInitializer>();
List<String> componentInitializerClassNames = new ArrayList<String>();
componentInitializerClassNames
.add(WebXmlParameter.CUSTOM_COMPONENT_INITIALIZER);
@@ -361,8 +364,10 @@ class ExtValContextInvocationOrderAwareI
return;
}
- propertyValidationInterceptors = new ArrayList<PropertyValidationInterceptor>();
- moduleSpecificPropertyValidationInterceptors = new HashMap<Class, List<PropertyValidationInterceptor>>();
+ propertyValidationInterceptors =
+ new CopyOnWriteArrayList<PropertyValidationInterceptor>();
+ moduleSpecificPropertyValidationInterceptors =
+ new ConcurrentHashMap<Class, List<PropertyValidationInterceptor>>();
List<String> validationInterceptorClassNames = new ArrayList<String>();
@@ -398,13 +403,24 @@ class ExtValContextInvocationOrderAwareI
*/
private void sortComponentInitializers()
{
- Collections.sort(this.componentInitializers, new InvocationOrderComparator<ComponentInitializer>());
+ List<ComponentInitializer> componentInitializersToSort =
+ new ArrayList<ComponentInitializer>(this.componentInitializers);
+
+ Collections.sort(componentInitializersToSort, new InvocationOrderComparator<ComponentInitializer>());
+
+ this.componentInitializers.clear();
+ this.componentInitializers.addAll(componentInitializersToSort);
}
private void sortPropertyValidationInterceptors()
{
- Collections.sort(this.propertyValidationInterceptors,
+ List<PropertyValidationInterceptor> propertyValidationInterceptorsToSort =
+ new ArrayList<PropertyValidationInterceptor>(this.propertyValidationInterceptors);
+ Collections.sort(propertyValidationInterceptorsToSort,
new InvocationOrderComparator<PropertyValidationInterceptor>());
+
+ this.propertyValidationInterceptors.clear();
+ this.propertyValidationInterceptors.addAll(propertyValidationInterceptorsToSort);
}
//sort all - it isn't a huge overhead since it's just done during the init-phase
@@ -420,22 +436,39 @@ class ExtValContextInvocationOrderAwareI
private List<PropertyValidationInterceptor> sortPropertyValidationInterceptorList(
List<PropertyValidationInterceptor> propertyValidationInterceptorList)
{
- Collections.sort(propertyValidationInterceptorList,
+ List<PropertyValidationInterceptor> propertyValidationInterceptorListToSort =
+ new ArrayList<PropertyValidationInterceptor>(propertyValidationInterceptorList);
+
+ Collections.sort(propertyValidationInterceptorListToSort,
new InvocationOrderComparator<PropertyValidationInterceptor>());
+ propertyValidationInterceptorList.clear();
+ propertyValidationInterceptorList.addAll(propertyValidationInterceptorListToSort);
return propertyValidationInterceptorList;
}
private void sortValidationExceptionInterceptors()
{
- Collections.sort(this.validationExceptionInterceptors,
+ List<ValidationExceptionInterceptor> validationExceptionInterceptorsToSort =
+ new ArrayList<ValidationExceptionInterceptor>(this.validationExceptionInterceptors);
+
+ Collections.sort(validationExceptionInterceptorsToSort,
new InvocationOrderComparator<ValidationExceptionInterceptor>());
+
+ this.validationExceptionInterceptors.clear();
+ this.validationExceptionInterceptors.addAll(validationExceptionInterceptorsToSort);
}
private void sortMetaDataExtractionInterceptors()
{
- Collections.sort(this.metaDataExtractionInterceptors,
+ List<MetaDataExtractionInterceptor> metaDataExtractionInterceptorsToSort =
+ new ArrayList<MetaDataExtractionInterceptor>(this.metaDataExtractionInterceptors);
+
+ Collections.sort(metaDataExtractionInterceptorsToSort,
new InvocationOrderComparator<MetaDataExtractionInterceptor>());
+
+ this.metaDataExtractionInterceptors.clear();
+ this.metaDataExtractionInterceptors.addAll(metaDataExtractionInterceptorsToSort);
}
//sort all - it isn't a huge overhead since it's just done during the init-phase
@@ -451,9 +484,14 @@ class ExtValContextInvocationOrderAwareI
private List<MetaDataExtractionInterceptor> sortMetaDataExtractionInterceptorList(
List<MetaDataExtractionInterceptor> metaDataExtractionInterceptorList)
{
- Collections.sort(metaDataExtractionInterceptorList,
+ List<MetaDataExtractionInterceptor> metaDataExtractionInterceptorListToSort =
+ new ArrayList<MetaDataExtractionInterceptor>(metaDataExtractionInterceptorList);
+
+ Collections.sort(metaDataExtractionInterceptorListToSort,
new InvocationOrderComparator<MetaDataExtractionInterceptor>());
+ metaDataExtractionInterceptorList.clear();
+ metaDataExtractionInterceptorList.addAll(metaDataExtractionInterceptorListToSort);
return metaDataExtractionInterceptorList;
}
}
\ No newline at end of file
Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/factory/AbstractNameMapperAwareFactory.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/factory/AbstractNameMapperAwareFactory.java?rev=959996&r1=959995&r2=959996&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/factory/AbstractNameMapperAwareFactory.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/factory/AbstractNameMapperAwareFactory.java Fri Jul 2 14:17:18 2010
@@ -26,6 +26,7 @@ import org.apache.myfaces.extensions.val
import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;
+import java.util.concurrent.CopyOnWriteArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -36,14 +37,26 @@ import java.util.Comparator;
@UsageInformation(UsageCategory.API)
public abstract class AbstractNameMapperAwareFactory<T> implements NameMapperAwareFactory<NameMapper<T>>
{
- private List<Class> deniedNameMapperList = new ArrayList<Class>();
+ private List<Class> deniedNameMapperList = new CopyOnWriteArrayList<Class>();
public synchronized void register(NameMapper<T> nameMapper)
{
if(!deniedNameMapperList.contains(nameMapper.getClass()))
{
getNameMapperList().add(nameMapper);
- Collections.sort(getNameMapperList(), getComparator());
+ List<NameMapper<T>> nameMapperList = getNameMapperList();
+
+ if(nameMapperList instanceof CopyOnWriteArrayList)
+ {
+ List<NameMapper<T>> sortableList = new ArrayList<NameMapper<T>>(nameMapperList);
+ Collections.sort(sortableList, getComparator());
+ nameMapperList.clear();
+ nameMapperList.addAll(sortableList);
+ }
+ else
+ {
+ Collections.sort(nameMapperList, getComparator());
+ }
}
}
Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/factory/DefaultFactoryFinder.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/factory/DefaultFactoryFinder.java?rev=959996&r1=959995&r2=959996&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/factory/DefaultFactoryFinder.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/factory/DefaultFactoryFinder.java Fri Jul 2 14:17:18 2010
@@ -38,9 +38,9 @@ import org.apache.myfaces.extensions.val
import org.apache.myfaces.extensions.validator.util.ClassUtils;
import java.util.Map;
-import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Logger;
/**
@@ -52,7 +52,7 @@ import java.util.logging.Logger;
public class DefaultFactoryFinder implements FactoryFinder
{
protected final Logger logger = Logger.getLogger(getClass().getName());
- protected Map<FactoryNames, Object> factoryMap = new HashMap<FactoryNames, Object>();
+ protected Map<FactoryNames, Object> factoryMap = new ConcurrentHashMap<FactoryNames, Object>();
private static FactoryFinder factoryFinder = new DefaultFactoryFinder();
Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/MetaDataEntry.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/MetaDataEntry.java?rev=959996&r1=959995&r2=959996&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/MetaDataEntry.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/MetaDataEntry.java Fri Jul 2 14:17:18 2010
@@ -90,4 +90,55 @@ public class MetaDataEntry
this.properties.put(key, value);
}
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if (this == o)
+ {
+ return true;
+ }
+ if (!(o instanceof MetaDataEntry))
+ {
+ return false;
+ }
+
+ MetaDataEntry that = (MetaDataEntry) o;
+
+ if (key != null ? !key.equals(that.key) : that.key != null)
+ {
+ return false;
+ }
+ if (properties != null ? !properties.equals(that.properties) : that.properties != null)
+ {
+ return false;
+ }
+ if (value != null ? !value.equals(that.value) : that.value != null)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ int result = key != null ? key.hashCode() : 0;
+ result = 31 * result + (value != null ? createNullAwareHashCode(value) : 0);
+ result = 31 * result + (properties != null ? createNullAwareHashCode(properties) : 0);
+ return result;
+ }
+
+ private int createNullAwareHashCode(Object o)
+ {
+ try
+ {
+ return o.hashCode();
+ }
+ catch (NullPointerException e)
+ {
+ return 0;
+ }
+ }
}
Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/DefaultMetaDataTransformerFactory.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/DefaultMetaDataTransformerFactory.java?rev=959996&r1=959995&r2=959996&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/DefaultMetaDataTransformerFactory.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/DefaultMetaDataTransformerFactory.java Fri Jul 2 14:17:18 2010
@@ -34,13 +34,13 @@ import org.apache.myfaces.extensions.val
ValidationStrategyToMetaDataTransformerSubMapperAwareNameMapper;
import org.apache.myfaces.extensions.validator.util.ClassUtils;
import org.apache.myfaces.extensions.validator.util.ProxyUtils;
+import org.apache.myfaces.extensions.validator.util.NullValueAwareConcurrentHashMap;
import org.apache.myfaces.extensions.validator.internal.UsageInformation;
import org.apache.myfaces.extensions.validator.internal.UsageCategory;
-import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Logger;
@@ -61,9 +61,10 @@ public class DefaultMetaDataTransformerF
protected final Logger logger = Logger.getLogger(getClass().getName());
private Map<String, String> validationStrategyToMetaDataTransformerMapping;
- private List<NameMapper<ValidationStrategy>> nameMapperList = new ArrayList<NameMapper<ValidationStrategy>>();
+ private List<NameMapper<ValidationStrategy>> nameMapperList =
+ new CopyOnWriteArrayList<NameMapper<ValidationStrategy>>();
private List<NameMapper<ValidationStrategy>> subNameMapperList =
- new ArrayList<NameMapper<ValidationStrategy>>();
+ new CopyOnWriteArrayList<NameMapper<ValidationStrategy>>();
public DefaultMetaDataTransformerFactory()
{
@@ -191,7 +192,8 @@ public class DefaultMetaDataTransformerF
private synchronized void initStaticMappings()
{
- validationStrategyToMetaDataTransformerMapping = new HashMap<String, String>();
+ validationStrategyToMetaDataTransformerMapping =
+ new NullValueAwareConcurrentHashMap<String, String>(String.class);
//setup internal static mappings
for (StaticConfiguration<String, String> staticConfig :
Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/SortedNameMapperList.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/SortedNameMapperList.java?rev=959996&r1=959995&r2=959996&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/SortedNameMapperList.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/SortedNameMapperList.java Fri Jul 2 14:17:18 2010
@@ -25,11 +25,13 @@ import org.apache.myfaces.extensions.val
import org.apache.myfaces.extensions.validator.internal.UsageInformation;
import java.util.List;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
import java.util.ListIterator;
+import java.util.concurrent.CopyOnWriteArrayList;
/**
@@ -37,8 +39,10 @@ import java.util.ListIterator;
* @since x.x.3
*/
@UsageInformation({UsageCategory.INTERNAL})
-class SortedNameMapperList<T extends NameMapper> implements List<T>
+class SortedNameMapperList<T extends NameMapper> extends CopyOnWriteArrayList<T>
{
+ private static final long serialVersionUID = 1502156999599962365L;
+
private List<T> wrapped;
private List<T> globalSubNameMapperList;
@@ -58,19 +62,27 @@ class SortedNameMapperList<T extends Nam
{
boolean result = wrapped.add(t);
- Collections.sort(wrapped, new Comparator<T>()
+ sortWrappedList();
+ return result;
+ }
+ }
+
+ private void sortWrappedList()
+ {
+ List<T> sortableList = new ArrayList<T>(wrapped);
+ Collections.sort(sortableList, new Comparator<T>()
+ {
+ public int compare(T nm1, T nm2)
{
- public int compare(T nm1, T nm2)
+ if (nm1 instanceof SubMapperAwareNameMapper && nm2 instanceof SubMapperAwareNameMapper)
{
- if (nm1 instanceof SubMapperAwareNameMapper && nm2 instanceof SubMapperAwareNameMapper)
- {
- return 0;
- }
- return nm1 instanceof SubMapperAwareNameMapper ? 1 : -1;
+ return 0;
}
- });
- return result;
- }
+ return nm1 instanceof SubMapperAwareNameMapper ? 1 : -1;
+ }
+ });
+ wrapped.clear();
+ wrapped.addAll(sortableList);
}
@SuppressWarnings({"unchecked"})
Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/ValidationStrategyToMetaDataTransformerSubMapperAwareNameMapper.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/ValidationStrategyToMetaDataTransformerSubMapperAwareNameMapper.java?rev=959996&r1=959995&r2=959996&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/ValidationStrategyToMetaDataTransformerSubMapperAwareNameMapper.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/metadata/transformer/mapper/ValidationStrategyToMetaDataTransformerSubMapperAwareNameMapper.java Fri Jul 2 14:17:18 2010
@@ -30,6 +30,7 @@ import org.apache.myfaces.extensions.val
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.concurrent.CopyOnWriteArrayList;
/**
* @author Gerhard Petracek
@@ -41,7 +42,8 @@ public class ValidationStrategyToMetaDat
extends AbstractValidationStrategyToMetaDataTransformerNameMapper
implements SubMapperAwareNameMapper<ValidationStrategy>
{
- private List<NameMapper<ValidationStrategy>> subNameMappers = new ArrayList<NameMapper<ValidationStrategy>>();
+ private List<NameMapper<ValidationStrategy>> subNameMappers =
+ new CopyOnWriteArrayList<NameMapper<ValidationStrategy>>();
public void addNameMapper(NameMapper<ValidationStrategy> nameMapper)
{
@@ -54,7 +56,13 @@ public class ValidationStrategyToMetaDat
private void sortSubNameMappers()
{
- Collections.sort(this.subNameMappers, new InvocationOrderComparator<NameMapper<ValidationStrategy>>());
+ List<NameMapper<ValidationStrategy>> sortableList =
+ new ArrayList<NameMapper<ValidationStrategy>>(this.subNameMappers);
+
+ Collections.sort(sortableList, new InvocationOrderComparator<NameMapper<ValidationStrategy>>());
+
+ subNameMappers.clear();
+ subNameMappers.addAll(sortableList);
}
public String createName(ValidationStrategy source)
Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/DefaultPropertyInformation.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/DefaultPropertyInformation.java?rev=959996&r1=959995&r2=959996&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/DefaultPropertyInformation.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/DefaultPropertyInformation.java Fri Jul 2 14:17:18 2010
@@ -79,4 +79,50 @@ public class DefaultPropertyInformation
this.metaDataList.clear();
}
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if (this == o)
+ {
+ return true;
+ }
+ if (!(o instanceof DefaultPropertyInformation))
+ {
+ return false;
+ }
+
+ DefaultPropertyInformation that = (DefaultPropertyInformation) o;
+
+ if (!informationMap.equals(that.informationMap))
+ {
+ return false;
+ }
+ if (!metaDataList.equals(that.metaDataList))
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ int result = createNullAwareHashCode(informationMap);
+ result = 31 * result + createNullAwareHashCode(metaDataList);
+ return result;
+ }
+
+ private int createNullAwareHashCode(Object o)
+ {
+ try
+ {
+ return o.hashCode();
+ }
+ catch (NullPointerException e)
+ {
+ return 0;
+ }
+ }
}
Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/PropertyDetails.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/PropertyDetails.java?rev=959996&r1=959995&r2=959996&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/PropertyDetails.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/property/PropertyDetails.java Fri Jul 2 14:17:18 2010
@@ -65,4 +65,55 @@ public class PropertyDetails
{
this.property = property;
}
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if (this == o)
+ {
+ return true;
+ }
+ if (!(o instanceof PropertyDetails))
+ {
+ return false;
+ }
+
+ PropertyDetails that = (PropertyDetails) o;
+
+ if (baseObject != null ? !baseObject.equals(that.baseObject) : that.baseObject != null)
+ {
+ return false;
+ }
+ if (key != null ? !key.equals(that.key) : that.key != null)
+ {
+ return false;
+ }
+ if (property != null ? !property.equals(that.property) : that.property != null)
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ int result = key != null ? key.hashCode() : 0;
+ result = 31 * result + (baseObject != null ? createNullAwareHashCode(baseObject) : 0);
+ result = 31 * result + (property != null ? property.hashCode() : 0);
+ return result;
+ }
+
+ private int createNullAwareHashCode(Object o)
+ {
+ try
+ {
+ return o.hashCode();
+ }
+ catch (NullPointerException e)
+ {
+ return 0;
+ }
+ }
}
Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/AbstractStorageManager.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/AbstractStorageManager.java?rev=959996&r1=959995&r2=959996&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/AbstractStorageManager.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/AbstractStorageManager.java Fri Jul 2 14:17:18 2010
@@ -26,8 +26,8 @@ import org.apache.myfaces.extensions.val
import static org.apache.myfaces.extensions.validator.internal.UsageCategory.REUSE;
import java.util.List;
-import java.util.ArrayList;
import java.util.Map;
+import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Logger;
/**
@@ -42,7 +42,7 @@ public abstract class AbstractStorageMan
{
protected final Logger logger = Logger.getLogger(getClass().getName());
- private List<NameMapper<String>> nameMapperList = new ArrayList<NameMapper<String>>();
+ private List<NameMapper<String>> nameMapperList = new CopyOnWriteArrayList<NameMapper<String>>();
public AbstractStorageManager()
{
Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultMappedConstraintSourceStorage.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultMappedConstraintSourceStorage.java?rev=959996&r1=959995&r2=959996&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultMappedConstraintSourceStorage.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultMappedConstraintSourceStorage.java Fri Jul 2 14:17:18 2010
@@ -22,10 +22,11 @@ import org.apache.myfaces.extensions.val
import static org.apache.myfaces.extensions.validator.internal.UsageCategory.INTERNAL;
import org.apache.myfaces.extensions.validator.internal.UsageInformation;
import org.apache.myfaces.extensions.validator.util.ProxyUtils;
+import org.apache.myfaces.extensions.validator.util.NullValueAwareConcurrentHashMap;
-import java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Logger;
/**
@@ -38,7 +39,7 @@ public class DefaultMappedConstraintSour
protected final Logger logger = Logger.getLogger(getClass().getName());
private Map<String, Map<String, PropertyDetails>> propertyDetailsMap =
- new HashMap<String, Map<String, PropertyDetails>>();
+ new ConcurrentHashMap<String, Map<String, PropertyDetails>>();
public void storeMapping(Class originalClass, String originalProperty, PropertyDetails targetPropertyDetails)
{
@@ -97,8 +98,14 @@ public class DefaultMappedConstraintSour
String key = ProxyUtils.getClassName(target);
if(!this.propertyDetailsMap.containsKey(key))
{
- this.propertyDetailsMap.put(key, new HashMap<String, PropertyDetails>());
+ this.propertyDetailsMap.put(
+ key, new NullValueAwareConcurrentHashMap<String, PropertyDetails>(createDefaultValue()));
}
return this.propertyDetailsMap.get(key);
}
+
+ private PropertyDetails createDefaultValue()
+ {
+ return new PropertyDetails(null, null, null);
+ }
}
Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultMetaDataStorage.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultMetaDataStorage.java?rev=959996&r1=959995&r2=959996&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultMetaDataStorage.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultMetaDataStorage.java Fri Jul 2 14:17:18 2010
@@ -32,11 +32,13 @@ import org.apache.myfaces.extensions.val
import org.apache.myfaces.extensions.validator.core.ExtValContext;
import org.apache.myfaces.extensions.validator.util.ClassUtils;
import org.apache.myfaces.extensions.validator.util.ProxyUtils;
+import org.apache.myfaces.extensions.validator.util.NullValueAwareConcurrentHashMap;
import java.util.Map;
-import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Logger;
/**
@@ -49,11 +51,11 @@ public class DefaultMetaDataStorage impl
protected final Logger logger = Logger.getLogger(getClass().getName());
private Map<String, Map<String, PropertyInformation>> cachedPropertyInformation =
- new HashMap<String, Map<String, PropertyInformation>>();
+ new ConcurrentHashMap<String, Map<String, PropertyInformation>>();
- private List<MetaDataStorageFilter> metaDataStorageFilters = new ArrayList<MetaDataStorageFilter>();
+ private List<MetaDataStorageFilter> metaDataStorageFilters = new CopyOnWriteArrayList<MetaDataStorageFilter>();
private List<Class<? extends MetaDataStorageFilter>> deniedMetaDataFilters =
- new ArrayList<Class<? extends MetaDataStorageFilter>>();
+ new CopyOnWriteArrayList<Class<? extends MetaDataStorageFilter>>();
public DefaultMetaDataStorage()
{
@@ -210,11 +212,62 @@ public class DefaultMetaDataStorage impl
String key = ProxyUtils.getClassName(target);
if(!this.cachedPropertyInformation.containsKey(key))
{
- this.cachedPropertyInformation.put(key, new HashMap<String, PropertyInformation>());
+ this.cachedPropertyInformation.put(key,
+ new NullValueAwareConcurrentHashMap<String, PropertyInformation>(new NullMarkerPropertyInformation()));
}
return this.cachedPropertyInformation.get(key);
}
+ private static class NullMarkerPropertyInformation implements PropertyInformation
+ {
+ public boolean containsInformation(String key)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public Object getInformation(String key)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public <T> T getInformation(String key, Class<T> targetClass)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public void setInformation(String key, Object value)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public MetaDataEntry[] getMetaDataEntries()
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public void addMetaDataEntry(MetaDataEntry metaDataEntry)
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ public void resetMetaDataEntries()
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return getClass().hashCode();
+ }
+
+ @Override
+ public boolean equals(Object target)
+ {
+ return getClass().equals(target.getClass());
+ }
+ }
+
private Class<? extends MetaDataStorageFilter> getStorageFilterClass(MetaDataStorageFilter storageFilter)
{
return ProxyUtils.getUnproxiedClass(storageFilter.getClass(), MetaDataStorageFilter.class);
Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultPropertyStorage.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultPropertyStorage.java?rev=959996&r1=959995&r2=959996&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultPropertyStorage.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultPropertyStorage.java Fri Jul 2 14:17:18 2010
@@ -24,8 +24,10 @@ import org.apache.myfaces.extensions.val
import java.lang.reflect.Field;
import java.lang.reflect.Method;
-import java.util.HashMap;
import java.util.Map;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Logger;
/**
@@ -37,37 +39,77 @@ public class DefaultPropertyStorage impl
{
protected final Logger logger = Logger.getLogger(getClass().getName());
- private Map<String, Map<String, Field>> fieldMap = new HashMap<String, Map<String, Field>>();
- private Map<String, Map<String, Method>> methodMap = new HashMap<String, Map<String, Method>>();
+ private Map<String, Map<String, Field>> fieldMap = new ConcurrentHashMap<String, Map<String, Field>>();
+ private Map<String, Map<String, Method>> methodMap = new ConcurrentHashMap<String, Map<String, Method>>();
+ private Map<String, List<String>> fieldNotAvailableMap = new ConcurrentHashMap<String, List<String>>();
+ private Map<String, List<String>> methodNotAvailableMap = new ConcurrentHashMap<String, List<String>>();
public void storeField(Class targetClass, String property, Field field)
{
- getFieldMapForClass(targetClass).put(property, field);
+ if(field != null)
+ {
+ getFieldMapForClass(targetClass).put(property, field);
+ }
+ else
+ {
+ getNotAvailableFieldListForClass(targetClass).add(property);
+ }
}
public void storeMethod(Class targetClass, String property, Method method)
{
- getMethodMapForClass(targetClass).put(property, method);
+ if(method != null)
+ {
+ getMethodMapForClass(targetClass).put(property, method);
+ }
+ else
+ {
+ getNotAvailableMethodListForClass(targetClass).add(property);
+ }
}
public Field getField(Class targetClass, String property)
{
- return getFieldMapForClass(targetClass).get(property);
+ Map<String, Field> fieldMap = getFieldMapForClass(targetClass);
+
+ if(fieldMap == null)
+ {
+ return null;
+ }
+ return fieldMap.get(property);
}
public Method getMethod(Class targetClass, String property)
{
- return getMethodMapForClass(targetClass).get(property);
+ Map<String, Method> methodMap = getMethodMapForClass(targetClass);
+
+ if(methodMap == null)
+ {
+ return null;
+ }
+ return methodMap.get(property);
}
public boolean containsField(Class targetClass, String property)
{
- return getFieldMapForClass(targetClass).containsKey(property);
+ boolean result = getFieldMapForClass(targetClass).containsKey(property);
+
+ if(!result)
+ {
+ result = getNotAvailableFieldListForClass(targetClass).contains(property);
+ }
+ return result;
}
public boolean containsMethod(Class targetClass, String property)
{
- return getMethodMapForClass(targetClass).containsKey(property);
+ boolean result = getMethodMapForClass(targetClass).containsKey(property);
+
+ if(!result)
+ {
+ result = getNotAvailableMethodListForClass(targetClass).contains(property);
+ }
+ return result;
}
private Map<String, Field> getFieldMapForClass(Class target)
@@ -75,18 +117,38 @@ public class DefaultPropertyStorage impl
String key = ProxyUtils.getClassName(target);
if (!this.fieldMap.containsKey(key))
{
- this.fieldMap.put(key, new HashMap<String, Field>());
+ this.fieldMap.put(key, new ConcurrentHashMap<String, Field>());
}
return this.fieldMap.get(key);
}
+ private List<String> getNotAvailableFieldListForClass(Class target)
+ {
+ String key = ProxyUtils.getClassName(target);
+ if (!this.fieldNotAvailableMap.containsKey(key))
+ {
+ this.fieldNotAvailableMap.put(key, new CopyOnWriteArrayList<String>());
+ }
+ return this.fieldNotAvailableMap.get(key);
+ }
+
private Map<String, Method> getMethodMapForClass(Class target)
{
String key = ProxyUtils.getClassName(target);
if (!this.methodMap.containsKey(key))
{
- this.methodMap.put(key, new HashMap<String, Method>());
+ this.methodMap.put(key, new ConcurrentHashMap<String, Method>());
}
return this.methodMap.get(key);
}
+
+ private List<String> getNotAvailableMethodListForClass(Class target)
+ {
+ String key = ProxyUtils.getClassName(target);
+ if (!this.methodNotAvailableMap.containsKey(key))
+ {
+ this.methodNotAvailableMap.put(key, new CopyOnWriteArrayList<String>());
+ }
+ return this.methodNotAvailableMap.get(key);
+ }
}
Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultStorageManagerFactory.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultStorageManagerFactory.java?rev=959996&r1=959995&r2=959996&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultStorageManagerFactory.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/storage/DefaultStorageManagerFactory.java Fri Jul 2 14:17:18 2010
@@ -30,9 +30,9 @@ import org.apache.myfaces.extensions.val
import static org.apache.myfaces.extensions.validator.internal.UsageCategory.INTERNAL;
import java.util.List;
-import java.util.ArrayList;
import java.util.Map;
-import java.util.HashMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Logger;
/**
@@ -48,8 +48,8 @@ public class DefaultStorageManagerFactor
protected final Logger logger = Logger.getLogger(getClass().getName());
private boolean lazyStaticMappingApplied = false;
- private List<NameMapper<Class>> nameMapperList = new ArrayList<NameMapper<Class>>();
- private Map<Class, StorageManager> storageTypeToStorageManagerMap = new HashMap<Class, StorageManager>();
+ private List<NameMapper<Class>> nameMapperList = new CopyOnWriteArrayList<NameMapper<Class>>();
+ private Map<Class, StorageManager> storageTypeToStorageManagerMap = new ConcurrentHashMap<Class, StorageManager>();
public DefaultStorageManagerFactory()
{
Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/message/resolver/DefaultMessageResolverFactory.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/message/resolver/DefaultMessageResolverFactory.java?rev=959996&r1=959995&r2=959996&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/message/resolver/DefaultMessageResolverFactory.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/message/resolver/DefaultMessageResolverFactory.java Fri Jul 2 14:17:18 2010
@@ -28,15 +28,15 @@ import org.apache.myfaces.extensions.val
import org.apache.myfaces.extensions.validator.core.ExtValContext;
import org.apache.myfaces.extensions.validator.util.ClassUtils;
import org.apache.myfaces.extensions.validator.util.ProxyUtils;
+import org.apache.myfaces.extensions.validator.util.NullValueAwareConcurrentHashMap;
import org.apache.myfaces.extensions.validator.internal.ToDo;
import org.apache.myfaces.extensions.validator.internal.Priority;
import org.apache.myfaces.extensions.validator.internal.UsageInformation;
import org.apache.myfaces.extensions.validator.internal.UsageCategory;
-import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Logger;
/**
@@ -53,7 +53,8 @@ public class DefaultMessageResolverFacto
protected final Logger logger = Logger.getLogger(getClass().getName());
private Map<String, String> strategyMessageResolverMapping;
- private List<NameMapper<ValidationStrategy>> nameMapperList = new ArrayList<NameMapper<ValidationStrategy>>();
+ private List<NameMapper<ValidationStrategy>> nameMapperList =
+ new CopyOnWriteArrayList<NameMapper<ValidationStrategy>>();
public DefaultMessageResolverFactory()
{
@@ -106,7 +107,7 @@ public class DefaultMessageResolverFacto
private synchronized void initStaticMappings()
{
- strategyMessageResolverMapping = new HashMap<String, String>();
+ strategyMessageResolverMapping = new NullValueAwareConcurrentHashMap<String, String>(String.class);
//setup internal static mappings
for (StaticConfiguration<String, String> staticConfig :
Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/parameter/DefaultValidationParameterFactory.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/parameter/DefaultValidationParameterFactory.java?rev=959996&r1=959995&r2=959996&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/parameter/DefaultValidationParameterFactory.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/parameter/DefaultValidationParameterFactory.java Fri Jul 2 14:17:18 2010
@@ -26,8 +26,8 @@ import org.apache.myfaces.extensions.val
import org.apache.myfaces.extensions.validator.internal.UsageCategory;
import org.apache.myfaces.extensions.validator.internal.UsageInformation;
import org.apache.myfaces.extensions.validator.util.ClassUtils;
+import org.apache.myfaces.extensions.validator.util.NullValueAwareConcurrentHashMap;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -40,7 +40,7 @@ import java.util.Map;
@UsageInformation(UsageCategory.INTERNAL)
public class DefaultValidationParameterFactory implements ClassMappingFactory<Class, Class>
{
- private Map<Class, Class> parameterMapping = new HashMap<Class, Class>();
+ private Map<Class, Class> parameterMapping = new NullValueAwareConcurrentHashMap<Class, Class>(Class.class);
public Class create(Class source)
{
Modified: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/strategy/DefaultValidationStrategyFactory.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/strategy/DefaultValidationStrategyFactory.java?rev=959996&r1=959995&r2=959996&view=diff
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/strategy/DefaultValidationStrategyFactory.java (original)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/core/validation/strategy/DefaultValidationStrategyFactory.java Fri Jul 2 14:17:18 2010
@@ -32,16 +32,16 @@ import org.apache.myfaces.extensions.val
.AnnotationToValidationStrategyBeanNameMapper;
import org.apache.myfaces.extensions.validator.util.ClassUtils;
import org.apache.myfaces.extensions.validator.util.ExtValUtils;
+import org.apache.myfaces.extensions.validator.util.NullValueAwareConcurrentHashMap;
import org.apache.myfaces.extensions.validator.internal.ToDo;
import org.apache.myfaces.extensions.validator.internal.Priority;
import org.apache.myfaces.extensions.validator.internal.UsageInformation;
import org.apache.myfaces.extensions.validator.internal.UsageCategory;
-import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.MissingResourceException;
+import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Logger;
@@ -58,7 +58,7 @@ public class DefaultValidationStrategyFa
protected final Logger logger = Logger.getLogger(getClass().getName());
private Map<String, String> metaDataKeyToValidationStrategyMapping = null;
- private List<NameMapper<String>> nameMapperList = new ArrayList<NameMapper<String>>();
+ private List<NameMapper<String>> nameMapperList = new CopyOnWriteArrayList<NameMapper<String>>();
public DefaultValidationStrategyFactory()
{
@@ -132,7 +132,7 @@ public class DefaultValidationStrategyFa
@ToDo(value = Priority.MEDIUM, description = "logging")
private synchronized void initStaticMappings()
{
- metaDataKeyToValidationStrategyMapping = new HashMap<String, String>();
+ metaDataKeyToValidationStrategyMapping = new NullValueAwareConcurrentHashMap<String, String>(String.class);
//setup internal static mappings
for (StaticConfiguration<String, String> staticConfig :
Added: myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/util/NullValueAwareConcurrentHashMap.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/util/NullValueAwareConcurrentHashMap.java?rev=959996&view=auto
==============================================================================
--- myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/util/NullValueAwareConcurrentHashMap.java (added)
+++ myfaces/extensions/validator/trunk/core/src/main/java/org/apache/myfaces/extensions/validator/util/NullValueAwareConcurrentHashMap.java Fri Jul 2 14:17:18 2010
@@ -0,0 +1,109 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.extensions.validator.util;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.Map;
+
+/**
+ * in some cases we have to store null values to avoid re-evaluation
+ *
+ * @author Gerhard Petracek
+ */
+public class NullValueAwareConcurrentHashMap<K, V> extends ConcurrentHashMap<K, V>
+{
+ private static final long serialVersionUID = -7294527213622879543L;
+
+ private V nullMarkerValue;
+
+ protected NullValueAwareConcurrentHashMap(int initialCapacity, float loadFactor, int concurrencyLevel)
+ {
+ super(initialCapacity, loadFactor, concurrencyLevel);
+ }
+
+ protected NullValueAwareConcurrentHashMap(int initialCapacity, float loadFactor)
+ {
+ super(initialCapacity, loadFactor);
+ }
+
+ protected NullValueAwareConcurrentHashMap(int initialCapacity)
+ {
+ super(initialCapacity);
+ }
+
+ protected NullValueAwareConcurrentHashMap(Map<? extends K, ? extends V> m)
+ {
+ super(m);
+ }
+
+ public NullValueAwareConcurrentHashMap(V nullMarkerValue)
+ {
+ this.nullMarkerValue = nullMarkerValue;
+ }
+
+ public NullValueAwareConcurrentHashMap(Class<? extends V> nullMarkerValueClass)
+ {
+ if(nullMarkerValueClass.getName().equals(Object.class.getName()))
+ {
+ //noinspection unchecked
+ nullMarkerValue = (V)new DefaultNullMarker();
+ }
+ else if(nullMarkerValueClass.getName().equals(String.class.getName()))
+ {
+ //noinspection unchecked
+ nullMarkerValue = (V)"{null}";
+ }
+ else if(nullMarkerValueClass.getName().equals(Class.class.getName()))
+ {
+ //noinspection unchecked
+ nullMarkerValue = (V)Void.class.getClass();
+ }
+ else
+ {
+ nullMarkerValue = ClassUtils.tryToInstantiateClass(nullMarkerValueClass);
+ }
+ }
+
+ @Override
+ public V put(K key, V value)
+ {
+ if(value == null)
+ {
+ return super.put(key, nullMarkerValue);
+ }
+ return super.put(key, value);
+ }
+
+ @Override
+ public V get(Object key)
+ {
+ V result = super.get(key);
+
+ if(nullMarkerValue.equals(result))
+ {
+ return null;
+ }
+
+ return result;
+ }
+
+ private class DefaultNullMarker
+ {
+ }
+}