You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by sl...@apache.org on 2009/04/04 20:45:04 UTC
svn commit: r761982 [6/10] - in /myfaces/core/branches/2_0_0/impl/src:
main/java/com/ main/java/org/apache/myfaces/application/
main/java/org/apache/myfaces/config/
main/java/org/apache/myfaces/config/impl/digester/
main/java/org/apache/myfaces/config/...
Added: myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/AbstractTagLibrary.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/AbstractTagLibrary.java?rev=761982&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/AbstractTagLibrary.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/AbstractTagLibrary.java Sat Apr 4 18:44:59 2009
@@ -0,0 +1,624 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.view.facelets.tag;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.el.ELException;
+import javax.faces.FacesException;
+import javax.faces.view.facelets.ComponentConfig;
+import javax.faces.view.facelets.ComponentHandler;
+import javax.faces.view.facelets.ConverterConfig;
+import javax.faces.view.facelets.FaceletException;
+import javax.faces.view.facelets.FaceletHandler;
+import javax.faces.view.facelets.Tag;
+import javax.faces.view.facelets.TagConfig;
+import javax.faces.view.facelets.TagHandler;
+import javax.faces.view.facelets.ValidatorConfig;
+
+import org.apache.myfaces.view.facelets.tag.jsf.ConvertHandler;
+import org.apache.myfaces.view.facelets.tag.jsf.ValidateHandler;
+
+/**
+ * Base class for defining TagLibraries in Java
+ *
+ * @author Jacob Hookom
+ * @version $Id: AbstractTagLibrary.java,v 1.10 2008/07/13 19:01:36 rlubke Exp $
+ */
+public abstract class AbstractTagLibrary implements TagLibrary
+{
+ private final Map<String, TagHandlerFactory> _factories;
+
+ private final Map<String, Method> _functions;
+
+ private final String _namespace;
+
+ public AbstractTagLibrary(String namespace)
+ {
+ _namespace = namespace;
+ _factories = new HashMap<String, TagHandlerFactory>();
+ _functions = new HashMap<String, Method>();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.apache.myfaces.view.facelets.tag.TagLibrary#containsNamespace(java.lang.String)
+ */
+ public boolean containsNamespace(String ns)
+ {
+ return _namespace.equals(ns);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.apache.myfaces.view.facelets.tag.TagLibrary#containsTagHandler(java.lang.String, java.lang.String)
+ */
+ public boolean containsTagHandler(String ns, String localName)
+ {
+ return containsNamespace(ns) && _factories.containsKey(localName);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.apache.myfaces.view.facelets.tag.TagLibrary#createTagHandler(java.lang.String, java.lang.String,
+ * org.apache.myfaces.view.facelets.tag.TagConfig)
+ */
+ public TagHandler createTagHandler(String ns, String localName, TagConfig tag) throws FacesException
+ {
+ if (containsNamespace(ns))
+ {
+ TagHandlerFactory f = _factories.get(localName);
+ if (f != null)
+ {
+ return f.createHandler(tag);
+ }
+ }
+
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.apache.myfaces.view.facelets.tag.TagLibrary#containsFunction(java.lang.String, java.lang.String)
+ */
+ public boolean containsFunction(String ns, String name)
+ {
+ return containsNamespace(ns) && _functions.containsKey(name);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.apache.myfaces.view.facelets.tag.TagLibrary#createFunction(java.lang.String, java.lang.String)
+ */
+ public Method createFunction(String ns, String name)
+ {
+ return containsNamespace(ns) ? _functions.get(name) : null;
+ }
+
+ public String getNamespace()
+ {
+ return _namespace;
+ }
+
+ /**
+ * Add a ComponentHandler with the specified componentType and rendererType, aliased by the tag name.
+ *
+ * @see ComponentHandler
+ * @see javax.faces.application.Application#createComponent(java.lang.String)
+ * @param name
+ * name to use, "foo" would be <my:foo />
+ * @param componentType
+ * componentType to use
+ * @param rendererType
+ * rendererType to use
+ */
+ protected final void addComponent(String name, String componentType, String rendererType)
+ {
+ _factories.put(name, new ComponentHandlerFactory(componentType, rendererType));
+ }
+
+ /**
+ * Add a ComponentHandler with the specified componentType and rendererType, aliased by the tag name. The Facelet
+ * will be compiled with the specified HandlerType (which must extend AbstractComponentHandler).
+ *
+ * @see AbstractComponentHandler
+ * @param name
+ * name to use, "foo" would be <my:foo />
+ * @param componentType
+ * componentType to use
+ * @param rendererType
+ * rendererType to use
+ * @param handlerType
+ * a Class that extends AbstractComponentHandler
+ */
+ protected final void addComponent(String name, String componentType, String rendererType,
+ Class<? extends TagHandler> handlerType)
+ {
+ _factories.put(name, new UserComponentHandlerFactory(componentType, rendererType, handlerType));
+ }
+
+ /**
+ * Add a ConvertHandler for the specified converterId
+ *
+ * @see ConvertHandler
+ * @see javax.faces.application.Application#createConverter(java.lang.String)
+ * @param name
+ * name to use, "foo" would be <my:foo />
+ * @param converterId
+ * id to pass to Application instance
+ */
+ protected final void addConverter(String name, String converterId)
+ {
+ _factories.put(name, new ConverterHandlerFactory(converterId));
+ }
+
+ /**
+ * Add a ConvertHandler for the specified converterId of a TagHandler type
+ *
+ * @see ConvertHandler
+ * @see ConverterConfig
+ * @see javax.faces.application.Application#createConverter(java.lang.String)
+ * @param name
+ * name to use, "foo" would be <my:foo />
+ * @param converterId
+ * id to pass to Application instance
+ * @param type
+ * TagHandler type that takes in a ConverterConfig
+ */
+ protected final void addConverter(String name, String converterId, Class<? extends TagHandler> type)
+ {
+ _factories.put(name, new UserConverterHandlerFactory(converterId, type));
+ }
+
+ /**
+ * Add a ValidateHandler for the specified validatorId
+ *
+ * @see ValidateHandler
+ * @see javax.faces.application.Application#createValidator(java.lang.String)
+ * @param name
+ * name to use, "foo" would be <my:foo />
+ * @param validatorId
+ * id to pass to Application instance
+ */
+ protected final void addValidator(String name, String validatorId)
+ {
+ _factories.put(name, new ValidatorHandlerFactory(validatorId));
+ }
+
+ /**
+ * Add a ValidateHandler for the specified validatorId
+ *
+ * @see ValidateHandler
+ * @see ValidatorConfig
+ * @see javax.faces.application.Application#createValidator(java.lang.String)
+ * @param name
+ * name to use, "foo" would be <my:foo />
+ * @param validatorId
+ * id to pass to Application instance
+ * @param type
+ * TagHandler type that takes in a ValidatorConfig
+ */
+ protected final void addValidator(String name, String validatorId, Class<? extends TagHandler> type)
+ {
+ _factories.put(name, new UserValidatorHandlerFactory(validatorId, type));
+ }
+
+ /**
+ * Use the specified HandlerType in compiling Facelets. HandlerType must extend TagHandler.
+ *
+ * @see TagHandler
+ * @param name
+ * name to use, "foo" would be <my:foo />
+ * @param handlerType
+ * must extend TagHandler
+ */
+ protected final void addTagHandler(String name, Class<? extends TagHandler> handlerType)
+ {
+ _factories.put(name, new HandlerFactory(handlerType));
+ }
+
+ /**
+ * Add a UserTagHandler specified a the URL source.
+ *
+ * @see UserTagHandler
+ * @param name
+ * name to use, "foo" would be <my:foo />
+ * @param source
+ * source where the Facelet (Tag) source is
+ */
+ protected final void addUserTag(String name, URL source)
+ {
+ _factories.put(name, new UserTagFactory(source));
+ }
+
+ /**
+ * Add a Method to be used as a Function at Compilation.
+ *
+ * @see javax.el.FunctionMapper
+ *
+ * @param name
+ * (suffix) of function name
+ * @param method
+ * method instance
+ */
+ protected final void addFunction(String name, Method method)
+ {
+ _functions.put(name, method);
+ }
+
+ private static class ValidatorConfigWrapper implements ValidatorConfig
+ {
+
+ private final TagConfig parent;
+ private final String validatorId;
+
+ public ValidatorConfigWrapper(TagConfig parent, String validatorId)
+ {
+ this.parent = parent;
+ this.validatorId = validatorId;
+ }
+
+ public String getValidatorId()
+ {
+ return this.validatorId;
+ }
+
+ public FaceletHandler getNextHandler()
+ {
+ return this.parent.getNextHandler();
+ }
+
+ public Tag getTag()
+ {
+ return this.parent.getTag();
+ }
+
+ public String getTagId()
+ {
+ return this.parent.getTagId();
+ }
+ }
+
+ private static class ConverterConfigWrapper implements ConverterConfig
+ {
+ private final TagConfig parent;
+ private final String converterId;
+
+ public ConverterConfigWrapper(TagConfig parent, String converterId)
+ {
+ this.parent = parent;
+ this.converterId = converterId;
+ }
+
+ public String getConverterId()
+ {
+ return this.converterId;
+ }
+
+ public FaceletHandler getNextHandler()
+ {
+ return this.parent.getNextHandler();
+ }
+
+ public Tag getTag()
+ {
+ return this.parent.getTag();
+ }
+
+ public String getTagId()
+ {
+ return this.parent.getTagId();
+ }
+ }
+
+ private static class HandlerFactory implements TagHandlerFactory
+ {
+ private final static Class<?>[] CONSTRUCTOR_SIG = new Class[]{TagConfig.class};
+
+ protected final Class<? extends TagHandler> handlerType;
+
+ public HandlerFactory(Class<? extends TagHandler> handlerType)
+ {
+ this.handlerType = handlerType;
+ }
+
+ public TagHandler createHandler(TagConfig cfg) throws FacesException, ELException
+ {
+ try
+ {
+ return handlerType.getConstructor(CONSTRUCTOR_SIG).newInstance(new Object[] { cfg });
+ }
+ catch (InvocationTargetException ite)
+ {
+ Throwable t = ite.getCause();
+ if (t instanceof FacesException)
+ {
+ throw (FacesException) t;
+ }
+ else if (t instanceof ELException)
+ {
+ throw (ELException) t;
+ }
+ else
+ {
+ throw new FacesException("Error Instantiating: " + handlerType.getName(), t);
+ }
+ }
+ catch (Exception e)
+ {
+ throw new FacesException("Error Instantiating: " + handlerType.getName(), e);
+ }
+ }
+ }
+
+ private static class ComponentConfigWrapper implements ComponentConfig
+ {
+
+ protected final TagConfig parent;
+
+ protected final String componentType;
+
+ protected final String rendererType;
+
+ public ComponentConfigWrapper(TagConfig parent, String componentType, String rendererType)
+ {
+ this.parent = parent;
+ this.componentType = componentType;
+ this.rendererType = rendererType;
+ }
+
+ public String getComponentType()
+ {
+ return this.componentType;
+ }
+
+ public String getRendererType()
+ {
+ return this.rendererType;
+ }
+
+ public FaceletHandler getNextHandler()
+ {
+ return this.parent.getNextHandler();
+ }
+
+ public Tag getTag()
+ {
+ return this.parent.getTag();
+ }
+
+ public String getTagId()
+ {
+ return this.parent.getTagId();
+ }
+ }
+
+ private static class UserTagFactory implements TagHandlerFactory
+ {
+ protected final URL location;
+
+ public UserTagFactory(URL location)
+ {
+ this.location = location;
+ }
+
+ public TagHandler createHandler(TagConfig cfg) throws FacesException, ELException
+ {
+ return new UserTagHandler(cfg, this.location);
+ }
+ }
+
+ private static class ComponentHandlerFactory implements TagHandlerFactory
+ {
+
+ protected final String componentType;
+
+ protected final String renderType;
+
+ /**
+ * @param handlerType
+ */
+ public ComponentHandlerFactory(String componentType, String renderType)
+ {
+ this.componentType = componentType;
+ this.renderType = renderType;
+ }
+
+ public TagHandler createHandler(TagConfig cfg) throws FacesException, ELException
+ {
+ ComponentConfig ccfg = new ComponentConfigWrapper(cfg, this.componentType, this.renderType);
+ return new ComponentHandler(ccfg);
+ }
+ }
+
+ private static class UserComponentHandlerFactory implements TagHandlerFactory
+ {
+
+ private final static Class<?>[] CONS_SIG = new Class[] { ComponentConfig.class };
+
+ protected final String componentType;
+
+ protected final String renderType;
+
+ protected final Class<? extends TagHandler> type;
+
+ protected final Constructor<? extends TagHandler> constructor;
+
+ /**
+ * @param handlerType
+ */
+ public UserComponentHandlerFactory(String componentType, String renderType, Class<? extends TagHandler> type)
+ {
+ this.componentType = componentType;
+ this.renderType = renderType;
+ this.type = type;
+ try
+ {
+ this.constructor = this.type.getConstructor(CONS_SIG);
+ }
+ catch (Exception e)
+ {
+ throw new FaceletException("Must have a Constructor that takes in a ComponentConfig", e);
+ }
+ }
+
+ public TagHandler createHandler(TagConfig cfg) throws FacesException, ELException
+ {
+ try
+ {
+ ComponentConfig ccfg = new ComponentConfigWrapper(cfg, componentType, renderType);
+ return constructor.newInstance(new Object[] { ccfg });
+ }
+ catch (InvocationTargetException e)
+ {
+ throw new FaceletException(e.getCause().getMessage(), e.getCause().getCause());
+ }
+ catch (Exception e)
+ {
+ throw new FaceletException("Error Instantiating ComponentHandler: " + this.type.getName(), e);
+ }
+ }
+ }
+
+ private static class ValidatorHandlerFactory implements TagHandlerFactory
+ {
+
+ protected final String validatorId;
+
+ public ValidatorHandlerFactory(String validatorId)
+ {
+ this.validatorId = validatorId;
+ }
+
+ public TagHandler createHandler(TagConfig cfg) throws FacesException, ELException
+ {
+ return new ValidateHandler(new ValidatorConfigWrapper(cfg, this.validatorId));
+ }
+ }
+
+ private static class ConverterHandlerFactory implements TagHandlerFactory
+ {
+
+ protected final String converterId;
+
+ public ConverterHandlerFactory(String converterId)
+ {
+ this.converterId = converterId;
+ }
+
+ public TagHandler createHandler(TagConfig cfg) throws FacesException, ELException
+ {
+ return new ConvertHandler(new ConverterConfigWrapper(cfg, this.converterId));
+ }
+ }
+
+ private static class UserConverterHandlerFactory implements TagHandlerFactory
+ {
+ private final static Class<?>[] CONS_SIG = new Class[] { ConverterConfig.class };
+
+ protected final String converterId;
+
+ protected final Class<? extends TagHandler> type;
+
+ protected final Constructor<? extends TagHandler> constructor;
+
+ public UserConverterHandlerFactory(String converterId, Class<? extends TagHandler> type)
+ {
+ this.converterId = converterId;
+ this.type = type;
+ try
+ {
+ this.constructor = this.type.getConstructor(CONS_SIG);
+ }
+ catch (Exception e)
+ {
+ throw new FaceletException("Must have a Constructor that takes in a ConverterConfig", e);
+ }
+ }
+
+ public TagHandler createHandler(TagConfig cfg) throws FacesException, ELException
+ {
+ try
+ {
+ ConverterConfig ccfg = new ConverterConfigWrapper(cfg, converterId);
+ return constructor.newInstance(new Object[] { ccfg });
+ }
+ catch (InvocationTargetException e)
+ {
+ throw new FaceletException(e.getCause().getMessage(), e.getCause().getCause());
+ }
+ catch (Exception e)
+ {
+ throw new FaceletException("Error Instantiating ConverterHandler: " + type.getName(), e);
+ }
+ }
+ }
+
+ private static class UserValidatorHandlerFactory implements TagHandlerFactory
+ {
+ private final static Class<?>[] CONS_SIG = new Class[] { ValidatorConfig.class };
+
+ protected final String validatorId;
+
+ protected final Class<? extends TagHandler> type;
+
+ protected final Constructor<? extends TagHandler> constructor;
+
+ public UserValidatorHandlerFactory(String validatorId, Class<? extends TagHandler> type)
+ {
+ this.validatorId = validatorId;
+ this.type = type;
+ try
+ {
+ this.constructor = this.type.getConstructor(CONS_SIG);
+ }
+ catch (Exception e)
+ {
+ throw new FaceletException("Must have a Constructor that takes in a ConverterConfig", e);
+ }
+ }
+
+ public TagHandler createHandler(TagConfig cfg) throws FacesException, ELException
+ {
+ try
+ {
+ ValidatorConfig ccfg = new ValidatorConfigWrapper(cfg, validatorId);
+ return constructor.newInstance(new Object[] { ccfg });
+ }
+ catch (InvocationTargetException e)
+ {
+ throw new FaceletException(e.getCause().getMessage(), e.getCause().getCause());
+ }
+ catch (Exception e)
+ {
+ throw new FaceletException("Error Instantiating ValidatorHandler: " + type.getName(), e);
+ }
+ }
+ }
+}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/BeanPropertyTagRule.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/BeanPropertyTagRule.java?rev=761982&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/BeanPropertyTagRule.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/BeanPropertyTagRule.java Sat Apr 4 18:44:59 2009
@@ -0,0 +1,131 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.view.facelets.tag;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+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 javax.faces.view.facelets.TagAttributeException;
+
+/**
+ *
+ * @author Jacob Hookom
+ * @version $Id: BeanPropertyTagRule.java,v 1.3 2008/07/13 19:01:35 rlubke Exp $
+ */
+final class BeanPropertyTagRule extends MetaRule
+{
+ public final static BeanPropertyTagRule Instance = new BeanPropertyTagRule();
+
+ public Metadata applyRule(String name, TagAttribute attribute, MetadataTarget meta)
+ {
+ Method m = meta.getWriteMethod(name);
+
+ // if the property is writable
+ if (m != null)
+ {
+ if (attribute.isLiteral())
+ {
+ return new LiteralPropertyMetadata(m, attribute);
+ }
+ else
+ {
+ return new DynamicPropertyMetadata(m, attribute);
+ }
+ }
+
+ return null;
+ }
+
+ final static class LiteralPropertyMetadata extends Metadata
+ {
+
+ private final Method method;
+
+ private final TagAttribute attribute;
+
+ private Object[] value;
+
+ public LiteralPropertyMetadata(Method method, TagAttribute attribute)
+ {
+ this.method = method;
+ this.attribute = attribute;
+ }
+
+ public void applyMetadata(FaceletContext ctx, Object instance)
+ {
+ if (value == null)
+ {
+ String str = this.attribute.getValue();
+ value = new Object[] { ctx.getExpressionFactory().coerceToType(str, method.getParameterTypes()[0]) };
+ }
+ try
+ {
+ method.invoke(instance, this.value);
+ }
+ catch (InvocationTargetException e)
+ {
+ throw new TagAttributeException(this.attribute, e.getCause());
+ }
+ catch (Exception e)
+ {
+ throw new TagAttributeException(this.attribute, e);
+ }
+ }
+
+ }
+
+ final static class DynamicPropertyMetadata extends Metadata
+ {
+
+ private final Method method;
+
+ private final TagAttribute attribute;
+
+ private final Class<?> type;
+
+ public DynamicPropertyMetadata(Method method, TagAttribute attribute)
+ {
+ this.method = method;
+ this.type = method.getParameterTypes()[0];
+ this.attribute = attribute;
+ }
+
+ public void applyMetadata(FaceletContext ctx, Object instance)
+ {
+ try
+ {
+ method.invoke(instance, new Object[] { attribute.getObject(ctx, type) });
+ }
+ catch (InvocationTargetException e)
+ {
+ throw new TagAttributeException(attribute, e.getCause());
+ }
+ catch (Exception e)
+ {
+ throw new TagAttributeException(attribute, e);
+ }
+ }
+ }
+
+}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/CompositeFaceletHandler.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/CompositeFaceletHandler.java?rev=761982&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/CompositeFaceletHandler.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/CompositeFaceletHandler.java Sat Apr 4 18:44:59 2009
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.view.facelets.tag;
+
+import java.io.IOException;
+
+import javax.el.ELException;
+import javax.faces.FacesException;
+import javax.faces.component.UIComponent;
+import javax.faces.view.facelets.FaceletContext;
+import javax.faces.view.facelets.FaceletException;
+import javax.faces.view.facelets.FaceletHandler;
+
+/**
+ * A FaceletHandler that is derived of 1 or more, inner FaceletHandlers. This class would be found if the next
+ * FaceletHandler is structually, a body with multiple child elements as defined in XML.
+ *
+ * @author Jacob Hookom
+ * @version $Id: CompositeFaceletHandler.java,v 1.5 2008/07/13 19:01:36 rlubke Exp $
+ */
+public final class CompositeFaceletHandler implements FaceletHandler
+{
+
+ private final FaceletHandler[] children;
+ private final int len;
+
+ public CompositeFaceletHandler(FaceletHandler[] children)
+ {
+ this.children = children;
+ this.len = children.length;
+ }
+
+ public void apply(FaceletContext ctx, UIComponent parent) throws IOException, FacesException, FaceletException,
+ ELException
+ {
+ for (int i = 0; i < len; i++)
+ {
+ this.children[i].apply(ctx, parent);
+ }
+ }
+
+ public FaceletHandler[] getHandlers()
+ {
+ return this.children;
+ }
+}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/CompositeTagDecorator.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/CompositeTagDecorator.java?rev=761982&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/CompositeTagDecorator.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/CompositeTagDecorator.java Sat Apr 4 18:44:59 2009
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.view.facelets.tag;
+
+import javax.faces.view.facelets.Tag;
+
+import org.apache.myfaces.view.facelets.util.ParameterCheck;
+
+/**
+ * A TagDecorator that is composed of 1 or more TagDecorator instances. It uses the chain of responsibility pattern to
+ * stop processing if any of the TagDecorators return a value other than null.
+ *
+ * @author Jacob Hookom
+ * @version $Id: CompositeTagDecorator.java,v 1.5 2008/07/13 19:01:35 rlubke Exp $
+ */
+public final class CompositeTagDecorator implements TagDecorator
+{
+
+ private final TagDecorator[] decorators;
+
+ public CompositeTagDecorator(TagDecorator[] decorators)
+ {
+ ParameterCheck.notNull("decorators", decorators);
+ this.decorators = decorators;
+ }
+
+ /**
+ * Uses the chain of responsibility pattern to stop processing if any of the TagDecorators return a value other than
+ * null.
+ *
+ * @see org.apache.myfaces.view.facelets.tag.TagDecorator#decorate(org.apache.myfaces.view.facelets.tag.Tag)
+ */
+ public Tag decorate(Tag tag)
+ {
+ Tag t = null;
+ for (int i = 0; i < this.decorators.length; i++)
+ {
+ t = this.decorators[i].decorate(tag);
+ if (t != null)
+ {
+ return t;
+ }
+ }
+ return tag;
+ }
+
+}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/CompositeTagLibrary.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/CompositeTagLibrary.java?rev=761982&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/CompositeTagLibrary.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/CompositeTagLibrary.java Sat Apr 4 18:44:59 2009
@@ -0,0 +1,132 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.view.facelets.tag;
+
+import java.lang.reflect.Method;
+
+import javax.faces.FacesException;
+import javax.faces.view.facelets.TagConfig;
+import javax.faces.view.facelets.TagHandler;
+
+import org.apache.myfaces.view.facelets.util.ParameterCheck;
+
+/**
+ * A TagLibrary that is composed of 1 or more TagLibrary children. Uses the chain of responsibility pattern to stop
+ * searching as soon as one of the children handles the requested method.
+ *
+ * @author Jacob Hookom
+ * @version $Id: CompositeTagLibrary.java,v 1.4 2008/07/13 19:01:36 rlubke Exp $
+ */
+public final class CompositeTagLibrary implements TagLibrary
+{
+
+ private final TagLibrary[] libraries;
+
+ public CompositeTagLibrary(TagLibrary[] libraries)
+ {
+ ParameterCheck.notNull("libraries", libraries);
+ this.libraries = libraries;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.apache.myfaces.view.facelets.tag.TagLibrary#containsNamespace(java.lang.String)
+ */
+ public boolean containsNamespace(String ns)
+ {
+ for (int i = 0; i < this.libraries.length; i++)
+ {
+ if (this.libraries[i].containsNamespace(ns))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.apache.myfaces.view.facelets.tag.TagLibrary#containsTagHandler(java.lang.String, java.lang.String)
+ */
+ public boolean containsTagHandler(String ns, String localName)
+ {
+ for (int i = 0; i < this.libraries.length; i++)
+ {
+ if (this.libraries[i].containsTagHandler(ns, localName))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.apache.myfaces.view.facelets.tag.TagLibrary#createTagHandler(java.lang.String, java.lang.String,
+ * org.apache.myfaces.view.facelets.tag.TagConfig)
+ */
+ public TagHandler createTagHandler(String ns, String localName, TagConfig tag) throws FacesException
+ {
+ for (int i = 0; i < this.libraries.length; i++)
+ {
+ if (this.libraries[i].containsTagHandler(ns, localName))
+ {
+ return this.libraries[i].createTagHandler(ns, localName, tag);
+ }
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.apache.myfaces.view.facelets.tag.TagLibrary#containsFunction(java.lang.String, java.lang.String)
+ */
+ public boolean containsFunction(String ns, String name)
+ {
+ for (int i = 0; i < this.libraries.length; i++)
+ {
+ if (this.libraries[i].containsFunction(ns, name))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.apache.myfaces.view.facelets.tag.TagLibrary#createFunction(java.lang.String, java.lang.String)
+ */
+ public Method createFunction(String ns, String name)
+ {
+ for (int i = 0; i < this.libraries.length; i++)
+ {
+ if (this.libraries[i].containsFunction(ns, name))
+ {
+ return this.libraries[i].createFunction(ns, name);
+ }
+ }
+ return null;
+ }
+}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/MetaRule.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/MetaRule.java?rev=761982&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/MetaRule.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/MetaRule.java Sat Apr 4 18:44:59 2009
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.view.facelets.tag;
+
+//import javax.faces.view.facelets.tag.TagAttribute;
+//
+///**
+// * A potential rule for Metadata on the passed MetadataTarget
+// *
+// * @see org.apache.myfaces.view.facelets.tag.Metadata
+// * @see org.apache.myfaces.view.facelets.tag.MetadataTarget
+// * @author Jacob Hookom
+// * @version $Id: MetaRule.java,v 1.3 2008/07/13 19:01:36 rlubke Exp $
+// */
+//public abstract class MetaRule
+//{
+//
+// /**
+// * @param name
+// * @param attribute
+// * @param meta
+// * @return
+// */
+// public abstract Metadata applyRule(String name, TagAttribute attribute, MetadataTarget meta);
+//
+//}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/MetaRulesetImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/MetaRulesetImpl.java?rev=761982&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/MetaRulesetImpl.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/MetaRulesetImpl.java Sat Apr 4 18:44:59 2009
@@ -0,0 +1,214 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.view.facelets.tag;
+
+import java.beans.IntrospectionException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.faces.view.facelets.FaceletContext;
+import javax.faces.view.facelets.MetaRule;
+import javax.faces.view.facelets.MetaRuleset;
+import javax.faces.view.facelets.Metadata;
+import javax.faces.view.facelets.MetadataTarget;
+import javax.faces.view.facelets.Tag;
+import javax.faces.view.facelets.TagAttribute;
+import javax.faces.view.facelets.TagException;
+
+import org.apache.myfaces.view.facelets.util.ParameterCheck;
+
+/**
+ *
+ * @author Jacob Hookom
+ * @version $Id: MetaRulesetImpl.java,v 1.3 2008/07/13 19:01:35 rlubke Exp $
+ */
+public final class MetaRulesetImpl extends MetaRuleset
+{
+ private final static Metadata NONE = new NullMetadata();
+
+ private final static Logger log = Logger.getLogger("facelets.tag.meta");
+
+ private final static WeakHashMap<String, MetadataTarget> _metadata = new WeakHashMap<String, MetadataTarget>();
+
+ private final Map<String, TagAttribute> _attributes;
+
+ private final List<Metadata> _mappers;
+
+ private final List<MetaRule> _rules;
+
+ private final Tag _tag;
+
+ private final Class<?> _type;
+
+ public MetaRulesetImpl(Tag tag, Class<?> type)
+ {
+ _tag = tag;
+ _type = type;
+ _attributes = new HashMap<String, TagAttribute>();
+ _mappers = new ArrayList<Metadata>();
+ _rules = new ArrayList<MetaRule>();
+
+ // setup attributes
+ for (TagAttribute attribute : _tag.getAttributes().getAll())
+ {
+ _attributes.put(attribute.getLocalName(), attribute);
+ }
+
+ // add default rules
+ _rules.add(BeanPropertyTagRule.Instance);
+ }
+
+ public MetaRuleset add(Metadata mapper)
+ {
+ ParameterCheck.notNull("mapper", mapper);
+
+ if (!_mappers.contains(mapper))
+ {
+ _mappers.add(mapper);
+ }
+
+ return this;
+ }
+
+ public MetaRuleset addRule(MetaRule rule)
+ {
+ ParameterCheck.notNull("rule", rule);
+
+ _rules.add(rule);
+
+ return this;
+ }
+
+ public MetaRuleset alias(String attribute, String property)
+ {
+ ParameterCheck.notNull("attribute", attribute);
+ ParameterCheck.notNull("property", property);
+
+ TagAttribute attr = (TagAttribute) _attributes.remove(attribute);
+ if (attr != null)
+ {
+ _attributes.put(property, attr);
+ }
+
+ return this;
+ }
+
+ public Metadata finish()
+ {
+ assert !_rules.isEmpty();
+
+ if (!_attributes.isEmpty())
+ {
+ MetadataTarget target = this._getMetadataTarget();
+ int ruleEnd = _rules.size() - 1;
+
+ // now iterate over attributes
+ for (Map.Entry<String, TagAttribute> entry : _attributes.entrySet())
+ {
+ Metadata data = null;
+
+ int i = ruleEnd;
+
+ // First loop is always safe
+ do
+ {
+ MetaRule rule = _rules.get(i);
+ data = rule.applyRule(entry.getKey(), entry.getValue(), target);
+ i--;
+ } while (data == null && i >= 0);
+
+ if (data == null)
+ {
+ if (log.isLoggable(Level.SEVERE))
+ {
+ log.severe(entry.getValue() + " Unhandled by MetaTagHandler for type " + _type.getName());
+ }
+ }
+ else
+ {
+ _mappers.add(data);
+ }
+ }
+ }
+
+ if (_mappers.isEmpty())
+ {
+ return NONE;
+ }
+ else
+ {
+ return new MetadataImpl(_mappers.toArray(new Metadata[_mappers.size()]));
+ }
+ }
+
+ public MetaRuleset ignore(String attribute)
+ {
+ ParameterCheck.notNull("attribute", attribute);
+
+ _attributes.remove(attribute);
+
+ return this;
+ }
+
+ public MetaRuleset ignoreAll()
+ {
+ _attributes.clear();
+
+ return this;
+ }
+
+ private final MetadataTarget _getMetadataTarget()
+ {
+ String key = _type.getName();
+
+ MetadataTarget meta = _metadata.get(key);
+ if (meta == null)
+ {
+ try
+ {
+ meta = new MetadataTargetImpl(_type);
+ }
+ catch (IntrospectionException e)
+ {
+ throw new TagException(_tag, "Error Creating TargetMetadata", e);
+ }
+
+ _metadata.put(key, meta);
+ }
+
+ return meta;
+ }
+
+ private static class NullMetadata extends Metadata
+ {
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void applyMetadata(FaceletContext ctx, Object instance)
+ {
+ // do nothing
+ }
+ }
+}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/MetaTagHandlerImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/MetaTagHandlerImpl.java?rev=761982&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/MetaTagHandlerImpl.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/MetaTagHandlerImpl.java Sat Apr 4 18:44:59 2009
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.view.facelets.tag;
+
+import javax.faces.view.facelets.MetaRuleset;
+import javax.faces.view.facelets.MetaTagHandler;
+import javax.faces.view.facelets.TagConfig;
+
+import org.apache.myfaces.view.facelets.util.ParameterCheck;
+
+/**
+ * A base tag for wiring state to an object instance based on rules populated at the time of creating a MetaRuleset.
+ *
+ * @author Jacob Hookom
+ * @version $Id: MetaTagHandler.java,v 1.3 2008/07/13 19:01:35 rlubke Exp $
+ */
+public abstract class MetaTagHandlerImpl extends MetaTagHandler
+{
+ public MetaTagHandlerImpl(TagConfig config)
+ {
+ super(config);
+ }
+
+ /**
+ * Extend this method in order to add your own rules.
+ *
+ * @param type
+ * @return
+ */
+ protected MetaRuleset createMetaRuleset(Class<?> type)
+ {
+ ParameterCheck.notNull("type", type);
+
+ return new MetaRulesetImpl(this.tag, type);
+ }
+}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/MetadataImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/MetadataImpl.java?rev=761982&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/MetadataImpl.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/MetadataImpl.java Sat Apr 4 18:44:59 2009
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.view.facelets.tag;
+
+import javax.faces.view.facelets.FaceletContext;
+import javax.faces.view.facelets.Metadata;
+
+/**
+ *
+ * @author Jacob Hookom
+ * @version $Id: MetadataImpl.java,v 1.3 2008/07/13 19:01:36 rlubke Exp $
+ */
+final class MetadataImpl extends Metadata
+{
+ private final Metadata[] _mappers;
+ private final int _size;
+
+ public MetadataImpl(Metadata[] mappers)
+ {
+ _mappers = mappers;
+ _size = mappers.length;
+ }
+
+ public void applyMetadata(FaceletContext ctx, Object instance)
+ {
+ // TODO: PROFILE - Check if saving the _size worth it or if an enhanced for is better
+ for (int i = 0; i < _size; i++)
+ {
+ _mappers[i].applyMetadata(ctx, instance);
+ }
+ }
+}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/MetadataTargetImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/MetadataTargetImpl.java?rev=761982&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/MetadataTargetImpl.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/MetadataTargetImpl.java Sat Apr 4 18:44:59 2009
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.view.facelets.tag;
+
+import java.beans.IntrospectionException;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.faces.view.facelets.MetadataTarget;
+
+/**
+ *
+ * @author Jacob Hookom
+ * @version $Id: MetadataTargetImpl.java,v 1.3 2008/07/13 19:01:35 rlubke Exp $
+ */
+final class MetadataTargetImpl extends MetadataTarget
+{
+ private final Map<String, PropertyDescriptor> _pd;
+
+ private final Class<?> _type;
+
+ public MetadataTargetImpl(Class<?> type) throws IntrospectionException
+ {
+ _type = type;
+
+ _pd = new HashMap<String, PropertyDescriptor>();
+ for (PropertyDescriptor descriptor : Introspector.getBeanInfo(type).getPropertyDescriptors())
+ {
+ _pd.put(descriptor.getName(), descriptor);
+ }
+ }
+
+ public PropertyDescriptor getProperty(String name)
+ {
+ return _pd.get(name);
+ }
+
+ public Class<?> getPropertyType(String name)
+ {
+ PropertyDescriptor pd = getProperty(name);
+ if (pd != null)
+ {
+ return pd.getPropertyType();
+ }
+
+ return null;
+ }
+
+ public Method getReadMethod(String name)
+ {
+ PropertyDescriptor pd = getProperty(name);
+ if (pd != null)
+ {
+ return pd.getReadMethod();
+ }
+
+ return null;
+ }
+
+ public Class<?> getTargetClass()
+ {
+ return _type;
+ }
+
+ public Method getWriteMethod(String name)
+ {
+ PropertyDescriptor pd = getProperty(name);
+ if (pd != null)
+ {
+ return pd.getWriteMethod();
+ }
+
+ return null;
+ }
+
+ public boolean isTargetInstanceOf(Class<?> type)
+ {
+ return type.isAssignableFrom(_type);
+ }
+}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/MethodRule.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/MethodRule.java?rev=761982&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/MethodRule.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/MethodRule.java Sat Apr 4 18:44:59 2009
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.view.facelets.tag;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import javax.el.MethodExpression;
+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 javax.faces.view.facelets.TagAttributeException;
+
+/**
+ * Optional Rule for binding Method[Binding|Expression] properties
+ *
+ * @author Mike Kienenberger
+ * @author Jacob Hookom
+ */
+public final class MethodRule extends MetaRule
+{
+
+ private final String methodName;
+
+ private final Class<?> returnTypeClass;
+
+ private final Class<?>[] params;
+
+ public MethodRule(String methodName, Class<?> returnTypeClass, Class<?>[] params)
+ {
+ this.methodName = methodName;
+ this.returnTypeClass = returnTypeClass;
+ this.params = params;
+ }
+
+ public Metadata applyRule(String name, TagAttribute attribute, MetadataTarget meta)
+ {
+ if (false == name.equals(this.methodName))
+ return null;
+
+ if (MethodExpression.class.equals(meta.getPropertyType(name)))
+ {
+ Method method = meta.getWriteMethod(name);
+ if (method != null)
+ {
+ return new MethodExpressionMetadata(method, attribute, this.returnTypeClass, this.params);
+ }
+ }
+
+ return null;
+ }
+
+ private class MethodExpressionMetadata extends Metadata
+ {
+ private final Method _method;
+
+ private final TagAttribute _attribute;
+
+ private Class<?>[] _paramList;
+
+ private Class<?> _returnType;
+
+ public MethodExpressionMetadata(Method method, TagAttribute attribute, Class<?> returnType,
+ Class<?>[] paramList)
+ {
+ _method = method;
+ _attribute = attribute;
+ _paramList = paramList;
+ _returnType = returnType;
+ }
+
+ public void applyMetadata(FaceletContext ctx, Object instance)
+ {
+ MethodExpression expr = _attribute.getMethodExpression(ctx, _returnType, _paramList);
+
+ try
+ {
+ _method.invoke(instance, new Object[] { expr });
+ }
+ catch (InvocationTargetException e)
+ {
+ throw new TagAttributeException(_attribute, e.getCause());
+ }
+ catch (Exception e)
+ {
+ throw new TagAttributeException(_attribute, e);
+ }
+ }
+ }
+}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/TagAttributeImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/TagAttributeImpl.java?rev=761982&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/TagAttributeImpl.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/TagAttributeImpl.java Sat Apr 4 18:44:59 2009
@@ -0,0 +1,323 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.view.facelets.tag;
+
+import javax.el.ELException;
+import javax.el.ExpressionFactory;
+import javax.el.MethodExpression;
+import javax.el.ValueExpression;
+import javax.faces.view.facelets.FaceletContext;
+import javax.faces.view.facelets.Location;
+import javax.faces.view.facelets.TagAttribute;
+import javax.faces.view.facelets.TagAttributeException;
+
+import org.apache.myfaces.view.facelets.el.ELText;
+import org.apache.myfaces.view.facelets.el.TagMethodExpression;
+import org.apache.myfaces.view.facelets.el.TagValueExpression;
+
+/**
+ * Representation of a Tag's attribute in a Facelet File
+ *
+ * @author Jacob Hookom
+ * @version $Id: TagAttribute.java,v 1.9 2008/07/13 19:01:35 rlubke Exp $
+ */
+public final class TagAttributeImpl extends TagAttribute
+{
+
+ private final boolean literal;
+
+ private final String localName;
+
+ private final Location location;
+
+ private final String namespace;
+
+ private final String qName;
+
+ private final String value;
+
+ private String string;
+
+ public TagAttributeImpl(Location location, String ns, String localName, String qName, String value)
+ {
+ this.location = location;
+ this.namespace = ns;
+ this.localName = localName;
+ this.qName = qName;
+ this.value = value;
+ try
+ {
+ this.literal = ELText.isLiteral(this.value);
+ }
+ catch (ELException e)
+ {
+ throw new TagAttributeException(this, e);
+ }
+ }
+
+ /**
+ * If literal, return {@link Boolean#getBoolean(java.lang.String) Boolean.getBoolean(java.lang.String)} passing our
+ * value, otherwise call {@link #getObject(FaceletContext, Class) getObject(FaceletContext, Class)}.
+ *
+ * @see Boolean#getBoolean(java.lang.String)
+ * @see #getObject(FaceletContext, Class)
+ * @param ctx
+ * FaceletContext to use
+ * @return boolean value
+ */
+ public boolean getBoolean(FaceletContext ctx)
+ {
+ if (this.literal)
+ {
+ return Boolean.valueOf(this.value).booleanValue();
+ }
+ else
+ {
+ return ((Boolean) this.getObject(ctx, Boolean.class)).booleanValue();
+ }
+ }
+
+ /**
+ * If literal, call {@link Integer#parseInt(java.lang.String) Integer.parseInt(String)}, otherwise call
+ * {@link #getObject(FaceletContext, Class) getObject(FaceletContext, Class)}.
+ *
+ * @see Integer#parseInt(java.lang.String)
+ * @see #getObject(FaceletContext, Class)
+ * @param ctx
+ * FaceletContext to use
+ * @return int value
+ */
+ public int getInt(FaceletContext ctx)
+ {
+ if (this.literal)
+ {
+ return Integer.parseInt(this.value);
+ }
+ else
+ {
+ return ((Number) this.getObject(ctx, Integer.class)).intValue();
+ }
+ }
+
+ /**
+ * Local name of this attribute
+ *
+ * @return local name of this attribute
+ */
+ public String getLocalName()
+ {
+ return this.localName;
+ }
+
+ /**
+ * The location of this attribute in the FaceletContext
+ *
+ * @return the TagAttribute's location
+ */
+ public Location getLocation()
+ {
+ return this.location;
+ }
+
+ /**
+ * Create a MethodExpression, using this attribute's value as the expression String.
+ *
+ * @see ExpressionFactory#createMethodExpression(javax.el.ELContext, java.lang.String, java.lang.Class,
+ * java.lang.Class[])
+ * @see MethodExpression
+ * @param ctx
+ * FaceletContext to use
+ * @param type
+ * expected return type
+ * @param paramTypes
+ * parameter type
+ * @return a MethodExpression instance
+ */
+ public MethodExpression getMethodExpression(FaceletContext ctx, Class<?> type, Class<?>[] paramTypes)
+ {
+ try
+ {
+ ExpressionFactory f = ctx.getExpressionFactory();
+ return new TagMethodExpression(this, f.createMethodExpression(ctx, this.value, type, paramTypes));
+ }
+ catch (Exception e)
+ {
+ throw new TagAttributeException(this, e);
+ }
+ }
+
+ /**
+ * The resolved Namespace for this attribute
+ *
+ * @return resolved Namespace
+ */
+ public String getNamespace()
+ {
+ return this.namespace;
+ }
+
+ /**
+ * Delegates to getObject with Object.class as a param
+ *
+ * @see #getObject(FaceletContext, Class)
+ * @param ctx
+ * FaceletContext to use
+ * @return Object representation of this attribute's value
+ */
+ public Object getObject(FaceletContext ctx)
+ {
+ return this.getObject(ctx, Object.class);
+ }
+
+ /**
+ * The qualified name for this attribute
+ *
+ * @return the qualified name for this attribute
+ */
+ public String getQName()
+ {
+ return this.qName;
+ }
+
+ /**
+ * Return the literal value of this attribute
+ *
+ * @return literal value
+ */
+ public String getValue()
+ {
+ return this.value;
+ }
+
+ /**
+ * If literal, then return our value, otherwise delegate to getObject, passing String.class.
+ *
+ * @see #getObject(FaceletContext, Class)
+ * @param ctx
+ * FaceletContext to use
+ * @return String value of this attribute
+ */
+ public String getValue(FaceletContext ctx)
+ {
+ if (this.literal)
+ {
+ return this.value;
+ }
+ else
+ {
+ return (String) this.getObject(ctx, String.class);
+ }
+ }
+
+ /**
+ * If literal, simply coerce our String literal value using an ExpressionFactory, otherwise create a ValueExpression
+ * and evaluate it.
+ *
+ * @see ExpressionFactory#coerceToType(java.lang.Object, java.lang.Class)
+ * @see ExpressionFactory#createValueExpression(javax.el.ELContext, java.lang.String, java.lang.Class)
+ * @see ValueExpression
+ * @param ctx
+ * FaceletContext to use
+ * @param type
+ * expected return type
+ * @return Object value of this attribute
+ */
+ public Object getObject(FaceletContext ctx, Class<?> type)
+ {
+ if (this.literal)
+ {
+ if (String.class.equals(type))
+ {
+ return this.value;
+ }
+ else
+ {
+ try
+ {
+ return ctx.getExpressionFactory().coerceToType(this.value, type);
+ }
+ catch (Exception e)
+ {
+ throw new TagAttributeException(this, e);
+ }
+ }
+ }
+ else
+ {
+ ValueExpression ve = this.getValueExpression(ctx, type);
+ try
+ {
+ return ve.getValue(ctx);
+ }
+ catch (Exception e)
+ {
+ throw new TagAttributeException(this, e);
+ }
+ }
+ }
+
+ /**
+ * Create a ValueExpression, using this attribute's literal value and the passed expected type.
+ *
+ * @see ExpressionFactory#createValueExpression(javax.el.ELContext, java.lang.String, java.lang.Class)
+ * @see ValueExpression
+ * @param ctx
+ * FaceletContext to use
+ * @param type
+ * expected return type
+ * @return ValueExpression instance
+ */
+ public ValueExpression getValueExpression(FaceletContext ctx, Class<?> type)
+ {
+ try
+ {
+ ExpressionFactory f = ctx.getExpressionFactory();
+ return new TagValueExpression(this, f.createValueExpression(ctx, this.value, type));
+ }
+ catch (Exception e)
+ {
+ throw new TagAttributeException(this, e);
+ }
+ }
+
+ /**
+ * If this TagAttribute is literal (not #{..} or ${..})
+ *
+ * @return true if this attribute is literal
+ */
+ public boolean isLiteral()
+ {
+ return this.literal;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#toString()
+ */
+ public String toString()
+ {
+ if (this.string == null)
+ {
+ this.string = this.location + " " + this.qName + "=\"" + this.value + "\"";
+ }
+ return this.string;
+ }
+
+}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/TagAttributesImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/TagAttributesImpl.java?rev=761982&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/TagAttributesImpl.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/TagAttributesImpl.java Sat Apr 4 18:44:59 2009
@@ -0,0 +1,201 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.view.facelets.tag;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.faces.view.facelets.TagAttribute;
+import javax.faces.view.facelets.TagAttributes;
+
+/**
+ * A set of TagAttributes, usually representing all attributes on a Tag.
+ *
+ * TODO: PROFILE - Explore the possibility of using HashMap instead of sorted arrays.
+ * The footprint should be higher, but the instanciation and access speed should be faster
+ * Instanciation: from O(n log n) to O(1)
+ * Access: from O(log n) to O(1)
+ *
+ * @see org.apache.myfaces.view.facelets.tag.Tag
+ * @see org.apache.myfaces.view.facelets.tag.TagAttributeImpl
+ * @author Jacob Hookom
+ * @version $Id: TagAttributes.java,v 1.3 2008/07/13 19:01:35 rlubke Exp $
+ */
+public final class TagAttributesImpl extends TagAttributes
+{
+ private final static TagAttribute[] EMPTY = new TagAttribute[0];
+
+ private final TagAttribute[] _attributes;
+
+ private final String[] _namespaces;
+
+ private final List<TagAttribute[]> _nsattrs;
+
+ /**
+ *
+ */
+ public TagAttributesImpl(TagAttribute[] attrs)
+ {
+ _attributes = attrs;
+
+ // grab namespaces
+ Set<String> set = new HashSet<String>();
+ for (TagAttribute attribute : _attributes)
+ {
+ set.add(attribute.getNamespace());
+ }
+
+ _namespaces = set.toArray(new String[set.size()]);
+ Arrays.sort(_namespaces);
+
+ // assign attrs
+ int size = _namespaces.length;
+ List<List<TagAttribute>> temp = new ArrayList<List<TagAttribute>>(size);
+ for (int i = 0; i < size; i++)
+ {
+ temp.add(new ArrayList<TagAttribute>());
+ }
+
+ for (TagAttribute attribute : _attributes)
+ {
+ temp.get(Arrays.binarySearch(_namespaces, attribute.getNamespace())).add(attribute);
+ }
+
+ _nsattrs = new ArrayList<TagAttribute[]>(size);
+ for (List<TagAttribute> l : temp)
+ {
+ _nsattrs.add(l.toArray(new TagAttribute[l.size()]));
+ }
+ }
+
+ /**
+ * Return an array of all TagAttributes in this set
+ *
+ * @return a non-null array of TagAttributes
+ */
+ public TagAttribute[] getAll()
+ {
+ return _attributes;
+ }
+
+ /**
+ * Using no namespace, find the TagAttribute
+ *
+ * @see #get(String, String)
+ * @param localName
+ * tag attribute name
+ * @return the TagAttribute found, otherwise null
+ */
+ public TagAttribute get(String localName)
+ {
+ return get("", localName);
+ }
+
+ /**
+ * Find a TagAttribute that matches the passed namespace and local name.
+ *
+ * @param ns
+ * namespace of the desired attribute
+ * @param localName
+ * local name of the attribute
+ * @return a TagAttribute found, otherwise null
+ */
+ public TagAttribute get(String ns, String localName)
+ {
+ if (ns != null && localName != null)
+ {
+ int idx = Arrays.binarySearch(_namespaces, ns);
+ if (idx >= 0)
+ {
+ for (TagAttribute attribute : _nsattrs.get(idx))
+ {
+ if (localName.equals(attribute.getLocalName()))
+ {
+ return attribute;
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Get all TagAttributes for the passed namespace
+ *
+ * @param namespace
+ * namespace to search
+ * @return a non-null array of TagAttributes
+ */
+ public TagAttribute[] getAll(String namespace)
+ {
+ int idx = 0;
+ if (namespace == null)
+ {
+ idx = Arrays.binarySearch(_namespaces, "");
+ }
+ else
+ {
+ idx = Arrays.binarySearch(_namespaces, namespace);
+ }
+
+ if (idx >= 0)
+ {
+ return _nsattrs.get(idx);
+ }
+
+ return EMPTY;
+ }
+
+ /**
+ * A list of Namespaces found in this set
+ *
+ * @return a list of Namespaces found in this set
+ */
+ public String[] getNamespaces()
+ {
+ return _namespaces;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString()
+ {
+ StringBuffer sb = new StringBuffer();
+ for (TagAttribute attribute : _attributes)
+ {
+ sb.append(attribute);
+ sb.append(' ');
+ }
+
+ if (sb.length() > 1)
+ {
+ sb.setLength(sb.length() - 1);
+ }
+
+ return sb.toString();
+ }
+}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/TagDecorator.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/TagDecorator.java?rev=761982&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/TagDecorator.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/TagDecorator.java Sat Apr 4 18:44:59 2009
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.view.facelets.tag;
+
+import javax.faces.view.facelets.Tag;
+
+/**
+ * Provides the ability to completely change the Tag before it's processed for compiling with the associated TagHandler.
+ * <p /> You could take <input type="text" /> and convert it to <h:inputText /> before compiling.
+ *
+ * @author Jacob Hookom
+ * @version $Id: TagDecorator.java,v 1.3 2008/07/13 19:01:35 rlubke Exp $
+ */
+public interface TagDecorator
+{
+
+ /**
+ * If handled, return a new Tag instance, otherwise return null
+ *
+ * @param tag
+ * tag to be decorated
+ * @return a decorated tag, otherwise null
+ */
+ public Tag decorate(Tag tag);
+}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/TagHandlerFactory.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/TagHandlerFactory.java?rev=761982&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/TagHandlerFactory.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/TagHandlerFactory.java Sat Apr 4 18:44:59 2009
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.view.facelets.tag;
+
+import javax.el.ELException;
+import javax.faces.FacesException;
+import javax.faces.view.facelets.TagConfig;
+import javax.faces.view.facelets.TagHandler;
+
+/**
+ * Delegate class for TagLibraries
+ *
+ * @see TagLibrary
+ * @author Jacob Hookom
+ * @version $Id: TagHandlerFactory.java,v 1.4 2008/07/13 19:01:35 rlubke Exp $
+ */
+interface TagHandlerFactory
+{
+ /**
+ * A new TagHandler instantiated with the passed TagConfig
+ *
+ * @param cfg
+ * TagConfiguration information
+ * @return a new TagHandler
+ * @throws FacesException
+ * @throws ELException
+ */
+ public TagHandler createHandler(TagConfig cfg) throws FacesException, ELException;
+}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/TagHandlerUtils.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/TagHandlerUtils.java?rev=761982&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/TagHandlerUtils.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/TagHandlerUtils.java Sat Apr 4 18:44:59 2009
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.view.facelets.tag;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import javax.faces.view.facelets.FaceletHandler;
+
+/**
+ * This class was created to gather some code from latest Facelets not existing in latest JSF 2.0 spec.
+ * Also, since it was created on the fly while converting, it's highly possible that methods in this class
+ * should be moved in a more logical location and/or removed.
+ *
+ * @author Simon Lessard (latest modification by $Author: slessard $)
+ * @version $Revision: 696523 $ $Date: 2009-03-21 12:31:27 -0400 (mer., 17 sept. 2008) $
+ *
+ * @since 2.0
+ */
+public final class TagHandlerUtils
+{
+
+ /**
+ * From TagHandler:
+ * protected final <T> Iterator<T> findNextByType(Class<T> type)
+ *
+ * @param type
+ * @return
+ */
+ @SuppressWarnings("unchecked")
+ public static <T> Collection<T> findNextByType(FaceletHandler nextHandler, Class<T> type)
+ {
+ List<T> found = new ArrayList<T>();
+ if (type.isAssignableFrom(nextHandler.getClass()))
+ {
+ found.add((T)nextHandler);
+ }
+ else if (nextHandler instanceof CompositeFaceletHandler)
+ {
+ for (FaceletHandler handler : ((CompositeFaceletHandler)nextHandler).getHandlers())
+ {
+ if (type.isAssignableFrom(handler.getClass()))
+ {
+ found.add((T)handler);
+ }
+ }
+ }
+
+ return found;
+ }
+
+ private TagHandlerUtils()
+ {
+
+ }
+}
Added: myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/TagLibrary.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/TagLibrary.java?rev=761982&view=auto
==============================================================================
--- myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/TagLibrary.java (added)
+++ myfaces/core/branches/2_0_0/impl/src/main/java/org/apache/myfaces/view/facelets/tag/TagLibrary.java Sat Apr 4 18:44:59 2009
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.myfaces.view.facelets.tag;
+
+import java.lang.reflect.Method;
+
+import javax.faces.FacesException;
+import javax.faces.view.facelets.TagConfig;
+import javax.faces.view.facelets.TagHandler;
+
+/**
+ * A library of Tags associated with one or more namespaces.
+ *
+ * @author Jacob Hookom
+ * @version $Id: TagLibrary.java,v 1.3 2008/07/13 19:01:36 rlubke Exp $
+ */
+public interface TagLibrary
+{
+
+ /**
+ * If this library contains the passed namespace
+ *
+ * @param ns
+ * namespace
+ * @return true if the namespace is used in this library
+ */
+ public boolean containsNamespace(String ns);
+
+ /**
+ * If this library contains a TagHandler for the namespace and local name
+ *
+ * @param ns
+ * namespace
+ * @param localName
+ * local name
+ * @return true if handled by this library
+ */
+ public boolean containsTagHandler(String ns, String localName);
+
+ /**
+ * Create a new instance of a TagHandler, using the passed TagConfig
+ *
+ * @param ns
+ * namespace
+ * @param localName
+ * local name
+ * @param tag
+ * configuration information
+ * @return a new TagHandler instance
+ * @throws FacesException
+ */
+ public TagHandler createTagHandler(String ns, String localName, TagConfig tag) throws FacesException;
+
+ /**
+ * If this library contains the specified function name
+ *
+ * @param ns
+ * namespace
+ * @param name
+ * function name
+ * @return true if handled
+ */
+ public boolean containsFunction(String ns, String name);
+
+ /**
+ * Return a Method instance for the passed namespace and name
+ *
+ * @param ns
+ * namespace
+ * @param name
+ * function name
+ * @return
+ */
+ public Method createFunction(String ns, String name);
+}