Author: abelevich
Date: 2010-05-18 11:12:00 -0400 (Tue, 18 May 2010)
New Revision: 17100
Added:
root/ui/core/trunk/api/src/main/java/org/ajax4jsf/component/behavior/MethodExpressionAjaxBehaviorListener.java
root/ui/core/trunk/api/src/main/java/org/richfaces/view/facelets/tag/AjaxBehaviorRule.java
Modified:
root/ui/core/trunk/api/src/main/java/org/ajax4jsf/component/behavior/AjaxBehavior.java
root/ui/core/trunk/api/src/main/java/org/richfaces/view/facelets/html/BehaviorTagHandlerDelegate.java
root/ui/core/trunk/api/src/main/java/org/richfaces/view/facelets/tag/BehaviorRule.java
Log:
add ajaxClientBehavior listeners support
Modified:
root/ui/core/trunk/api/src/main/java/org/ajax4jsf/component/behavior/AjaxBehavior.java
===================================================================
---
root/ui/core/trunk/api/src/main/java/org/ajax4jsf/component/behavior/AjaxBehavior.java 2010-05-18
14:59:11 UTC (rev 17099)
+++
root/ui/core/trunk/api/src/main/java/org/ajax4jsf/component/behavior/AjaxBehavior.java 2010-05-18
15:12:00 UTC (rev 17100)
@@ -29,6 +29,7 @@
import javax.faces.FacesException;
import javax.faces.component.behavior.ClientBehaviorHint;
+import javax.faces.event.AjaxBehaviorListener;
import org.ajax4jsf.component.AjaxClientBehavior;
import org.ajax4jsf.renderkit.AjaxRendererUtils;
@@ -36,29 +37,23 @@
import org.richfaces.cdk.annotations.Tag;
import org.richfaces.cdk.annotations.TagType;
-
/**
* @author Anton Belevich
- *
+ *
*/
-@JsfBehavior(
- id = "org.ajax4jsf.behavior.Ajax",
- tag = @Tag(name = "ajax", handler =
"org.richfaces.view.facelets.html.AjaxHandler", type = TagType.Facelets)
-)
+@JsfBehavior(id = "org.ajax4jsf.behavior.Ajax", tag = @Tag(name =
"ajax", handler = "org.richfaces.view.facelets.html.AjaxHandler", type
= TagType.Facelets))
public class AjaxBehavior extends ClientBehavior implements AjaxClientBehavior {
-
+
public static final String BEHAVIOR_ID = "org.ajax4jsf.behavior.Ajax";
-
- private static final Set<ClientBehaviorHint> HINTS =
- Collections.unmodifiableSet(EnumSet.of(ClientBehaviorHint.SUBMITTING));
-
-
+
+ private static final Set<ClientBehaviorHint> HINTS =
Collections.unmodifiableSet(EnumSet
+ .of(ClientBehaviorHint.SUBMITTING));
+
enum PropertyKeys {
- data, execute, onbeforedomupdate, onbegin, oncomplete, onerror, onevent,
- queueId, render, similarityGroupingId, status, disabled, limitRender, immediate
+ data, execute, onbeforedomupdate, onbegin, oncomplete, onerror, onevent, queueId,
render, similarityGroupingId, status, disabled, limitRender, immediate, behaviorListener
}
-
+
private static final Set<String> ALL_LIST =
Collections.singleton("@all");
private static final Set<String> FORM_LIST =
Collections.singleton("@form");
private static final Set<String> THIS_LIST =
Collections.singleton("@this");
@@ -71,54 +66,50 @@
setData(value);
} else if (compare(PropertyKeys.execute, name)) {
Set<String> set = toSet(name, value);
- if(set != null) {
+ if (set != null) {
setExecute(set);
} else {
- throw new FacesException(value
- + " : '"
- + name
+ throw new FacesException(value + " : '" + name
+ "' attribute value must be either a String or a
Collection");
}
-
+
} else if (compare(PropertyKeys.render, name)) {
Set<String> set = toSet(name, value);
- if(set != null) {
+ if (set != null) {
setRender(set);
} else {
- throw new FacesException(value
- + " : '"
- + name
+ throw new FacesException(value + " : '" + name
+ "' attribute value must be either a String or a
Collection");
}
-
+
} else if (compare(PropertyKeys.onbeforedomupdate, name)) {
- setOnbeforedomupdate((String)value);
+ setOnbeforedomupdate((String) value);
} else if (compare(PropertyKeys.onbegin, name)) {
- setOnbegin((String)value);
+ setOnbegin((String) value);
} else if (compare(PropertyKeys.oncomplete, name)) {
- setOncomplete((String)value);
+ setOncomplete((String) value);
} else if (compare(PropertyKeys.onerror, name)) {
- setOnerror((String)value);
+ setOnerror((String) value);
} else if (compare(PropertyKeys.onevent, name)) {
- setOnevent((String)value);
+ setOnevent((String) value);
} else if (compare(PropertyKeys.queueId, name)) {
- setQueueId((String)value);
+ setQueueId((String) value);
} else if (compare(PropertyKeys.similarityGroupingId, name)) {
- setSimilarityGroupingId((String)value);
+ setSimilarityGroupingId((String) value);
} else if (compare(PropertyKeys.status, name)) {
- setStatus((String)value);
+ setStatus((String) value);
} else if (compare(PropertyKeys.disabled, name)) {
- setDisabled((Boolean)value);
+ setDisabled((Boolean) value);
} else if (compare(PropertyKeys.limitRender, name)) {
- setLimitRender((Boolean)value);
- } else if(compare(PropertyKeys.immediate, name)) {
- setImmediate((Boolean)value);
+ setLimitRender((Boolean) value);
+ } else if (compare(PropertyKeys.immediate, name)) {
+ setImmediate((Boolean) value);
}
}
private Set<String> toSet(String propertyName, Object value) {
if (value instanceof String) {
- String strValue = (String)value;
+ String strValue = (String) value;
if (strValue.indexOf(' ') == -1) {
return toSingleton(propertyName, strValue);
}
@@ -126,8 +117,8 @@
}
return null;
}
-
- private static Set <String> toSingleton(String propertyName, String value) {
+
+ private static Set<String> toSingleton(String propertyName, String value) {
if ((null == value) || (value.length() == 0)) {
return null;
}
@@ -137,100 +128,97 @@
if (AjaxRendererUtils.ALL.equals(value)) {
list = ALL_LIST;
- } else if (AjaxRendererUtils.FORM.equals(value)){
+ } else if (AjaxRendererUtils.FORM.equals(value)) {
list = FORM_LIST;
} else if (AjaxRendererUtils.THIS.equals(value)) {
- list = THIS_LIST;
+ list = THIS_LIST;
} else if (AjaxRendererUtils.REGION.equals(value)) {
list = REGION_LIST;
} else if (AjaxRendererUtils.NONE.equals(value)) {
list = NONE_LIST;
} else {
- throw new FacesException(value
- + " : Invalid id keyword specified for
'"
- + propertyName
- + "' attribute");
+ throw new FacesException(value + " : Invalid id keyword specified
for '" + propertyName + "' attribute");
}
-
+
return list;
}
return Collections.singleton(value);
}
-
+
public Object getData() {
return getStateHelper().eval(PropertyKeys.data);
}
-
+
public void setData(Object data) {
getStateHelper().put(PropertyKeys.data, data);
}
public Collection<String> getExecute() {
- return (Collection<String>)getStateHelper().eval(PropertyKeys.execute);
+ return (Collection<String>) getStateHelper().eval(PropertyKeys.execute);
}
public void setExecute(Collection<String> execute) {
- getStateHelper().put(PropertyKeys.execute,execute);
+ getStateHelper().put(PropertyKeys.execute, execute);
}
public String getOnbeforedomupdate() {
- return (String)getStateHelper().eval(PropertyKeys.onbeforedomupdate);
+ return (String) getStateHelper().eval(PropertyKeys.onbeforedomupdate);
}
public void setOnbeforedomupdate(String onbeforedomupdate) {
- getStateHelper().put(PropertyKeys.onbeforedomupdate,onbeforedomupdate);
+ getStateHelper().put(PropertyKeys.onbeforedomupdate, onbeforedomupdate);
}
public String getOnbegin() {
- return (String)getStateHelper().eval(PropertyKeys.onbegin);
+ return (String) getStateHelper().eval(PropertyKeys.onbegin);
}
-
+
public void setOnbegin(String onbegin) {
getStateHelper().put(PropertyKeys.onbegin, onbegin);
}
public String getOncomplete() {
- return (String)getStateHelper().eval(PropertyKeys.oncomplete);
+ return (String) getStateHelper().eval(PropertyKeys.oncomplete);
}
-
+
public void setOncomplete(String oncomplete) {
- getStateHelper().put(PropertyKeys.oncomplete,oncomplete);
+ getStateHelper().put(PropertyKeys.oncomplete, oncomplete);
}
public String getOnerror() {
- return (String)getStateHelper().eval(PropertyKeys.onerror);
+ return (String) getStateHelper().eval(PropertyKeys.onerror);
}
-
+
public void setOnerror(String onerror) {
- getStateHelper().put(PropertyKeys.onerror,onerror);
+ getStateHelper().put(PropertyKeys.onerror, onerror);
}
public String getOnevent() {
- return (String)getStateHelper().eval(PropertyKeys.onevent);
+ return (String) getStateHelper().eval(PropertyKeys.onevent);
}
-
+
public void setOnevent(String onevent) {
- getStateHelper().put(PropertyKeys.onevent,onevent);
+ getStateHelper().put(PropertyKeys.onevent, onevent);
}
public String getQueueId() {
- return (String)getStateHelper().eval(PropertyKeys.queueId);
+ return (String) getStateHelper().eval(PropertyKeys.queueId);
}
-
+
public void setQueueId(String queueId) {
- getStateHelper().put(PropertyKeys.queueId,queueId);
+ getStateHelper().put(PropertyKeys.queueId, queueId);
}
public Collection<String> getRender() {
- return (Collection<String>)getStateHelper().eval(PropertyKeys.render);
+ return (Collection<String>) getStateHelper().eval(PropertyKeys.render);
}
-
+
public void setRender(Collection<String> render) {
getStateHelper().put(PropertyKeys.render, render);
}
public String getSimilarityGroupingId() {
- return (String)getStateHelper().eval(PropertyKeys.similarityGroupingId);
+ return (String) getStateHelper().eval(PropertyKeys.similarityGroupingId);
}
public void setSimilarityGroupingId(String similarityGroupingId) {
@@ -238,46 +226,53 @@
}
public String getStatus() {
- return (String)getStateHelper().eval(PropertyKeys.status);
+ return (String) getStateHelper().eval(PropertyKeys.status);
}
-
+
public void setStatus(String status) {
getStateHelper().put(PropertyKeys.status, status);
}
-
+
public boolean isDisabled() {
- return (Boolean)getStateHelper().eval(PropertyKeys.disabled, false);
+ return (Boolean) getStateHelper().eval(PropertyKeys.disabled, false);
}
-
+
public void setDisabled(boolean disabled) {
getStateHelper().put(PropertyKeys.disabled, disabled);
}
public boolean isLimitRender() {
- return (Boolean)getStateHelper().eval(PropertyKeys.limitRender, false);
+ return (Boolean) getStateHelper().eval(PropertyKeys.limitRender, false);
}
public void setLimitRender(boolean limitRender) {
getStateHelper().put(PropertyKeys.limitRender, limitRender);
}
-
- public boolean isImmediate(){
- return (Boolean)getStateHelper().eval(PropertyKeys.immediate, false);
+
+ public boolean isImmediate() {
+ return (Boolean) getStateHelper().eval(PropertyKeys.immediate, false);
}
public void setImmediate(boolean immediate) {
getStateHelper().put(PropertyKeys.limitRender, immediate);
}
-
+
@Override
public String getRendererType() {
return BEHAVIOR_ID;
}
-
+
@Override
public Set<ClientBehaviorHint> getHints() {
return HINTS;
}
-}
+ public void addAjaxBehaviorListener(AjaxBehaviorListener listener) {
+ addBehaviorListener(listener);
+ }
+ public void removeAjaxBehaviorListener(AjaxBehaviorListener listener) {
+ removeBehaviorListener(listener);
+ }
+
+}
Added:
root/ui/core/trunk/api/src/main/java/org/ajax4jsf/component/behavior/MethodExpressionAjaxBehaviorListener.java
===================================================================
---
root/ui/core/trunk/api/src/main/java/org/ajax4jsf/component/behavior/MethodExpressionAjaxBehaviorListener.java
(rev 0)
+++
root/ui/core/trunk/api/src/main/java/org/ajax4jsf/component/behavior/MethodExpressionAjaxBehaviorListener.java 2010-05-18
15:12:00 UTC (rev 17100)
@@ -0,0 +1,99 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright ${year}, 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.ajax4jsf.component.behavior;
+
+import javax.el.ELContext;
+import javax.el.ELException;
+import javax.el.MethodExpression;
+import javax.el.MethodNotFoundException;
+import javax.faces.context.FacesContext;
+import javax.faces.event.AbortProcessingException;
+import javax.faces.event.AjaxBehaviorEvent;
+import javax.faces.event.AjaxBehaviorListener;
+
+/**
+ * @author Anton Belevich
+ *
+ */
+public class MethodExpressionAjaxBehaviorListener implements AjaxBehaviorListener {
+
+ private static final Class<?>[] ACTION_LISTENER_ZEROARG_SIG = new Class[] {};
+
+ private MethodExpression methodExpressionOneArg = null;
+
+ private MethodExpression methodExpressionZeroArg = null;
+
+ public MethodExpressionAjaxBehaviorListener() {
+ }
+
+ public MethodExpressionAjaxBehaviorListener(MethodExpression methodExpressionOneArg)
{
+ this.methodExpressionOneArg = methodExpressionOneArg;
+
+ FacesContext context = FacesContext.getCurrentInstance();
+ ELContext elContext = context.getELContext();
+ this.methodExpressionZeroArg =
context.getApplication().getExpressionFactory().createMethodExpression(
+ elContext, methodExpressionOneArg.getExpressionString(), Void.class,
ACTION_LISTENER_ZEROARG_SIG);
+
+ }
+
+ MethodExpressionAjaxBehaviorListener(MethodExpression methodExpressionOneArg,
+ MethodExpression methodExpressionZeroArg) {
+ this.methodExpressionOneArg = methodExpressionOneArg;
+ this.methodExpressionZeroArg = methodExpressionZeroArg;
+ }
+
+ public void processAjaxBehavior(AjaxBehaviorEvent event) throws
AbortProcessingException {
+
+ Throwable cause = null;
+ Throwable thrown = null;
+
+ if (event == null) {
+ throw new NullPointerException();
+ }
+
+ FacesContext context = FacesContext.getCurrentInstance();
+ ELContext elContext = context.getELContext();
+ try {
+ methodExpressionOneArg.invoke(elContext, new Object[] { event });
+ } catch (MethodNotFoundException mnfe) {
+ if (null != methodExpressionZeroArg) {
+
+ try {
+ methodExpressionZeroArg.invoke(elContext, new Object[] {});
+ } catch (ELException ee) {
+ cause = ee.getCause();
+ thrown = ee;
+ }
+ }
+ } catch (ELException ee) {
+ cause = ee.getCause();
+ thrown = ee;
+ }
+
+ if (null != thrown) {
+ throw cause == null ? new AbortProcessingException(thrown.getMessage(),
thrown)
+ : new AbortProcessingException(thrown.getMessage(), cause);
+ }
+ }
+
+}
Modified:
root/ui/core/trunk/api/src/main/java/org/richfaces/view/facelets/html/BehaviorTagHandlerDelegate.java
===================================================================
---
root/ui/core/trunk/api/src/main/java/org/richfaces/view/facelets/html/BehaviorTagHandlerDelegate.java 2010-05-18
14:59:11 UTC (rev 17099)
+++
root/ui/core/trunk/api/src/main/java/org/richfaces/view/facelets/html/BehaviorTagHandlerDelegate.java 2010-05-18
15:12:00 UTC (rev 17100)
@@ -34,6 +34,7 @@
import javax.faces.view.facelets.TagHandlerDelegate;
import org.ajax4jsf.component.behavior.ClientBehavior;
+import org.richfaces.view.facelets.tag.AjaxBehaviorRule;
import org.richfaces.view.facelets.tag.BehaviorRule;
/**
@@ -45,9 +46,9 @@
TagHandlerDelegate wrappedHandlerDelegate;
CustomBehaviorHandler owner;
-
- private String behaviorId;
-
+
+ private String behaviorId;
+
private String eventName;
public BehaviorTagHandlerDelegate(CustomBehaviorHandler owner, TagHandlerDelegate
wrappedHandlerDelegate) {
@@ -59,35 +60,36 @@
@Override
public void apply(FaceletContext ctx, UIComponent parent) throws IOException {
-
+
if (owner.isWrapping()) {
Application application = ctx.getFacesContext().getApplication();
Behavior behavior = application.createBehavior(this.behaviorId);
-
- if(behavior instanceof ClientBehavior) {
- ClientBehavior clientBehavior = (ClientBehavior)behavior;
+
+ if (behavior instanceof ClientBehavior) {
+ ClientBehavior clientBehavior = (ClientBehavior) behavior;
owner.setAttributes(ctx, clientBehavior);
-
+
FacesContext context = ctx.getFacesContext();
BehaviorStack behaviorStack = BehaviorStack.getBehaviorStack(context,
true);
-
+
behaviorStack.pushBehavior(context, clientBehavior, this.behaviorId,
this.eventName);
-
+
owner.applyNextHandler(ctx, parent);
-
+
behaviorStack.popBehavior();
- }
-
+ }
+
} else {
- wrappedHandlerDelegate.apply(ctx, parent);
+ wrappedHandlerDelegate.apply(ctx, parent);
}
-
+
}
-
+
public MetaRuleset createMetaRuleset(Class type) {
MetaRuleset metaRuleset = wrappedHandlerDelegate.createMetaRuleset(type);
- metaRuleset.addRule(new BehaviorRule());
+ metaRuleset.addRule(BehaviorRule.INSTANCE);
+ metaRuleset.addRule(AjaxBehaviorRule.INSTANCE);
return metaRuleset;
}
Added:
root/ui/core/trunk/api/src/main/java/org/richfaces/view/facelets/tag/AjaxBehaviorRule.java
===================================================================
---
root/ui/core/trunk/api/src/main/java/org/richfaces/view/facelets/tag/AjaxBehaviorRule.java
(rev 0)
+++
root/ui/core/trunk/api/src/main/java/org/richfaces/view/facelets/tag/AjaxBehaviorRule.java 2010-05-18
15:12:00 UTC (rev 17100)
@@ -0,0 +1,71 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright ${year}, 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.view.facelets.tag;
+
+import javax.faces.event.AjaxBehaviorEvent;
+import javax.faces.view.facelets.FaceletContext;
+import javax.faces.view.facelets.MetaRule;
+import javax.faces.view.facelets.Metadata;
+import javax.faces.view.facelets.MetadataTarget;
+import javax.faces.view.facelets.TagAttribute;
+
+import org.ajax4jsf.component.AjaxClientBehavior;
+import org.ajax4jsf.component.behavior.AjaxBehavior;
+import org.ajax4jsf.component.behavior.MethodExpressionAjaxBehaviorListener;
+
+/**
+ * @author Anton Belevich
+ *
+ */
+public class AjaxBehaviorRule extends MetaRule {
+
+ public static final Class<?>[] AJAX_BEHAVIOR_LISTENER_SIG = new Class[] {
AjaxBehaviorEvent.class };
+
+ public static final AjaxBehaviorRule INSTANCE = new AjaxBehaviorRule();
+
+ @Override
+ public Metadata applyRule(String name, TagAttribute attribute, MetadataTarget meta)
{
+ if (meta.isTargetInstanceOf(AjaxBehavior.class)) {
+ if ("ajaxBehaviorListener".equals(name)) {
+ return new AjaxBehaviorListenerMapper(attribute);
+ }
+ }
+
+ return null;
+ }
+
+ public static final class AjaxBehaviorListenerMapper extends Metadata {
+
+ private final TagAttribute attr;
+
+ public AjaxBehaviorListenerMapper(TagAttribute attr) {
+ this.attr = attr;
+ }
+
+ public void applyMetadata(FaceletContext ctx, Object instance) {
+ ((AjaxClientBehavior) instance).addAjaxBehaviorListener(new
MethodExpressionAjaxBehaviorListener(this.attr
+ .getMethodExpression(ctx, null,
AjaxBehaviorRule.AJAX_BEHAVIOR_LISTENER_SIG)));
+ }
+ }
+
+}
Modified:
root/ui/core/trunk/api/src/main/java/org/richfaces/view/facelets/tag/BehaviorRule.java
===================================================================
---
root/ui/core/trunk/api/src/main/java/org/richfaces/view/facelets/tag/BehaviorRule.java 2010-05-18
14:59:11 UTC (rev 17099)
+++
root/ui/core/trunk/api/src/main/java/org/richfaces/view/facelets/tag/BehaviorRule.java 2010-05-18
15:12:00 UTC (rev 17100)
@@ -38,14 +38,14 @@
*/
public class BehaviorRule extends MetaRule {
+ public static final BehaviorRule INSTANCE = new BehaviorRule();
+
private static Logger log = RichfacesLogger.CONNECTION.getLogger();
static final class LiteralAttributeMetadata extends Metadata {
private final String name;
private final String value;
-
-
public LiteralAttributeMetadata(String name, String value) {
this.value = value;
@@ -87,25 +87,24 @@
type = Object.class;
}
return new ValueExpressionMetadata(name, type, attribute);
- } else
-
- if(meta != null) {
-
- if (meta.getWriteMethod(name) != null) {
- if("execute".equals(name) ||
"render".equals(name)) {
- return new LiteralAttributeMetadata(name,
attribute.getValue());
- }
-
- } else {
- if (log.isDebugEnabled()) {
- log
- .debug(attribute + " Property '" + name +
"' is not on type: "
- + meta.getTargetClass().getName());
- }
+ } else
+
+ if (meta != null) {
+
+ if (meta.getWriteMethod(name) != null) {
+ if ("execute".equals(name) ||
"render".equals(name)) {
return new LiteralAttributeMetadata(name, attribute.getValue());
}
-
+
+ } else {
+ if (log.isDebugEnabled()) {
+ log.debug(attribute + " Property '" + name +
"' is not on type: "
+ + meta.getTargetClass().getName());
+ }
+ return new LiteralAttributeMetadata(name, attribute.getValue());
}
+
+ }
}
return null;