Repository: deltaspike Updated Branches: refs/heads/master d6923f276 -> 8a08cddd7
DELTASPIKE-426 fallback for full state-saving Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/8a08cddd Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/8a08cddd Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/8a08cddd Branch: refs/heads/master Commit: 8a08cddd7e7551f2c7faad19fbc67e1407379e70 Parents: d6923f2 Author: gpetracek <[email protected]> Authored: Wed Mar 12 15:43:48 2014 +0100 Committer: gpetracek <[email protected]> Committed: Wed Mar 12 15:43:48 2014 +0100 ---------------------------------------------------------------------- .../AbstractContextualReferenceWrapper.java | 20 ++++++++++++++++++-- .../jsf/impl/injection/ConverterWrapper.java | 19 +++++++++++++++++++ .../jsf/impl/injection/ValidatorWrapper.java | 14 ++++++++++++++ 3 files changed, 51 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/deltaspike/blob/8a08cddd/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/AbstractContextualReferenceWrapper.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/AbstractContextualReferenceWrapper.java b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/AbstractContextualReferenceWrapper.java index a60d1f6..62aca8f 100644 --- a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/AbstractContextualReferenceWrapper.java +++ b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/AbstractContextualReferenceWrapper.java @@ -105,10 +105,24 @@ abstract class AbstractContextualReferenceWrapper<T> implements PartialStateHold if (this.wrapped == null) //fallback for full state-saving { - //TODO check for @FacesConverter/@FacesValidator - //-> delegate to javax.faces.application.Application (+ unwrap it - since it will be wrapped again) + Class wrappedClass = ClassUtils.tryToLoadClassForName((String)wrappedState[0]); + + T resolvedInstance = resolveInstanceForClass(context, wrappedClass); + + //TODO re-visit logic for multiple (custom) wrappers + if (resolvedInstance instanceof AbstractContextualReferenceWrapper) + { + resolvedInstance = ((AbstractContextualReferenceWrapper<T>)resolvedInstance).getWrapped(); + } + this.wrapped = resolvedInstance; + } + + if (this.wrapped == null) + { this.wrapped = (T)ClassUtils.tryToInstantiateClassForName((String)wrappedState[0]); + BeanProvider.injectFields(this.wrapped); } + if (this.wrapped instanceof StateHolder) { ((StateHolder) this.wrapped).restoreState(context, wrappedState[1]); @@ -135,4 +149,6 @@ abstract class AbstractContextualReferenceWrapper<T> implements PartialStateHold { return this.wrapped; } + + protected abstract T resolveInstanceForClass(FacesContext facesContext, Class<?> wrappedClass); } http://git-wip-us.apache.org/repos/asf/deltaspike/blob/8a08cddd/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/ConverterWrapper.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/ConverterWrapper.java b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/ConverterWrapper.java index 187f7a4..3f59748 100644 --- a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/ConverterWrapper.java +++ b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/ConverterWrapper.java @@ -22,6 +22,7 @@ import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.convert.Converter; import javax.faces.convert.ConverterException; +import javax.faces.convert.FacesConverter; public class ConverterWrapper extends AbstractContextualReferenceWrapper<Converter> implements Converter { @@ -45,4 +46,22 @@ public class ConverterWrapper extends AbstractContextualReferenceWrapper<Convert { return getWrapped().getAsString(facesContext, component, value); } + + @Override + protected Converter resolveInstanceForClass(FacesContext facesContext, Class<?> wrappedClass) + { + FacesConverter facesConverter = wrappedClass.getAnnotation(FacesConverter.class); + + if (facesConverter == null) + { + return null; + } + + if (!"".equals(facesConverter.value())) + { + return facesContext.getApplication().createConverter(facesConverter.value()); + } + + return facesContext.getApplication().createConverter(facesConverter.forClass()); + } } http://git-wip-us.apache.org/repos/asf/deltaspike/blob/8a08cddd/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/ValidatorWrapper.java ---------------------------------------------------------------------- diff --git a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/ValidatorWrapper.java b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/ValidatorWrapper.java index 96bee8e..d92b38b 100644 --- a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/ValidatorWrapper.java +++ b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/injection/ValidatorWrapper.java @@ -20,6 +20,7 @@ package org.apache.deltaspike.jsf.impl.injection; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; +import javax.faces.validator.FacesValidator; import javax.faces.validator.Validator; import javax.faces.validator.ValidatorException; @@ -39,4 +40,17 @@ public class ValidatorWrapper extends AbstractContextualReferenceWrapper<Validat { getWrapped().validate(facesContext, component, value); } + + @Override + protected Validator resolveInstanceForClass(FacesContext facesContext, Class<?> wrappedClass) + { + FacesValidator facesValidator = wrappedClass.getAnnotation(FacesValidator.class); + + if (facesValidator == null) + { + return null; + } + + return facesContext.getApplication().createValidator(facesValidator.value()); + } }
