Author: alexsmirnov
Date: 2010-10-20 20:19:03 -0400 (Wed, 20 Oct 2010)
New Revision: 19621
Added:
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/AjaxOnlyScript.java
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ClientAndAjaxScript.java
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ClientOnlyScript.java
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/NoSuchComponentException.java
Modified:
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/UIValidatorScript.java
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ClientValidatorRenderer.java
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ComponentValidatorScript.java
Log:
OPEN - issue RF-9507: ClientValidatorRendererunit tests and implementation.
https://jira.jboss.org/browse/RF-9507
Modified:
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/UIValidatorScript.java
===================================================================
---
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/UIValidatorScript.java 2010-10-20
18:32:23 UTC (rev 19620)
+++
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/component/UIValidatorScript.java 2010-10-21
00:19:03 UTC (rev 19621)
@@ -43,8 +43,9 @@
return null;
}
- public String addScript(ComponentValidatorScript script){
+
+ public ComponentValidatorScript addOrFindScript(ComponentValidatorScript
validatorScript) {
+ // TODO Auto-generated method stub
return null;
-
}
}
Added:
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/AjaxOnlyScript.java
===================================================================
---
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/AjaxOnlyScript.java
(rev 0)
+++
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/AjaxOnlyScript.java 2010-10-21
00:19:03 UTC (rev 19621)
@@ -0,0 +1,34 @@
+package org.richfaces.renderkit.html;
+
+import java.util.Collection;
+
+import org.richfaces.validator.LibraryResource;
+
+public class AjaxOnlyScript implements ComponentValidatorScript {
+
+ public String toScript() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public void appendScript(StringBuffer functionString) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public String getName() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public Collection<LibraryResource> getResources() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public String createCallScript(String clientId) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
Property changes on:
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/AjaxOnlyScript.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added:
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ClientAndAjaxScript.java
===================================================================
---
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ClientAndAjaxScript.java
(rev 0)
+++
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ClientAndAjaxScript.java 2010-10-21
00:19:03 UTC (rev 19621)
@@ -0,0 +1,39 @@
+package org.richfaces.renderkit.html;
+
+import java.util.Collection;
+
+import org.richfaces.validator.LibraryResource;
+
+public class ClientAndAjaxScript implements ComponentValidatorScript {
+
+ public ClientAndAjaxScript(LibraryScriptFunction clientSideConverterScript,
+ Collection<LibraryScriptFunction> validatorScripts, String ajaxScript) {
+ // TODO Auto-generated constructor stub
+ }
+
+ public String toScript() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public void appendScript(StringBuffer functionString) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public String getName() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public Collection<LibraryResource> getResources() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public String createCallScript(String clientId) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
Property changes on:
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ClientAndAjaxScript.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added:
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ClientOnlyScript.java
===================================================================
---
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ClientOnlyScript.java
(rev 0)
+++
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ClientOnlyScript.java 2010-10-21
00:19:03 UTC (rev 19621)
@@ -0,0 +1,39 @@
+package org.richfaces.renderkit.html;
+
+import java.util.Collection;
+
+import org.richfaces.validator.LibraryResource;
+
+public class ClientOnlyScript implements ComponentValidatorScript {
+
+ public ClientOnlyScript(LibraryScriptFunction clientSideConverterScript,
+ Collection<LibraryScriptFunction> validatorScripts) {
+ // TODO Auto-generated constructor stub
+ }
+
+ public String toScript() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public void appendScript(StringBuffer functionString) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public String getName() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public Collection<LibraryResource> getResources() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public String createCallScript(String clientId) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
Property changes on:
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ClientOnlyScript.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified:
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ClientValidatorRenderer.java
===================================================================
---
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ClientValidatorRenderer.java 2010-10-20
18:32:23 UTC (rev 19620)
+++
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ClientValidatorRenderer.java 2010-10-21
00:19:03 UTC (rev 19621)
@@ -3,86 +3,223 @@
//
// Imports
//
+import java.util.Collection;
+import java.util.List;
+
import javax.faces.FacesException;
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIViewRoot;
import javax.faces.component.behavior.ClientBehavior;
import javax.faces.component.behavior.ClientBehaviorContext;
import javax.faces.context.FacesContext;
import javax.faces.render.ClientBehaviorRenderer;
+import org.ajax4jsf.javascript.JSLiteral;
+import org.richfaces.application.ServiceTracker;
import org.richfaces.component.UIValidatorScript;
import org.richfaces.component.behavior.ClientValidatorBehavior;
+import org.richfaces.component.behavior.ConverterNotFoundException;
+import org.richfaces.validator.ClientScriptService;
import org.richfaces.validator.ConverterDescriptor;
+import org.richfaces.validator.LibraryScript;
import org.richfaces.validator.ScriptNotFoundException;
import org.richfaces.validator.ValidatorDescriptor;
+import com.google.common.collect.Lists;
+
/**
* Renderer for component class org.richfaces.renderkit.html.AjaxValidatorRenderer
*/
public class ClientValidatorRenderer extends ClientBehaviorRenderer {
+
public static final String RENDERER_TYPE =
"org.richfaces.ClientValidatorRenderer";
-
+
public static final String VALUE_VAR = "value";
public static final String CONVERTED_VALUE_VAR = "convertedValue";
+ public static final JSLiteral VALUE_LITERAL = new JSLiteral("value");
+
+ public static final JSLiteral CONVERTED_VALUE_LITERAL = new
JSLiteral("convertedValue");
+
public ClientValidatorRenderer() {
super();
}
@Override
public String getScript(ClientBehaviorContext behaviorContext, ClientBehavior
behavior) {
+ if (null == behaviorContext) {
+ throw new NullPointerException();
+ }
+ if (null == behavior) {
+ throw new NullPointerException();
+ }
if (behavior instanceof ClientValidatorBehavior) {
ClientValidatorBehavior clientValidator = (ClientValidatorBehavior)
behavior;
-
+ return buildAndStoreValidatorScript(behaviorContext, clientValidator);
} else {
throw new FacesException(
"ClientBehavior for ClientValidatorRenderer does not implement
ClientValidatorBehavior interface");
}
- return null;
}
-
+
/**
- * <p class="changed_added_4_0">This method builds client-side
validation script and stores it in View resource component</p>
+ * <p class="changed_added_4_0">
+ * This method builds client-side validation script and stores it in View resource
component
+ * </p>
+ *
* @param behaviorContext
* @param behavior
- * @return name of the JavaScript function to call
+ * @return name of the JavaScript function to call
*/
- String buildAndStoreValidatorScript(ClientBehaviorContext behaviorContext,
ClientValidatorBehavior behavior){
- return null;
+ String buildAndStoreValidatorScript(ClientBehaviorContext behaviorContext,
ClientValidatorBehavior behavior) {
+ ComponentValidatorScript validatorScript = createValidatorScript(behaviorContext,
behavior);
+ if (null != validatorScript) {
+ FacesContext facesContext = behaviorContext.getFacesContext();
+ UIValidatorScript scriptResource =
getOrCreateValidatorScriptResource(facesContext);
+ validatorScript = scriptResource.addOrFindScript(validatorScript);
+ return
validatorScript.createCallScript(behaviorContext.getComponent().getClientId(facesContext));
+ } else {
+ return null;
+ }
}
-
- UIValidatorScript getOrCreateValidatorScriptResource(FacesContext facesContext){
- return null;
+
+ /**
+ * <p class="changed_added_4_0">
+ * This method looks for {@link UIValidatorScript} component in view resource. If
such resource not found, it
+ * creates a new instance and stores it in {@link UIViewRoot} view resource with
default target.
+ * </p>
+ *
+ * @param facesContext
+ * @return
+ */
+ UIValidatorScript getOrCreateValidatorScriptResource(FacesContext facesContext) {
+ UIViewRoot viewRoot = facesContext.getViewRoot();
+ if (null == viewRoot) {
+ throw new FacesException("View is not created");
+ }
+ List<UIComponent> componentResources =
viewRoot.getComponentResources(facesContext, "form");
+ try {
+ return findScriptResource(componentResources);
+ } catch (NoSuchComponentException e) {
+ componentResources = viewRoot.getComponentResources(facesContext,
"body");
+ try {
+ return findScriptResource(componentResources);
+ } catch (NoSuchComponentException e1) {
+ UIValidatorScript component =
+ (UIValidatorScript)
facesContext.getApplication().createComponent(UIValidatorScript.COMPONENT_TYPE);
+ viewRoot.addComponentResource(facesContext, component);
+ return component;
+ }
+ }
}
-
+ private UIValidatorScript findScriptResource(List<UIComponent>
componentResources) throws NoSuchComponentException {
+ for (UIComponent uiComponent : componentResources) {
+ if (uiComponent instanceof UIValidatorScript) {
+ UIValidatorScript script = (UIValidatorScript) uiComponent;
+ return script;
+ }
+ }
+ throw new NoSuchComponentException();
+ }
+
ComponentValidatorScript createValidatorScript(ClientBehaviorContext
behaviorContext,
ClientValidatorBehavior behavior) {
- return null;
+ Collection<ValidatorDescriptor> validators =
behavior.getValidators(behaviorContext);
+ if (!validators.isEmpty()) {
+ try {
+ ConverterDescriptor converter = behavior.getConverter(behaviorContext);
+ if (null != converter) {
+ try {
+ LibraryScriptFunction clientSideConverterScript =
+ getClientSideConverterScript(behaviorContext, converter);
+ return createValidatorScript(behaviorContext, behavior,
validators, clientSideConverterScript);
+ } catch (ScriptNotFoundException e) {
+ // ajax-only validation
+ return new AjaxOnlyScript();
+ }
+ } else {
+ return createValidatorScript(behaviorContext, behavior, validators,
null);
+ }
+ } catch (ConverterNotFoundException e) {
+ throw new FacesException(e);
+ }
+ } else {
+ // No validation required.
+ return null;
+ }
}
+ private ComponentValidatorScript createValidatorScript(ClientBehaviorContext
behaviorContext,
+ ClientValidatorBehavior behavior, Collection<ValidatorDescriptor>
validators,
+ LibraryScriptFunction clientSideConverterScript) {
+ Collection<LibraryScriptFunction> validatorScripts =
getClientSideValidatorScript(behaviorContext, validators);
+ if (validatorScripts.isEmpty()) {
+ return new AjaxOnlyScript();
+ } else if (validatorScripts.size() < validators.size()) {
+ return new ClientAndAjaxScript(clientSideConverterScript, validatorScripts,
+ behavior.getAjaxScript(behaviorContext));
+ } else {
+ return new ClientOnlyScript(clientSideConverterScript, validatorScripts);
+ }
+ }
+
/**
- * <p class="changed_added_4_0">Build client-side function call for
Server-side component descriptor.</p>
+ * <p class="changed_added_4_0">
+ * Build client-side function call for Server-side component descriptor.
+ * </p>
+ *
* @param behaviorContext
* @param validator
* @return
* @throws ScriptNotFoundException
*/
- LibraryScriptFunction getClientSideConverterScript(ClientBehaviorContext
behaviorContext, ConverterDescriptor converter)
- throws ScriptNotFoundException {
- return null;
+ /**
+ * <p class="changed_added_4_0">
+ * </p>
+ *
+ * @param behaviorContext
+ * @param converter
+ * @return
+ * @throws ScriptNotFoundException
+ */
+ LibraryScriptFunction getClientSideConverterScript(ClientBehaviorContext
behaviorContext,
+ ConverterDescriptor converter) throws ScriptNotFoundException {
+ ClientScriptService clientScriptService =
+ ServiceTracker.getService(behaviorContext.getFacesContext(),
ClientScriptService.class);
+ return createClientFunction(converter, VALUE_LITERAL, clientScriptService);
}
+ private LibraryScriptFunction createClientFunction(ValidatorDescriptor descriptor,
JSLiteral variable,
+ ClientScriptService clientScriptService) throws ScriptNotFoundException {
+ LibraryScript script =
clientScriptService.getScript(descriptor.getValidatorClass());
+ return new LibraryScriptFunction(script, variable, descriptor.getMessage(),
descriptor.getValidatorParameters());
+ }
+
/**
- * <p class="changed_added_4_0">Build client-side function call for
Server-side component descriptor.</p>
+ * <p class="changed_added_4_0">
+ * Build client-side function call for Server-side component descriptor.
+ * </p>
+ *
* @param behaviorContext
- * @param validator
+ * @param validators
* @return
* @throws ScriptNotFoundException
*/
- LibraryScriptFunction getClientSideValidatorScript(ClientBehaviorContext
behaviorContext, ValidatorDescriptor validator)
- throws ScriptNotFoundException {
- return null;
+ Collection<LibraryScriptFunction>
getClientSideValidatorScript(ClientBehaviorContext behaviorContext,
+ Collection<ValidatorDescriptor> validators) {
+ ClientScriptService clientScriptService =
+ ServiceTracker.getService(behaviorContext.getFacesContext(),
ClientScriptService.class);
+ List<LibraryScriptFunction> scripts = Lists.newArrayList();
+ for (ValidatorDescriptor validator : validators) {
+ try {
+ scripts.add(createClientFunction(validator, CONVERTED_VALUE_LITERAL,
clientScriptService));
+ } catch (ScriptNotFoundException e) {
+ // Skip this validator for AJAX call.
+ }
+ }
+ return scripts;
}
}
Modified:
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ComponentValidatorScript.java
===================================================================
---
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ComponentValidatorScript.java 2010-10-20
18:32:23 UTC (rev 19620)
+++
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/ComponentValidatorScript.java 2010-10-21
00:19:03 UTC (rev 19621)
@@ -9,6 +9,13 @@
String getName();
- Collection<LibraryResource> getResources();
+ Collection<LibraryResource> getResources();
+
+ /**
+ * <p class="changed_added_4_0">Creates JavasCript that calls
validator function.</p>
+ * @param clientId
+ * @return
+ */
+ String createCallScript(String clientId);
}
Added:
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/NoSuchComponentException.java
===================================================================
---
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/NoSuchComponentException.java
(rev 0)
+++
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/NoSuchComponentException.java 2010-10-21
00:19:03 UTC (rev 19621)
@@ -0,0 +1,24 @@
+package org.richfaces.renderkit.html;
+
+public class NoSuchComponentException extends Exception {
+
+ public NoSuchComponentException() {
+ // TODO Auto-generated constructor stub
+ }
+
+ public NoSuchComponentException(String message) {
+ super(message);
+ // TODO Auto-generated constructor stub
+ }
+
+ public NoSuchComponentException(Throwable cause) {
+ super(cause);
+ // TODO Auto-generated constructor stub
+ }
+
+ public NoSuchComponentException(String message, Throwable cause) {
+ super(message, cause);
+ // TODO Auto-generated constructor stub
+ }
+
+}
Property changes on:
branches/RF-8742/ui/validator/ui/src/main/java/org/richfaces/renderkit/html/NoSuchComponentException.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain