Hi Grant,

Could you please avoid combining code changes and reformatting in the
same patch? It is just impossible from this patch to determine what
*real* changes you have made to ComponentUtils.

And I believe the coding convention here is to use spaces, *not* tabs,
but you have replaced all spaces *with* tabs in ComponentUtils.

What were the actual ComponentUtils changes?

Thanks,
Simon

[EMAIL PROTECTED] schrieb:
> Author: grantsmith
> Date: Tue Mar 25 08:40:50 2008
> New Revision: 640864
>
> URL: http://svn.apache.org/viewvc?rev=640864&view=rev
> Log:
> https://issues.apache.org/jira/browse/TOMAHAWK-1216 patch applied
>
> Added:
>     
> myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/captcha/util/CAPTCHAConstants.java
>     
> myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/captcha/util/CAPTCHAResponseStream.java
> Modified:
>     
> myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/captcha/CAPTCHARenderer.java
>     
> myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/captcha/util/CAPTCHAImageGenerator.java
>     
> myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/util/ComponentUtils.java
>     myfaces/tomahawk/trunk/sandbox/examples/src/main/webapp/WEB-INF/web.xml
>
> Modified: 
> myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/captcha/CAPTCHARenderer.java
> URL: 
> http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/captcha/CAPTCHARenderer.java?rev=640864&r1=640863&r2=640864&view=diff
> ==============================================================================
> --- 
> myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/captcha/CAPTCHARenderer.java
>  (original)
> +++ 
> myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/captcha/CAPTCHARenderer.java
>  Tue Mar 25 08:40:50 2008
> @@ -19,22 +19,40 @@
>  package org.apache.myfaces.custom.captcha;
>  
>  import java.io.IOException;
> +import java.util.Map;
>  
> +import javax.faces.FacesException;
> +import javax.faces.FactoryFinder;
>  import javax.faces.component.UIComponent;
>  import javax.faces.context.FacesContext;
> +import javax.faces.context.FacesContextFactory;
> +import javax.faces.context.ResponseStream;
>  import javax.faces.context.ResponseWriter;
> +import javax.faces.lifecycle.Lifecycle;
> +import javax.faces.lifecycle.LifecycleFactory;
>  import javax.faces.render.Renderer;
> +import javax.servlet.ServletContext;
> +import javax.servlet.http.HttpServletRequest;
> +import javax.servlet.http.HttpServletResponse;
> +
> +import org.apache.myfaces.component.html.util.ParameterResourceHandler;
> +import org.apache.myfaces.custom.captcha.util.CAPTCHAImageGenerator;
> +import org.apache.myfaces.custom.captcha.util.CAPTCHAResponseStream;
> +import org.apache.myfaces.custom.captcha.util.CAPTCHATextGenerator;
> +import org.apache.myfaces.custom.util.ComponentUtils;
> +import org.apache.myfaces.renderkit.html.util.AddResource;
> +import org.apache.myfaces.renderkit.html.util.AddResourceFactory;
> +import org.apache.myfaces.renderkit.html.util.ResourceLoader;
> +import org.apache.myfaces.shared_tomahawk.renderkit.html.HTML;
>  
> -public class CAPTCHARenderer extends Renderer {
> -     
> -     private static final String CAPTCHA_SERVLET_NAME = 
> "apache_captcha_servlet_url";
> +public class CAPTCHARenderer extends Renderer implements ResourceLoader {
>  
>       public void encodeBegin(FacesContext context, UIComponent component)
>                       throws IOException {
>  
>               CAPTCHAComponent captchaComponent = (CAPTCHAComponent) 
> component;
>               
> -             renderCAPTCHA(context, captchaComponent);
> +             generateImageTag(context, captchaComponent);
>       }
>       
>       public void encodeEnd(FacesContext context, UIComponent component)
> @@ -43,25 +61,104 @@
>       }
>  
>       /*
> -      * This helper method renders the img tag that will
> -      * call the CAPTCHAServlet to render the CAPTCHA image. 
> +      * This helper method is used for generating the img tag that will
> +      * use the (AddResource) to generate the url of the generated image.
>        */
> -     private void renderCAPTCHA(FacesContext context, CAPTCHAComponent 
> component)
> +     private void generateImageTag(FacesContext context, CAPTCHAComponent 
> component)
>                       throws IOException {
> +             
> +        AddResource addResource = null;
> +        String url = null;
> +             CAPTCHAComponent captchaComponent = (CAPTCHAComponent) 
> component;
>               ResponseWriter writer = context.getResponseWriter();
> +        Map params = ComponentUtils.getParameterMap(component);
> +        String captchaSessionKeyName = 
> captchaComponent.getCaptchaSessionKeyName();
> +        
> +        writer.startElement(HTML.IMG_ELEM, captchaComponent);
> +
> +        if (captchaSessionKeyName != null) {
> +                     
> params.put(CAPTCHAComponent.ATTRIBUTE_CAPTCHASESSIONKEYNAME,
> +                                     captchaSessionKeyName);
> +             }
> +
> +             addResource = AddResourceFactory.getInstance(context);
> +        
> +             url = context.getExternalContext().encodeResourceURL(
> +                             addResource.getResourceUri(context,
> +                                             new 
> ParameterResourceHandler(this.getClass(), params)));
> +        
> +        writer.writeAttribute(HTML.SRC_ATTR, url, null);
>  
> -             writer.startElement("img", component);
> -             writer.writeAttribute("src", CAPTCHA_SERVLET_NAME + "?"
> -                             + appendParameters(component), "src");
> -             writer.endElement("img");
> +        writer.endElement(HTML.IMG_ELEM);            
>       }
>  
> +     
> +    /*
> +     * This method is implemented to be called from the (AddResource).
> +     * It wraps the CAPTCHA image generation.
> +     */
> +     public void serveResource(ServletContext servletContext,
> +                     HttpServletRequest request, HttpServletResponse 
> response,
> +                     String resourceUri) throws IOException {
> +             
> +             // get the FacesContext from the ServletContext.
> +             FacesContextFactory facesContextFactory = (FacesContextFactory) 
> FactoryFinder
> +                             
> .getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
> +             LifecycleFactory lifecycleFactory = (LifecycleFactory) 
> FactoryFinder
> +                             .getFactory(FactoryFinder.LIFECYCLE_FACTORY);
> +             Lifecycle lifecycle = 
> lifecycleFactory.getLifecycle(ComponentUtils
> +                             .getLifecycleId(servletContext));
> +             FacesContext facesContext = facesContextFactory.getFacesContext(
> +                             servletContext, request, response, lifecycle);
> +             facesContext.setResponseStream(new 
> CAPTCHAResponseStream(response
> +                             .getOutputStream()));
> +             
> +             // render the CAPTCHA.
> +             try {
> +                     try {
> +                             renderCAPTCHA(facesContext);
> +                     } catch (IOException e) {
> +                             throw new FacesException("Could not render the 
> CAPTCHA : "
> +                                             + e.getMessage(), e);
> +                     }
> +                     facesContext.getResponseStream().close();
> +             } finally {
> +                     facesContext.release();
> +             }
> +     }
> +         
>       /*
> -      * This helper method is used for appending the parameters to the
> -      * CAPTCHA servlet.
> +      * This method is used for rendering the CAPTCHA component.
>        */
> -     private String appendParameters(CAPTCHAComponent component) {
> -             return CAPTCHAComponent.ATTRIBUTE_CAPTCHASESSIONKEYNAME + "="
> -                             + component.getCaptchaSessionKeyName();
> -     }
> +     protected void renderCAPTCHA(FacesContext facesContext) throws 
> IOException{
> +             
> +             // Initialize the CAPTCHA world.
> +             HttpServletResponse response = (HttpServletResponse) 
> facesContext
> +                             .getExternalContext().getResponse();
> +             ResponseStream out = facesContext.getResponseStream();
> +             final Map requestMap = facesContext.getExternalContext()
> +                             .getRequestParameterMap();
> +             HttpServletRequest request = (HttpServletRequest) facesContext
> +                             .getExternalContext().getRequest();
> +             String captchaText = null;
> +             CAPTCHAImageGenerator captchaImageGenerator = new 
> CAPTCHAImageGenerator();
> +             String captchaSessionKeyName = requestMap.get(
> +                             
> CAPTCHAComponent.ATTRIBUTE_CAPTCHASESSIONKEYNAME).toString();
> +             
> +             try {                   
> +                     
> +                     // Generate random CAPTCHA text.
> +                     captchaText = CAPTCHATextGenerator.generateRandomText();
> +
> +                     // Generate the image.
> +                     captchaImageGenerator.generateImage(response, 
> captchaText);
> +
> +                     // Set the generated text in the user session.
> +                     
> request.getSession().setAttribute(captchaSessionKeyName, captchaText);        
>                                   
> +                     
> +             } finally {
> +                     out.close();
> +                     facesContext.responseComplete();
> +             }
> +     }      
>  }
>
> Added: 
> myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/captcha/util/CAPTCHAConstants.java
> URL: 
> http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/captcha/util/CAPTCHAConstants.java?rev=640864&view=auto
> ==============================================================================
> --- 
> myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/captcha/util/CAPTCHAConstants.java
>  (added)
> +++ 
> myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/captcha/util/CAPTCHAConstants.java
>  Tue Mar 25 08:40:50 2008
> @@ -0,0 +1,36 @@
> +/*
> + * 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.custom.captcha.util;
> +
> +/**
> + * This interface holds all the CAPTCHA related constants.
> + */
> +public interface CAPTCHAConstants {
> +     
> +     public static final int CAPTCHA_WIDTH = 290;
> +
> +     public static final int CAPTCHA_HEIGHT = 81;
> +
> +     public static final double PI = 3.1415926535897932384626433832795;
> +
> +     public static final int TEXT_X_COORDINATE = 50;
> +
> +     public static final int TEXT_Y_COORDINATE = 60;
> +     
> +}
>
> Modified: 
> myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/captcha/util/CAPTCHAImageGenerator.java
> URL: 
> http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/captcha/util/CAPTCHAImageGenerator.java?rev=640864&r1=640863&r2=640864&view=diff
> ==============================================================================
> --- 
> myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/captcha/util/CAPTCHAImageGenerator.java
>  (original)
> +++ 
> myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/captcha/util/CAPTCHAImageGenerator.java
>  Tue Mar 25 08:40:50 2008
> @@ -35,16 +35,10 @@
>  
>  
>  /**
> - * This class is responsible for generating the
> - * CAPTCHA image.
> + * This class is responsible for generating the CAPTCHA image.
>   */
>  public class CAPTCHAImageGenerator {
> -
> -     private static final int CAPTCHA_WIDTH = 290;
> -     private static final int CAPTCHA_HEIGHT = 81;
> -     private static final double PI = 3.1415926535897932384626433832795;
> -     private static final int TEXT_X_COORDINATE = 50;
> -     private static final int TEXT_Y_COORDINATE = 60;
> +     
>       private static final Color startingColor = new Color(150, 50, 150);
>       private static final Color endingColor = new Color(255, 255, 255);
>  
> @@ -53,8 +47,6 @@
>        */
>       private void drawTextOnImage(Graphics2D graphics, String captchaText) {
>  
> -
> -
>               Font font = null;
>               TextLayout textLayout = null;
>               double currentFontStatus = Math.random();
> @@ -71,7 +63,8 @@
>               textLayout = new TextLayout(captchaText, font, graphics
>                               .getFontRenderContext());
>  
> -             textLayout.draw(graphics, TEXT_X_COORDINATE, TEXT_Y_COORDINATE);
> +             textLayout.draw(graphics, CAPTCHAConstants.TEXT_X_COORDINATE,
> +                             CAPTCHAConstants.TEXT_Y_COORDINATE);
>       }
>  
>       /*
> @@ -116,8 +109,9 @@
>  
>  
>               // Create the CAPTCHA Image.
> -             bufferedImage = new BufferedImage(CAPTCHA_WIDTH,
> -                             CAPTCHA_HEIGHT, 
> BufferedImage.TYPE_BYTE_INDEXED);
> +             bufferedImage = new 
> BufferedImage(CAPTCHAConstants.CAPTCHA_WIDTH,
> +                             CAPTCHAConstants.CAPTCHA_HEIGHT,
> +                             BufferedImage.TYPE_BYTE_INDEXED);
>  
>               // Setup the graphics object.
>               graphics = bufferedImage.createGraphics();
> @@ -200,20 +194,21 @@
>               Random random = new Random();
>  
>               // Random Y Points.
> -             yPoint1 = random.nextInt(CAPTCHA_HEIGHT);
> -             yPoint2 = random.nextInt(CAPTCHA_HEIGHT);
> -             yPoint3 = CAPTCHA_HEIGHT / 2;
> -             yPoint4 = random.nextInt(CAPTCHA_HEIGHT);
> -             yPoint5 = random.nextInt(CAPTCHA_HEIGHT);
> +             yPoint1 = random.nextInt(CAPTCHAConstants.CAPTCHA_HEIGHT);
> +             yPoint2 = random.nextInt(CAPTCHAConstants.CAPTCHA_HEIGHT);
> +             yPoint3 = CAPTCHAConstants.CAPTCHA_HEIGHT / 2;
> +             yPoint4 = random.nextInt(CAPTCHAConstants.CAPTCHA_HEIGHT);
> +             yPoint5 = random.nextInt(CAPTCHAConstants.CAPTCHA_HEIGHT);
>  
>               // Draw the random broken line.
> -             drawThickLineOnImage(graphics, 0, yPoint1, CAPTCHA_WIDTH / 4, 
> yPoint2);
> -             drawThickLineOnImage(graphics, CAPTCHA_WIDTH / 4, yPoint2,
> -                             CAPTCHA_WIDTH / 2, yPoint3);
> -             drawThickLineOnImage(graphics, CAPTCHA_WIDTH / 2, yPoint3,
> -                             3 * CAPTCHA_WIDTH / 4, yPoint4);
> -             drawThickLineOnImage(graphics, 3 * CAPTCHA_WIDTH / 4, yPoint4,
> -                             CAPTCHA_WIDTH, yPoint5);
> +             drawThickLineOnImage(graphics, 0, yPoint1,
> +                             CAPTCHAConstants.CAPTCHA_WIDTH / 4, yPoint2);
> +             drawThickLineOnImage(graphics, CAPTCHAConstants.CAPTCHA_WIDTH / 
> 4,
> +                             yPoint2, CAPTCHAConstants.CAPTCHA_WIDTH / 2, 
> yPoint3);
> +             drawThickLineOnImage(graphics, CAPTCHAConstants.CAPTCHA_WIDTH / 
> 2,
> +                             yPoint3, 3 * CAPTCHAConstants.CAPTCHA_WIDTH / 
> 4, yPoint4);
> +             drawThickLineOnImage(graphics, 3 * 
> CAPTCHAConstants.CAPTCHA_WIDTH / 4,
> +                             yPoint4, CAPTCHAConstants.CAPTCHA_WIDTH, 
> yPoint5);
>       }
>  
>       /*
> @@ -223,7 +218,8 @@
>       private double getDelta(int period, double i, double phase, double 
> frames) {
>               return (double) (period / 2)
>                               * Math.sin((double) i / (double) period
> -                                             + (2 * PI * (double) phase) / 
> (double) frames);
> +                                             + (2 * CAPTCHAConstants.PI * 
> (double) phase)
> +                                             / (double) frames);
>       }
>  
>       /*
>
> Added: 
> myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/captcha/util/CAPTCHAResponseStream.java
> URL: 
> http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/captcha/util/CAPTCHAResponseStream.java?rev=640864&view=auto
> ==============================================================================
> --- 
> myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/captcha/util/CAPTCHAResponseStream.java
>  (added)
> +++ 
> myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/captcha/util/CAPTCHAResponseStream.java
>  Tue Mar 25 08:40:50 2008
> @@ -0,0 +1,56 @@
> +/*
> + * 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.custom.captcha.util;
> +
> +import java.io.IOException;
> +import java.io.OutputStream;
> +import javax.faces.context.ResponseStream;
> +
> +/**
> + * This class is responsible for wrapping the CAPTCHA Image
> + * response stream.
> + */
> +public final class CAPTCHAResponseStream extends ResponseStream {
> +     private final OutputStream _out;
> +
> +     public CAPTCHAResponseStream(OutputStream out) {
> +             _out = out;
> +     }
> +
> +     public void close() throws IOException {
> +             _out.flush();
> +             _out.close();
> +     }
> +
> +     public void flush() throws IOException {
> +             _out.flush();
> +     }
> +
> +     public void write(byte[] b, int off, int len) throws IOException {
> +             _out.write(b, off, len);
> +     }
> +
> +     public void write(byte[] b) throws IOException {
> +             _out.write(b);
> +     }
> +
> +     public void write(int b) throws IOException {
> +             _out.write(b);
> +     }
> +}
>
> Modified: 
> myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/util/ComponentUtils.java
> URL: 
> http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/util/ComponentUtils.java?rev=640864&r1=640863&r2=640864&view=diff
> ==============================================================================
> --- 
> myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/util/ComponentUtils.java
>  (original)
> +++ 
> myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/util/ComponentUtils.java
>  Tue Mar 25 08:40:50 2008
> @@ -20,9 +20,16 @@
>  package org.apache.myfaces.custom.util;
>  
>  import javax.faces.component.UIComponent;
> +import javax.faces.component.UIParameter;
>  import javax.faces.component.html.HtmlMessages;
>  import javax.faces.context.FacesContext;
> +import javax.faces.lifecycle.LifecycleFactory;
> +import javax.faces.webapp.FacesServlet;
> +import javax.servlet.ServletContext;
> +
> +import java.util.HashMap;
>  import java.util.Iterator;
> +import java.util.Map;
>  
>  /**
>   * User: treeder
> @@ -32,7 +39,7 @@
>  public final class ComponentUtils
>  {
>  
> -     private ComponentUtils(){
> +     private ComponentUtils() {
>  
>       }
>  
> @@ -44,111 +51,140 @@
>       * @param clientId
>       * @return component referenced by clientId or null if not found
>       */
> -    public static UIComponent findComponentByClientId(FacesContext context, 
> UIComponent root, String clientId)
> -    {
> -        UIComponent component = null;
> -        for (int i = 0; i < root.getChildCount() && component == null; i++)
> -        {
> -            UIComponent child = (UIComponent) root.getChildren().get(i);
> -            component = findComponentByClientId(context, child, clientId);
> -        }
> -        if (root.getId() != null)
> -        {
> -            if (component == null && 
> root.getClientId(context).equals(clientId))
> -            {
> -                component = root;
> -            }
> -        }
> -        return component;
> -    }
> +    public static UIComponent findComponentByClientId(FacesContext context,
> +                     UIComponent root, String clientId) {
> +             UIComponent component = null;
> +             for (int i = 0; i < root.getChildCount() && component == null; 
> i++) {
> +                     UIComponent child = (UIComponent) 
> root.getChildren().get(i);
> +                     component = findComponentByClientId(context, child, 
> clientId);
> +             }
> +             if (root.getId() != null) {
> +                     if (component == null && 
> root.getClientId(context).equals(clientId)) {
> +                             component = root;
> +                     }
> +             }
> +             return component;
> +     }
>  
>      /**
> -     * Useful if you don't know the clientId
> -     * <p/>
> -     * TR- This was moved from AjaxPhaseListenere on checkin 344383
> -     * Seems like this could be made more efficient
> -     *
> -     * @param context
> -     * @param root
> -     * @param id
> -     * @return component referenced by id or null if not found
> -     */
> -    public static UIComponent findComponentById(FacesContext context, 
> UIComponent root, String id)
> -    {
> -        UIComponent component = null;
> -        for (int i = 0; i < root.getChildCount() && component == null; i++)
> -        {
> -            UIComponent child = (UIComponent) root.getChildren().get(i);
> -            component = findComponentById(context, child, id);
> -        }
> -        //System.out.println("component looking for: " + id + " - rootid: " 
> + root.getId() + " " + root);
> -        if (root.getId() != null)
> -        {
> -            if (component == null && root.getId().equals(id))
> -            {
> -                component = root;
> -            }
> -        }
> -        return component;
> -    }
> -
> -     public static UIComponent findFirstMessagesComponent(FacesContext 
> context, UIComponent base)
> -    {
> -        if (base == null)
> -        {
> -            return null;
> -        }
> -
> -        if (base instanceof HtmlMessages)
> -        {
> -            return base;
> -        }
> -
> -        Iterator iterChildren = base.getFacetsAndChildren();
> -        while (iterChildren.hasNext())
> -        {
> -            UIComponent child = (UIComponent) iterChildren.next();
> -
> -            UIComponent found = findFirstMessagesComponent(context, child);
> -            if (found != null)
> -            {
> -                return found;
> -            }
> -        }
> +      * Useful if you don't know the clientId <p/> TR- This was moved from
> +      * AjaxPhaseListenere on checkin 344383 Seems like this could be made 
> more
> +      * efficient
> +      * 
> +      * @param context
> +      * @param root
> +      * @param id
> +      * @return component referenced by id or null if not found
> +      */
> +    public static UIComponent findComponentById(FacesContext context,
> +                     UIComponent root, String id) {
> +             UIComponent component = null;
> +             for (int i = 0; i < root.getChildCount() && component == null; 
> i++) {
> +                     UIComponent child = (UIComponent) 
> root.getChildren().get(i);
> +                     component = findComponentById(context, child, id);
> +             }
> +             // System.out.println("component looking for: " + id + " - 
> rootid: " +
> +             // root.getId() + " " + root);
> +             if (root.getId() != null) {
> +                     if (component == null && root.getId().equals(id)) {
> +                             component = root;
> +                     }
> +             }
> +             return component;
> +     }
>  
> -        return null;
> -    }
> -     
> -     
> -     private static boolean isDecorated(UIComponent component, String 
> attribute, String value) {
> -             String attributeValue = (String) 
> component.getAttributes().get(attribute);
> -             
> -             if(attributeValue == null || attributeValue.indexOf(value) == 
> -1)
> +     public static UIComponent findFirstMessagesComponent(FacesContext 
> context,
> +                     UIComponent base) {
> +             if (base == null) {
> +                     return null;
> +             }
> +
> +             if (base instanceof HtmlMessages) {
> +                     return base;
> +             }
> +
> +             Iterator iterChildren = base.getFacetsAndChildren();
> +             while (iterChildren.hasNext()) {
> +                     UIComponent child = (UIComponent) iterChildren.next();
> +
> +                     UIComponent found = findFirstMessagesComponent(context, 
> child);
> +                     if (found != null) {
> +                             return found;
> +                     }
> +             }
> +
> +             return null;
> +     }
> +
> +     private static boolean isDecorated(UIComponent component, String 
> attribute,
> +                     String value) {
> +             String attributeValue = (String) component.getAttributes().get(
> +                             attribute);
> +
> +             if (attributeValue == null || attributeValue.indexOf(value) == 
> -1)
>                       return false;
>               else
>                       return true;
>       }
>       
>       /**
> -     * Changes the event attributes like onclick by appending the given 
> value 
> -     * 
> -     * @param        component       UIComponent instance that the attribute 
> belongs to
> -     * @param        attribute       Attribute to be changed
> -     * @param        value           Value to be appended
> -     */
> -     public static void decorateEventAttribute(UIComponent component, String 
> attribute, String value) {
> -             if(isDecorated(component, attribute, value))
> +      * Changes the event attributes like onclick by appending the given 
> value
> +      * 
> +      * @param component
> +      *            UIComponent instance that the attribute belongs to
> +      * @param attribute
> +      *            Attribute to be changed
> +      * @param value
> +      *            Value to be appended
> +      */
> +     public static void decorateEventAttribute(UIComponent component,
> +                     String attribute, String value) {
> +             if (isDecorated(component, attribute, value))
>                       return;
> -                     
> -             String attributeValue = (String) 
> component.getAttributes().get(attribute);
> -             
> -             if(attributeValue == null)
> +
> +             String attributeValue = (String) component.getAttributes().get(
> +                             attribute);
> +
> +             if (attributeValue == null)
>                       component.getAttributes().put(attribute, value);
> +             else if (attributeValue.endsWith(";"))
> +                     component.getAttributes().put(attribute, attributeValue 
> + value);
>               else
> -                     if( attributeValue.endsWith(";"))
> -                             component.getAttributes().put(attribute, 
> attributeValue + value);
> -                     else
> -                             component.getAttributes().put(attribute, 
> attributeValue + ";" + value);
> +                     component.getAttributes().put(attribute,
> +                                     attributeValue + ";" + value);
>       }
> -
> +     
> +     /**
> +      * The getParameterMap() is used for getting the parameters
> +      * of a specific component.
> +      * @param component
> +      * @return the Map of the component.
> +      */
> +     public static Map getParameterMap(UIComponent component) {
> +             Map result = new HashMap();
> +             for (Iterator iter = component.getChildren().iterator(); 
> iter.hasNext();) {
> +                     UIComponent child = (UIComponent) iter.next();
> +                     if (child instanceof UIParameter) {
> +                             UIParameter uiparam = (UIParameter) child;
> +                             Object value = uiparam.getValue();
> +                             if (value != null) {
> +                                     result.put(uiparam.getName(), value);
> +                             }
> +                     }
> +             }
> +             return result;
> +     }       
> +     
> +     /**
> +      * The getLifecycleId() is used for getting the id of 
> +      * the Lifecycle from the ServletContext.
> +      * @param context
> +      * @return the id of the life cycle.
> +      */     
> +     public static String getLifecycleId(ServletContext context) {
> +             String lifecycleId = context
> +                             
> .getInitParameter(FacesServlet.LIFECYCLE_ID_ATTR);
> +             return lifecycleId != null ? lifecycleId
> +                             : LifecycleFactory.DEFAULT_LIFECYCLE;
> +     }       
>  }
>
> Modified: 
> myfaces/tomahawk/trunk/sandbox/examples/src/main/webapp/WEB-INF/web.xml
> URL: 
> http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/sandbox/examples/src/main/webapp/WEB-INF/web.xml?rev=640864&r1=640863&r2=640864&view=diff
> ==============================================================================
> --- myfaces/tomahawk/trunk/sandbox/examples/src/main/webapp/WEB-INF/web.xml 
> (original)
> +++ myfaces/tomahawk/trunk/sandbox/examples/src/main/webapp/WEB-INF/web.xml 
> Tue Mar 25 08:40:50 2008
> @@ -177,12 +177,6 @@
>      <url-pattern>*.jsf</url-pattern>
>    </filter-mapping>
>    
> -  <!-- Captcha Servlet -->
> -  <servlet>
> -     <servlet-name>captcha</servlet-name>
> -     
> <servlet-class>org.apache.myfaces.custom.captcha.servlet.CaptchaServlet</servlet-class>
> -  </servlet>
> -
>    <servlet>
>      <servlet-name>Faces Servlet</servlet-name>
>      <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
> @@ -201,11 +195,7 @@
>    <servlet-mapping>
>      <servlet-name>SourceCodeServlet</servlet-name>
>      <url-pattern>*.source</url-pattern>
> -  </servlet-mapping>
> -  <servlet-mapping>
> -     <servlet-name>captcha</servlet-name>
> -     <url-pattern>/apache_captcha_servlet_url</url-pattern>
> -  </servlet-mapping>    
> +  </servlet-mapping>   
>    <welcome-file-list>
>       <welcome-file>index.html</welcome-file>
>       <welcome-file>index.htm</welcome-file>
>
>
>
>   

Reply via email to