Author: nbelaevski
Date: 2011-02-03 09:15:25 -0500 (Thu, 03 Feb 2011)
New Revision: 21418
Added:
trunk/ui/input/api/src/main/java/org/richfaces/component/AutocompleteMode.java
Modified:
trunk/ui/common/ui/src/main/java/org/richfaces/component/util/InputUtils.java
trunk/ui/input/ui/src/main/java/org/richfaces/component/AbstractAutocomplete.java
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteRendererBase.java
trunk/ui/input/ui/src/main/templates/autocomplete.template.xml
Log:
https://issues.jboss.org/browse/RF-10388
https://issues.jboss.org/browse/RF-10425
Modified: trunk/ui/common/ui/src/main/java/org/richfaces/component/util/InputUtils.java
===================================================================
---
trunk/ui/common/ui/src/main/java/org/richfaces/component/util/InputUtils.java 2011-02-03
13:43:02 UTC (rev 21417)
+++
trunk/ui/common/ui/src/main/java/org/richfaces/component/util/InputUtils.java 2011-02-03
14:15:25 UTC (rev 21418)
@@ -21,7 +21,7 @@
package org.richfaces.component.util;
-import org.ajax4jsf.Messages;
+import java.io.Serializable;
import javax.el.ValueExpression;
import javax.faces.component.UIComponent;
@@ -29,8 +29,9 @@
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
-import java.io.Serializable;
+import org.ajax4jsf.Messages;
+
/**
* @author Maksim Kaszynski
* @author Manfred Geiler
@@ -59,6 +60,15 @@
return isTrue(component.getAttributes().get("readonly"));
}
+ public static Converter getConverterForType(FacesContext context, Class<?>
type) {
+ //see getConvertedValue
+ if (type == null || Object.class.equals(type)) {
+ return null;
+ }
+
+ return context.getApplication().createConverter(type);
+ }
+
public static Object getConvertedValue(FacesContext context, UIComponent component,
Object submittedValue)
throws ConverterException {
String newValue = (String) submittedValue;
@@ -72,6 +82,7 @@
if ((converter == null) && (valueExpression != null)) {
Class converterType = valueExpression.getType(context.getELContext());
+ //see getConverterForType
if ((converterType == null) || (converterType == Object.class)) {
return newValue;
} else {
Added: trunk/ui/input/api/src/main/java/org/richfaces/component/AutocompleteMode.java
===================================================================
--- trunk/ui/input/api/src/main/java/org/richfaces/component/AutocompleteMode.java
(rev 0)
+++
trunk/ui/input/api/src/main/java/org/richfaces/component/AutocompleteMode.java 2011-02-03
14:15:25 UTC (rev 21418)
@@ -0,0 +1,34 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2011, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.component;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public enum AutocompleteMode {
+
+ client, lazyClient, ajax, cachedAjax;
+
+ public static final AutocompleteMode DEFAULT = cachedAjax;
+
+}
Modified:
trunk/ui/input/ui/src/main/java/org/richfaces/component/AbstractAutocomplete.java
===================================================================
---
trunk/ui/input/ui/src/main/java/org/richfaces/component/AbstractAutocomplete.java 2011-02-03
13:43:02 UTC (rev 21417)
+++
trunk/ui/input/ui/src/main/java/org/richfaces/component/AbstractAutocomplete.java 2011-02-03
14:15:25 UTC (rev 21418)
@@ -24,8 +24,6 @@
import java.io.IOException;
import javax.el.MethodExpression;
-import javax.el.ValueExpression;
-import javax.faces.application.Application;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.component.visit.VisitCallback;
@@ -34,7 +32,6 @@
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
-import org.richfaces.application.ServiceTracker;
import org.richfaces.cdk.annotations.Attribute;
import org.richfaces.cdk.annotations.EventName;
import org.richfaces.cdk.annotations.JsfComponent;
@@ -44,7 +41,6 @@
import org.richfaces.cdk.annotations.TagType;
import org.richfaces.context.ExtendedVisitContext;
import org.richfaces.context.ExtendedVisitContextMode;
-import org.richfaces.el.GenericsIntrospectionService;
import org.richfaces.renderkit.MetaComponentRenderer;
/**
@@ -87,7 +83,7 @@
public abstract String getSelectedItemClass();
@Attribute
- public abstract String getMode();
+ public abstract AutocompleteMode getMode();
@Attribute
public abstract String getLayout();
@@ -197,39 +193,6 @@
@Attribute
public abstract String getClientFilterFunction();
- @Override
- public Converter getConverter() {
- Converter converter = super.getConverter();
- if (converter == null) {
- converter = getConverterForValue(FacesContext.getCurrentInstance());
- }
-
- return converter;
- }
-
- private Converter getConverterForType(FacesContext context, Class<?> type) {
-
- if (!Object.class.equals(type) && type != null) {
- Application application = context.getApplication();
- return application.createConverter(type);
- }
-
- return null;
- }
-
- public Converter getConverterForValue(FacesContext context) {
- Converter converter = null;
- ValueExpression expression = this.getValueExpression("value");
-
- if (expression != null) {
- Class<?> containerClass = ServiceTracker.getService(context,
GenericsIntrospectionService.class).getContainerClass(context, expression);
-
- converter = getConverterForType(context, containerClass);
- }
-
- return converter;
- }
-
public String resolveClientId(FacesContext facesContext, UIComponent
contextComponent, String metaComponentId) {
if (ITEMS_META_COMPONENT_ID.equals(metaComponentId)) {
return getClientId(facesContext) +
MetaComponentResolver.META_COMPONENT_SEPARATOR_CHAR + metaComponentId;
Modified:
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteRendererBase.java
===================================================================
---
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteRendererBase.java 2011-02-03
13:43:02 UTC (rev 21417)
+++
trunk/ui/input/ui/src/main/java/org/richfaces/renderkit/AutocompleteRendererBase.java 2011-02-03
14:15:25 UTC (rev 21418)
@@ -32,6 +32,7 @@
import javax.el.ExpressionFactory;
import javax.el.MethodExpression;
import javax.el.MethodNotFoundException;
+import javax.el.ValueExpression;
import javax.faces.application.ResourceDependencies;
import javax.faces.application.ResourceDependency;
import javax.faces.component.UIComponent;
@@ -39,6 +40,8 @@
import javax.faces.context.PartialResponseWriter;
import javax.faces.context.PartialViewContext;
import javax.faces.context.ResponseWriter;
+import javax.faces.convert.Converter;
+import javax.faces.convert.ConverterException;
import javax.faces.model.ArrayDataModel;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
@@ -48,11 +51,14 @@
import org.ajax4jsf.javascript.JSObject;
import org.ajax4jsf.javascript.JSReference;
+import org.richfaces.application.ServiceTracker;
import org.richfaces.component.AbstractAutocomplete;
import org.richfaces.component.AutocompleteLayout;
+import org.richfaces.component.AutocompleteMode;
import org.richfaces.component.MetaComponentResolver;
import org.richfaces.component.util.InputUtils;
import org.richfaces.context.ExtendedPartialViewContext;
+import org.richfaces.el.GenericsIntrospectionService;
import org.richfaces.log.Logger;
import org.richfaces.log.RichfacesLogger;
@@ -193,8 +199,8 @@
protected void encodeItemsContainer(FacesContext facesContext, UIComponent component)
throws IOException {
AutocompleteEncodeStrategy strategy = getStrategy(component);
- Object mode = component.getAttributes().get("mode");
- if (mode != null && mode.equals("client")) {
+ AutocompleteMode mode = (AutocompleteMode)
component.getAttributes().get("mode");
+ if (mode != null && mode == AutocompleteMode.client) {
List<Object> fetchValues = new ArrayList<Object>();
this.encodeItems(facesContext, component, fetchValues);
this.encodeFetchValues(facesContext, component, fetchValues);
@@ -264,16 +270,11 @@
return;
}
Map<String, String> requestParameters =
context.getExternalContext().getRequestParameterMap();
- Object value = requestParameters.get(component.getClientId(context) +
"Value");
+ String value = requestParameters.get(component.getClientId(context) +
"Value");
if (value != null) {
- if (autocomplete.getConverter() != null) {
- value = autocomplete.getConverter().getAsObject(context, component,
value.toString());
- }
autocomplete.setSubmittedValue(value);
}
- super.doDecode(context, component);
-
if (requestParameters.get(component.getClientId(context) + ".ajax") !=
null) {
PartialViewContext pvc = context.getPartialViewContext();
pvc.getRenderIds().add(
@@ -318,4 +319,28 @@
}
return value;
}
+
+ private Converter getConverterForValue(FacesContext context, UIComponent component)
{
+ Converter converter = null;
+ ValueExpression expression = component.getValueExpression("value");
+
+ if (expression != null) {
+ Class<?> containerClass = ServiceTracker.getService(context,
GenericsIntrospectionService.class).getContainerClass(context, expression);
+
+ converter = InputUtils.getConverterForType(context, containerClass);
+ }
+
+ return converter;
+ }
+
+ @Override
+ public Object getConvertedValue(FacesContext context, UIComponent component, Object
val) throws ConverterException {
+ String s = (String) val;
+ Converter converter = getConverterForValue(context, component);
+ if (converter != null) {
+ return converter.getAsObject(context, component, s);
+ } else {
+ return s;
+ }
+ }
}
Modified: trunk/ui/input/ui/src/main/templates/autocomplete.template.xml
===================================================================
--- trunk/ui/input/ui/src/main/templates/autocomplete.template.xml 2011-02-03 13:43:02 UTC
(rev 21417)
+++ trunk/ui/input/ui/src/main/templates/autocomplete.template.xml 2011-02-03 14:15:25 UTC
(rev 21418)
@@ -11,6 +11,8 @@
<cdk:renderer-type>org.richfaces.AutocompleteRenderer
</cdk:renderer-type>
<cdk:renders-children>true</cdk:renders-children>
+
+ <cdk:import package="org.richfaces.component"
names="AutocompleteMode.*" static="true" />
</cc:interface>
<cc:implementation>
@@ -78,9 +80,9 @@
<cdk:scriptOption attributes="onbegin oncomplete onerror
onbeforedomupdate onchange onselectitem onfocus onblur"
wrapper="eventHandler"/>
<cdk:scriptOption name="minChars"
value="#{getMinCharsOrDefault(component)}" />
<cdk:scriptOption name="filterFunction"
value="#{getClientFilterFunction(component)}" />
- <cdk:scriptOption name="isCachedAjax"
value="#{'ajax'==mode ? false : true}" defaultValue="true"
/>
- <cdk:scriptOption name="ajaxMode"
value="#{'client'==mode||'lazyClient'==mode ? false : true}"
defaultValue="true" />
- <cdk:scriptOption name="lazyClientMode"
value="#{'lazyClient'==mode ? true : false}"
defaultValue="false" />
+ <cdk:scriptOption name="isCachedAjax" value="#{ajax
== mode ? false : true}" defaultValue="true" />
+ <cdk:scriptOption name="ajaxMode" value="#{client == mode ||
lazyClient == mode ? false : true}" defaultValue="true" />
+ <cdk:scriptOption name="lazyClientMode" value="#{lazyClient ==
mode ? true : false}" defaultValue="false" />
</cdk:scriptObject>
new RichFaces.ui.Autocomplete("#{clientId}",
"#{clientId}Input", #{toScriptArgs(options)}