Author: nbelaevski
Date: 2009-10-23 18:46:56 -0400 (Fri, 23 Oct 2009)
New Revision: 15753
Added:
root/ui/trunk/components/core/src/main/java/org/ajax4jsf/facelets/tag/BehaviorStack.java
root/ui/trunk/components/core/src/main/java/org/ajax4jsf/facelets/tag/BehaviorsAddingComponentHandlerWrapper.java
root/ui/trunk/components/core/src/main/java/org/ajax4jsf/facelets/tag/BehaviorsTagHandlerDelegateFactoryImpl.java
root/ui/trunk/components/core/src/main/resources/META-INF/behaviors.faces-config.xml
Modified:
root/ui/trunk/components/core/src/main/java/org/ajax4jsf/component/behavior/AjaxBehavior.java
root/ui/trunk/components/core/src/main/java/org/ajax4jsf/facelets/tag/AjaxHandler.java
Log:
https://jira.jboss.org/jira/browse/RF-7828
Modified:
root/ui/trunk/components/core/src/main/java/org/ajax4jsf/component/behavior/AjaxBehavior.java
===================================================================
---
root/ui/trunk/components/core/src/main/java/org/ajax4jsf/component/behavior/AjaxBehavior.java 2009-10-23
16:32:23 UTC (rev 15752)
+++
root/ui/trunk/components/core/src/main/java/org/ajax4jsf/component/behavior/AjaxBehavior.java 2009-10-23
22:46:56 UTC (rev 15753)
@@ -16,7 +16,7 @@
*
*/
@FacesBehavior(value="org.ajax4jsf.behavior.Ajax")
-public class AjaxBehavior extends javax.faces.component.behavior.AjaxBehavior implements
AjaxClientBehavior{
+public class AjaxBehavior extends javax.faces.component.behavior.AjaxBehavior implements
AjaxClientBehavior {
public static final String BEHAVIOR_ID = "org.ajax4jsf.behavior.Ajax";
@@ -317,7 +317,7 @@
super.restoreState(context, values[0]);
if (values.length != 1) {
- this.limitRender = ((Boolean)values[1]).booleanValue();
+ this.limitRender = (Boolean)values[1];
this.execute = asSet(values[2]);
this.render = asSet(values[3]);
this.queueId = (String)values[4];
Modified:
root/ui/trunk/components/core/src/main/java/org/ajax4jsf/facelets/tag/AjaxHandler.java
===================================================================
---
root/ui/trunk/components/core/src/main/java/org/ajax4jsf/facelets/tag/AjaxHandler.java 2009-10-23
16:32:23 UTC (rev 15752)
+++
root/ui/trunk/components/core/src/main/java/org/ajax4jsf/facelets/tag/AjaxHandler.java 2009-10-23
22:46:56 UTC (rev 15753)
@@ -1,7 +1,12 @@
package org.ajax4jsf.facelets.tag;
+import java.beans.BeanDescriptor;
+import java.beans.BeanInfo;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Collection;
+import java.util.List;
+import java.util.Map;
import javax.el.ELContext;
import javax.el.MethodExpression;
@@ -12,7 +17,10 @@
import javax.faces.event.AbortProcessingException;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.event.AjaxBehaviorListener;
+import javax.faces.view.AttachedObjectHandler;
+import javax.faces.view.AttachedObjectTarget;
import javax.faces.view.BehaviorHolderAttachedObjectHandler;
+import javax.faces.view.BehaviorHolderAttachedObjectTarget;
import javax.faces.view.facelets.BehaviorConfig;
import javax.faces.view.facelets.ComponentHandler;
import javax.faces.view.facelets.CompositeFaceletHandler;
@@ -26,6 +34,12 @@
public class AjaxHandler extends TagHandler implements
BehaviorHolderAttachedObjectHandler {
+ /**
+ *
+ */
+ //TODO - is that implementation dependency?
+ private static final String JAVAX_FACES_RETARGETABLE_HANDLERS =
"javax.faces.RetargetableHandlers";
+
private final TagAttribute event;
private final TagAttribute execute;
private final TagAttribute render;
@@ -66,54 +80,74 @@
public void apply(FaceletContext fContext, UIComponent parent) throws IOException {
String eventName = getEventName();
- if(this.wrapping) {
- nextHandler.apply(fContext, parent);
+ if (this.wrapping) {
+ applyWrapping(fContext, parent, eventName);
} else {
applyNested(fContext, parent, eventName);
}
}
+
+ private static List<AttachedObjectHandler>
getOrCreateRetargetableHandlersList(UIComponent component) {
+ Map<String, Object> attrs = component.getAttributes();
+ @SuppressWarnings({"unchecked"})
+ List<AttachedObjectHandler> list = (List<AttachedObjectHandler>)
+ attrs.get(JAVAX_FACES_RETARGETABLE_HANDLERS);
+
+ if (list == null) {
+ list = new ArrayList<AttachedObjectHandler>();
+ attrs.put(JAVAX_FACES_RETARGETABLE_HANDLERS, list);
+ }
+
+ return list;
+ }
private void applyNested(FaceletContext ctx, UIComponent parent, String eventName) {
-
if (!ComponentHandler.isNew(parent)) {
return;
}
if (UIComponent.isCompositeComponent(parent)) {
- throw new UnsupportedOperationException("This type of configuration is not
supported!");
- /*
- BeanInfo componentBeanInfo = (BeanInfo)
parent.getAttributes().get(UIComponent.BEANINFO_KEY);
- if (null == componentBeanInfo) {
- throw new TagException(tag, "Error: enclosing composite component does not have
BeanInfo attribute");
- }
- BeanDescriptor componentDescriptor = componentBeanInfo.getBeanDescriptor();
- if (null == componentDescriptor) {
- throw new TagException(tag, "Error: enclosing composite component BeanInfo does
not have BeanDescriptor");
- }
-
- List<AttachedObjectTarget> targetList = (List<AttachedObjectTarget>)
componentDescriptor.getValue(AttachedObjectTarget.ATTACHED_OBJECT_TARGETS_KEY);
-
- if (null == targetList) {
- throw new TagException(tag, "Error: enclosing composite component does not
support behavior events");
- }
-
- boolean supportedEvent = false;
- for (AttachedObjectTarget target : targetList) {
- if (target instanceof BehaviorHolderAttachedObjectTarget) {
- BehaviorHolderAttachedObjectTarget behaviorTarget =
(BehaviorHolderAttachedObjectTarget) target;
- if ((null != eventName && eventName.equals(behaviorTarget.getName()))
- || (null == eventName && behaviorTarget.isDefaultEvent())) {
- supportedEvent = true;
- break;
- }
- }
- }
-
- if (supportedEvent) {
- CompositeComponentTagHandler.getAttachedObjectHandlers(parent).add(this);
- } else {
- throw new TagException(tag, "Error: enclosing composite component does not
support event " + eventName);
- }*/
+ BeanInfo componentBeanInfo = (BeanInfo)
parent.getAttributes().get(UIComponent.BEANINFO_KEY);
+ if (null == componentBeanInfo) {
+ throw new TagException(
+ tag,
+ "Error: enclosing composite component does not have BeanInfo
attribute");
+ }
+ BeanDescriptor componentDescriptor = componentBeanInfo.getBeanDescriptor();
+ if (null == componentDescriptor) {
+ throw new TagException(
+ tag,
+ "Error: enclosing composite component BeanInfo does not have
BeanDescriptor");
+ }
+
+ @SuppressWarnings("unchecked")
+ List<AttachedObjectTarget> targetList =
(List<AttachedObjectTarget>)
+
componentDescriptor.getValue(AttachedObjectTarget.ATTACHED_OBJECT_TARGETS_KEY);
+
+ if (null == targetList) {
+ throw new TagException(
+ tag,
+ "Error: enclosing composite component does not support
behavior events");
+ }
+ boolean supportedEvent = false;
+ for (AttachedObjectTarget target : targetList) {
+ if (target instanceof BehaviorHolderAttachedObjectTarget) {
+ BehaviorHolderAttachedObjectTarget behaviorTarget =
(BehaviorHolderAttachedObjectTarget) target;
+ if ((null != eventName &&
eventName.equals(behaviorTarget.getName()))
+ || (null == eventName &&
behaviorTarget.isDefaultEvent())) {
+ supportedEvent = true;
+ break;
+ }
+ }
+ }
+ if (supportedEvent) {
+ getOrCreateRetargetableHandlersList(parent).add(this);
+ } else {
+ throw new TagException(
+ tag,
+ "Error: enclosing composite component does not support event
"
+ + eventName);
+ }
} else if (parent instanceof ClientBehaviorHolder) {
applyAttachedObject(ctx, parent, eventName);
} else {
@@ -122,19 +156,19 @@
}
-/* private void applyWrapping(FaceletContext ctx, UIComponent parent, String eventName)
throws IOException {
+ private void applyWrapping(FaceletContext ctx, UIComponent parent, String eventName)
throws IOException {
AjaxBehavior ajaxBehavior = createAjaxBehavior(ctx, eventName);
FacesContext context = ctx.getFacesContext();
- AjaxBehaviors ajaxBehaviors = AjaxBehaviors.getAjaxBehaviors(context, true);
- ajaxBehaviors.pushBehavior(context, ajaxBehavior, eventName);
+ BehaviorStack ajaxBehaviors = BehaviorStack.getBehaviorStack(context, true);
+ ajaxBehaviors.pushBehavior(context, ajaxBehavior, AjaxBehavior.BEHAVIOR_ID, eventName);
nextHandler.apply(ctx, parent);
ajaxBehaviors.popBehavior();
- } */
+ }
+
-
public void applyAttachedObject(FaceletContext fContext, UIComponent parent, String
eventName) {
ClientBehaviorHolder bHolder = (ClientBehaviorHolder) parent;
if (null == eventName) {
Added:
root/ui/trunk/components/core/src/main/java/org/ajax4jsf/facelets/tag/BehaviorStack.java
===================================================================
---
root/ui/trunk/components/core/src/main/java/org/ajax4jsf/facelets/tag/BehaviorStack.java
(rev 0)
+++
root/ui/trunk/components/core/src/main/java/org/ajax4jsf/facelets/tag/BehaviorStack.java 2009-10-23
22:46:56 UTC (rev 15753)
@@ -0,0 +1,153 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, 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.facelets.tag;
+
+import java.util.Deque;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.faces.application.Application;
+import javax.faces.component.StateHolder;
+import javax.faces.component.behavior.ClientBehavior;
+import javax.faces.component.behavior.ClientBehaviorHint;
+import javax.faces.component.behavior.ClientBehaviorHolder;
+import javax.faces.context.FacesContext;
+
+/**
+ * @author Nick Belaevski
+ *
+ * This class is necessary to handle nesting wrapping behaviors properly and is created
+ * to work around this issue:
https://javaserverfaces-spec-public.dev.java.net/issues/show_bug.cgi?id=655
+ *
+ */
+//TODO - check for bug resolution
+final class BehaviorStack {
+
+ private static final String BEHAVIOR_STACK = "org.richfaces.BehaviorStack";
+
+ private static class BehaviorInfo {
+
+ private String behaviorId;
+ private String eventName;
+ private Object behaviorState;
+
+ public BehaviorInfo(String behaviorId, String eventName,
+ Object behaviorState) {
+ this.behaviorId = behaviorId;
+ this.eventName = eventName;
+ this.behaviorState = behaviorState;
+ }
+
+ public void addBehavior(FacesContext context, ClientBehaviorHolder behaviorHolder) {
+ String eventName = this.eventName;
+ if (eventName == null) {
+ eventName = behaviorHolder.getDefaultEventName();
+
+ if (eventName == null) {
+ return;
+ }
+ }
+
+ if (shouldAddBehavior(behaviorHolder, eventName)) {
+ ClientBehavior behavior = createBehavior(context);
+ behaviorHolder.addClientBehavior(eventName, behavior);
+ }
+ }
+
+ private boolean shouldAddBehavior(ClientBehaviorHolder behaviorHolder, String
eventName) {
+
+ if (!behaviorHolder.getEventNames().contains(eventName)) {
+ return false;
+ }
+
+ Map<String,List<ClientBehavior>> clientBehaviorsMap =
behaviorHolder.getClientBehaviors();
+ List<ClientBehavior> clientBehaviors = clientBehaviorsMap.get(eventName);
+
+ if (clientBehaviors == null || clientBehaviors.isEmpty()) {
+ return true;
+ }
+
+ for (ClientBehavior behavior : clientBehaviors) {
+ Set<ClientBehaviorHint> hints = behavior.getHints();
+
+ if (hints.contains(ClientBehaviorHint.SUBMITTING)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ private ClientBehavior createBehavior(FacesContext context) {
+ Application application = context.getApplication();
+
+ ClientBehavior behavior = (ClientBehavior)
application.createBehavior(this.behaviorId);
+
+ ((StateHolder) behavior).restoreState(context, behaviorState);
+
+ return behavior;
+ }
+ }
+
+ private Deque<BehaviorInfo> behaviorStack = null;
+
+ public BehaviorStack() {
+ behaviorStack = new LinkedList<BehaviorInfo>();
+ }
+
+ public static BehaviorStack getBehaviorStack(FacesContext context, boolean createIfNull)
{
+ Map<Object, Object> attributes = context.getAttributes();
+ BehaviorStack behaviorStack = (BehaviorStack) attributes.get(BEHAVIOR_STACK);
+ if (behaviorStack == null && createIfNull) {
+ behaviorStack = new BehaviorStack();
+ attributes.put(BEHAVIOR_STACK, behaviorStack);
+ }
+
+ return behaviorStack;
+ }
+
+ public void addBehaviors(FacesContext context, ClientBehaviorHolder behaviorHolder) {
+ if (behaviorStack == null || behaviorStack.isEmpty()) {
+ return;
+ }
+
+ for (BehaviorInfo behaviorInfo : behaviorStack) {
+ behaviorInfo.addBehavior(context, behaviorHolder);
+ }
+ }
+
+ public void pushBehavior(FacesContext context, ClientBehavior clientBehavior, String
behaviorId,
+ String eventName) {
+
+ Object behaviorState = ((StateHolder) clientBehavior).saveState(context);
+ //closer behaviors are processed earlier
+ behaviorStack.addFirst(new BehaviorInfo(behaviorId, eventName, behaviorState));
+ }
+
+ public void popBehavior() {
+ if (!behaviorStack.isEmpty()) {
+ behaviorStack.removeFirst();
+ }
+ }
+}
Added:
root/ui/trunk/components/core/src/main/java/org/ajax4jsf/facelets/tag/BehaviorsAddingComponentHandlerWrapper.java
===================================================================
---
root/ui/trunk/components/core/src/main/java/org/ajax4jsf/facelets/tag/BehaviorsAddingComponentHandlerWrapper.java
(rev 0)
+++
root/ui/trunk/components/core/src/main/java/org/ajax4jsf/facelets/tag/BehaviorsAddingComponentHandlerWrapper.java 2009-10-23
22:46:56 UTC (rev 15753)
@@ -0,0 +1,119 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, 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.facelets.tag;
+
+import java.io.IOException;
+
+import javax.el.ELException;
+import javax.faces.FacesException;
+import javax.faces.component.UIComponent;
+import javax.faces.component.behavior.ClientBehaviorHolder;
+import javax.faces.context.FacesContext;
+import javax.faces.view.facelets.ComponentConfig;
+import javax.faces.view.facelets.ComponentHandler;
+import javax.faces.view.facelets.FaceletContext;
+import javax.faces.view.facelets.Tag;
+import javax.faces.view.facelets.TagAttribute;
+
+/**
+ * @author Nick Belaevski
+ */
+public class BehaviorsAddingComponentHandlerWrapper extends ComponentHandler {
+
+ private ComponentHandler componentHandler;
+
+ public BehaviorsAddingComponentHandlerWrapper(ComponentHandler componentHandler) {
+ super(componentHandler.getComponentConfig());
+ this.componentHandler = componentHandler;
+ }
+
+ public void apply(FaceletContext ctx, UIComponent parent)
+ throws IOException {
+ componentHandler.apply(ctx, parent);
+ }
+
+ public void applyNextHandler(FaceletContext ctx, UIComponent c)
+ throws IOException, FacesException, ELException {
+ componentHandler.applyNextHandler(ctx, c);
+ }
+
+ public TagAttribute getBinding() {
+ return componentHandler.getBinding();
+ }
+
+ public ComponentConfig getComponentConfig() {
+ return componentHandler.getComponentConfig();
+ }
+
+ public Tag getTag() {
+ return componentHandler.getTag();
+ }
+
+ public TagAttribute getTagAttribute(String localName) {
+ return componentHandler.getTagAttribute(localName);
+ }
+
+ public String getTagId() {
+ return componentHandler.getTagId();
+ }
+
+ public boolean equals(Object obj) {
+ return componentHandler.equals(obj);
+ }
+
+ public int hashCode() {
+ return componentHandler.hashCode();
+ }
+
+ public String toString() {
+ return componentHandler.toString();
+ }
+
+ public boolean isDisabled(FaceletContext ctx) {
+ return componentHandler.isDisabled(ctx);
+ }
+
+ public void onComponentCreated(FaceletContext ctx, UIComponent c,
+ UIComponent parent) {
+ componentHandler.onComponentCreated(ctx, c, parent);
+ }
+
+ public void onComponentPopulated(FaceletContext ctx, UIComponent c,
+ UIComponent parent) {
+
+ FacesContext facesContext = ctx.getFacesContext();
+ BehaviorStack behaviorStack = BehaviorStack.getBehaviorStack(facesContext, false);
+ if (behaviorStack != null) {
+ if (c instanceof ClientBehaviorHolder) {
+ ClientBehaviorHolder behaviorHolder = (ClientBehaviorHolder) c;
+ behaviorStack.addBehaviors(facesContext, behaviorHolder);
+ }
+ }
+
+ componentHandler.onComponentPopulated(ctx, c, parent);
+ }
+
+ public void setAttributes(FaceletContext ctx, Object instance) {
+ componentHandler.setAttributes(ctx, instance);
+ }
+
+}
Added:
root/ui/trunk/components/core/src/main/java/org/ajax4jsf/facelets/tag/BehaviorsTagHandlerDelegateFactoryImpl.java
===================================================================
---
root/ui/trunk/components/core/src/main/java/org/ajax4jsf/facelets/tag/BehaviorsTagHandlerDelegateFactoryImpl.java
(rev 0)
+++
root/ui/trunk/components/core/src/main/java/org/ajax4jsf/facelets/tag/BehaviorsTagHandlerDelegateFactoryImpl.java 2009-10-23
22:46:56 UTC (rev 15753)
@@ -0,0 +1,79 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, 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.facelets.tag;
+
+import javax.faces.view.facelets.BehaviorHandler;
+import javax.faces.view.facelets.ComponentHandler;
+import javax.faces.view.facelets.ConverterHandler;
+import javax.faces.view.facelets.TagHandlerDelegate;
+import javax.faces.view.facelets.TagHandlerDelegateFactory;
+import javax.faces.view.facelets.ValidatorHandler;
+
+/**
+ * @author Nick Belaevski
+ */
+public class BehaviorsTagHandlerDelegateFactoryImpl extends TagHandlerDelegateFactory {
+
+ private TagHandlerDelegateFactory factory;
+
+ public BehaviorsTagHandlerDelegateFactoryImpl(TagHandlerDelegateFactory factory) {
+ this.factory = factory;
+ }
+
+ /* (non-Javadoc)
+ * @see
javax.faces.view.facelets.TagHandlerDelegateFactory#createBehaviorHandlerDelegate(javax.faces.view.facelets.BehaviorHandler)
+ */
+ @Override
+ public TagHandlerDelegate createBehaviorHandlerDelegate(
+ BehaviorHandler owner) {
+ return factory.createBehaviorHandlerDelegate(owner);
+ }
+
+ /* (non-Javadoc)
+ * @see
javax.faces.view.facelets.TagHandlerDelegateFactory#createComponentHandlerDelegate(javax.faces.view.facelets.ComponentHandler)
+ */
+ @Override
+ public TagHandlerDelegate createComponentHandlerDelegate(ComponentHandler owner) {
+ //TagHandlers structure is created when view is compiled
+ //so there's no need to check for BehaviorsStack
+ return factory.createComponentHandlerDelegate(new
BehaviorsAddingComponentHandlerWrapper(owner));
+ }
+
+ /* (non-Javadoc)
+ * @see
javax.faces.view.facelets.TagHandlerDelegateFactory#createConverterHandlerDelegate(javax.faces.view.facelets.ConverterHandler)
+ */
+ @Override
+ public TagHandlerDelegate createConverterHandlerDelegate(
+ ConverterHandler owner) {
+ return factory.createConverterHandlerDelegate(owner);
+ }
+
+ /* (non-Javadoc)
+ * @see
javax.faces.view.facelets.TagHandlerDelegateFactory#createValidatorHandlerDelegate(javax.faces.view.facelets.ValidatorHandler)
+ */
+ @Override
+ public TagHandlerDelegate createValidatorHandlerDelegate(
+ ValidatorHandler owner) {
+ return factory.createValidatorHandlerDelegate(owner);
+ }
+
+}
Added:
root/ui/trunk/components/core/src/main/resources/META-INF/behaviors.faces-config.xml
===================================================================
--- root/ui/trunk/components/core/src/main/resources/META-INF/behaviors.faces-config.xml
(rev 0)
+++
root/ui/trunk/components/core/src/main/resources/META-INF/behaviors.faces-config.xml 2009-10-23
22:46:56 UTC (rev 15753)
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<faces-config
xmlns="http://java.sun.com/xml/ns/javaee"
+ version="2.0">
+
+ <name>richfaces</name>
+
+ <ordering>
+ <before>
+ <others />
+ </before>
+ </ordering>
+
+ <factory>
+ <tag-handler-delegate-factory>org.ajax4jsf.facelets.tag.BehaviorsTagHandlerDelegateFactoryImpl</tag-handler-delegate-factory>
+ </factory>
+
+</faces-config>
\ No newline at end of file