[jboss-cvs] jboss-seam/seam-ui-cdk/jboss-seam-ui/src/main/java/org/jboss/seam/ui/renderkit ...

Peter Muir peter at bleepbleep.org.uk
Tue Mar 20 13:58:59 EDT 2007


  User: pmuir   
  Date: 07/03/20 13:58:59

  Added:       seam-ui-cdk/jboss-seam-ui/src/main/java/org/jboss/seam/ui/renderkit     
                        CacheRendererBase.java SeamCommandRendererBase.java
                        ButtonRendererBase.java FileUploadRendererBase.java
                        LinkRendererBase.java
  Log:
  Port more tags to CDK
  
  Revision  Changes    Path
  1.1      date: 2007/03/20 17:58:59;  author: pmuir;  state: Exp;jboss-seam/seam-ui-cdk/jboss-seam-ui/src/main/java/org/jboss/seam/ui/renderkit/CacheRendererBase.java
  
  Index: CacheRendererBase.java
  ===================================================================
  package org.jboss.seam.ui.renderkit;
  
  import java.io.IOException;
  import java.io.StringWriter;
  
  import javax.faces.component.UIComponent;
  import javax.faces.context.FacesContext;
  import javax.faces.context.ResponseWriter;
  
  import org.ajax4jsf.framework.renderer.AjaxComponentRendererBase;
  import org.jboss.cache.CacheException;
  import org.jboss.seam.core.PojoCache;
  import org.jboss.seam.log.LogProvider;
  import org.jboss.seam.log.Logging;
  import org.jboss.seam.ui.component.UICache;
  
  public class CacheRendererBase extends AjaxComponentRendererBase
  {
     
     private static final LogProvider log = Logging.getLogProvider(UICache.class);
     
     @Override
     protected Class getComponentClass()
     {
        return UICache.class;
     }
     
     @Override
     protected void doEncodeChildren(ResponseWriter writer, FacesContext context, UIComponent component) throws IOException
     {
        UICache cache = (UICache) component;
        if (cache.getEnabled())
        {
           String key = cache.getKey();
           String cachedContent = getFromCache(key, cache.getRegion());
           if (cachedContent == null)
           {
              log.debug("rendering from scratch: " + key);
              StringWriter stringWriter = new StringWriter();
              ResponseWriter cachingResponseWriter = writer.cloneWithWriter(stringWriter);
              context.setResponseWriter(cachingResponseWriter);
              renderChildren(context, component);
              context.setResponseWriter(writer);
              String output = stringWriter.getBuffer().toString();
              writer.write(output);
              putInCache(key, cache.getRegion(), output);
           }
           else
           {
              log.debug("rendering from cache: " + key);
              writer.write("<!-- cached content for: ");
              writer.write(key);
              writer.write(" -->");
              writer.write(cachedContent);
              writer.write("<!-- end of cached content -->");
           }
        }
        else
        {
           renderChildren(context, component);
        }
     }
     
  
     private static void putInCache(String key, String region, String content)
     {
        try
        {
           PojoCache.instance().put(region, key, content);
        }
        catch (CacheException ce)
        {
           log.error("error accessing cache", ce);
        }
     }
  
     private static String getFromCache(String key, String region)
     {
        try
        {
           return (String) PojoCache.instance().get(region, key);
        }
        catch (CacheException ce)
        {
           log.error("error accessing cache", ce);
           return null;
        }
     }
  
     @Override
     public boolean getRendersChildren()
     {
        return true;
     }
  
  }
  
  
  
  1.1      date: 2007/03/20 17:58:59;  author: pmuir;  state: Exp;jboss-seam/seam-ui-cdk/jboss-seam-ui/src/main/java/org/jboss/seam/ui/renderkit/SeamCommandRendererBase.java
  
  Index: SeamCommandRendererBase.java
  ===================================================================
  package org.jboss.seam.ui.renderkit;
  
  import java.io.IOException;
  import java.io.UnsupportedEncodingException;
  import java.net.URLEncoder;
  import java.util.HashSet;
  import java.util.Map;
  import java.util.Set;
  
  import javax.faces.component.UIComponent;
  import javax.faces.component.UIParameter;
  import javax.faces.context.FacesContext;
  import javax.faces.context.ResponseWriter;
  import javax.faces.el.ValueBinding;
  
  import org.ajax4jsf.framework.renderer.AjaxComponentRendererBase;
  import org.jboss.seam.core.Conversation;
  import org.jboss.seam.core.Pages;
  import org.jboss.seam.pages.Page;
  import org.jboss.seam.ui.component.UIAction;
  import org.jboss.seam.ui.component.UIButton;
  import org.jboss.seam.ui.component.UIConversationId;
  import org.jboss.seam.ui.component.UIConversationIsLongRunning;
  import org.jboss.seam.ui.component.UIConversationPropagation;
  import org.jboss.seam.ui.component.UISeamCommandBase;
  import org.jboss.seam.ui.component.UISelection;
  import org.jboss.seam.ui.component.UITaskId;
  import org.jboss.seam.ui.util.HTML;
  
  // TODO Do this in a template with utility methods
  // TODO Put the common stuff between s:button and s:link in a common file
  public abstract class SeamCommandRendererBase extends AjaxComponentRendererBase
  {
  
     @Override
     protected Class getComponentClass()
     {
        return UIButton.class;
     }
     
     public abstract void writeStart(ResponseWriter writer, FacesContext facesContext, UISeamCommandBase seamCommand) throws IOException;
     
     public abstract void writeEnd(ResponseWriter writer, FacesContext facesContext, UISeamCommandBase seamCommand) throws IOException;
     
     @Override
     protected void doEncodeBegin(ResponseWriter writer, FacesContext context, UIComponent component) throws IOException
     {
        if ( !component.isRendered() ) return;
        
        UISeamCommandBase seamCommand = (UISeamCommandBase) component;
        
        writeStart(writer, context, seamCommand);
        
        writer.writeAttribute("id", seamCommand.getClientId(context), "id");
  
        String viewId = seamCommand.getView();
        if (viewId == null)
        {
           viewId = Pages.getViewId(context);
        }
        
        String url = context.getApplication().getViewHandler().getActionURL(context, viewId);
        String encodedUrl = context.getExternalContext().encodeActionURL(url);
        encodedUrl = Pages.instance().encodeScheme(viewId, context, encodedUrl);
        
        String characterEncoding = context.getResponseWriter().getCharacterEncoding();
        boolean first = true;
        Set<String> usedParameters = new HashSet<String>();
        
        boolean conversationIdEncoded = false;
        Page page = Pages.instance().getPage(viewId);
        
        for ( Object child: seamCommand.getChildren() )
        {
           if (child instanceof UIParameter)
           {
              UIParameter uip = (UIParameter) child;
              if ( uip.getValue()!=null )
              {
                 encodedUrl += getParameterString(characterEncoding, uip, first);
                 first = false;
                 
                 if ( uip.getName().equals( page.getConversationIdParameter().getParameterName() ) )
                 {
                    conversationIdEncoded = true;
                 }
              }
              usedParameters.add( uip.getName() );
           }
        }
        
        if (viewId!=null)
        {
           Map<String, Object> pageParameters = Pages.instance().getConvertedParameters(context, viewId, usedParameters);
           for ( Map.Entry<String, Object> me: pageParameters.entrySet() )
           {
              UIParameter uip = new UIParameter();
              uip.setName( me.getKey() );
              uip.setValue( me.getValue() );
              encodedUrl += getParameterString(characterEncoding, uip, first);
              first = false;
  
              if (!conversationIdEncoded && me.getKey().equals(page.getConversationIdParameter().getParameterName()))
              {
                 conversationIdEncoded = true;
              }
           }
        }
        
        if ( seamCommand.getAction() != null || seamCommand.getOutcome() != null )
        {
           
           UIAction uiAction = new UIAction();
           uiAction.setAction( seamCommand.getAction() ==null ? seamCommand.getOutcome() : seamCommand.getAction().getExpressionString() );
           encodedUrl += getParameterString(characterEncoding, uiAction, first);
           first = false;
        }
        
        if ( "default".equals(seamCommand.getPropagation()) || "join".equals(seamCommand.getPropagation()) || "nest".equals(seamCommand.getPropagation()) || "end".equals(seamCommand.getPropagation()) )
        {
           //always add the id, since conversations could begin after link is rendered
           if ( !conversationIdEncoded )
           {
              UIConversationId uiConversationId = new UIConversationId();
              uiConversationId.setViewId(viewId);
              encodedUrl += getParameterString(characterEncoding, uiConversationId, first);
              first = false;
           }
           if ( Conversation.instance().isLongRunning() || Conversation.instance().isNested() )
           {
              encodedUrl += getParameterString(characterEncoding, new UIConversationIsLongRunning(), first);
           }
        }
        
        if ( "join".equals(seamCommand.getPropagation()) || "nest".equals(seamCommand.getPropagation()) || "begin".equals(seamCommand.getPropagation()) || "end".equals(seamCommand.getPropagation()) )
        {
           UIConversationPropagation uiPropagation = new UIConversationPropagation();
           uiPropagation.setType(seamCommand.getPropagation());
           uiPropagation.setPageflow(seamCommand.getPageflow());
           encodedUrl  += getParameterString(characterEncoding, uiPropagation, first);
           first = false;
        }
        
        // TODO What is this all about
        ValueBinding taskInstanceValueBinding = seamCommand.getValueBinding("taskInstance");
        if (taskInstanceValueBinding!=null)
        {
           UITaskId uiTaskId = new UITaskId();
           uiTaskId.setValueBinding("taskInstance", taskInstanceValueBinding);
           encodedUrl  += getParameterString(characterEncoding, uiTaskId, first);
           first = false;
        }
        
        UISelection uiSelection = seamCommand.getSelection();
        if (uiSelection!=null)
        {
           encodedUrl += getParameterString(characterEncoding, uiSelection, first);
           first = false;
        }
              
        if (seamCommand.getFragment() != null)
        {
           encodedUrl += '#' + seamCommand.getFragment();
        }
        
        String onclick = seamCommand.getOnclick();
        if (onclick==null)
        {
           onclick = "";
        }
        else if ( onclick.length()>0 && !onclick.endsWith(";") )
        {
            onclick += ";";
        }
        if ( !seamCommand.disabled() )
        {
           onclick += "location.href='" + encodedUrl + "'";
        }
        writer.writeAttribute("onclick", onclick, null);
        org.jboss.seam.ui.util.HTML.renderHTMLAttributes(writer, seamCommand, HTML.BUTTON_PASSTHROUGH_ATTRIBUTES_WITHOUT_DISABLED_AND_ONCLICK);
        
        writeEnd(writer, context, seamCommand);
        writer.flush();
        
     }
     
     @SuppressWarnings("deprecation")
     private static String getParameterString(String characterEncoding, UIParameter param, boolean first) 
           throws UnsupportedEncodingException
     {
        Object value = param.getValue();
        String strValue = value==null ? "" : value.toString();
        String encoded = characterEncoding==null ? 
              URLEncoder.encode(strValue) : //to work around what appears to be a bug in ADF
              URLEncoder.encode(strValue, characterEncoding);
        return (first ? '?' : '&') + param.getName() + '=' + encoded;
     }
  
  }
  
  
  
  1.1      date: 2007/03/20 17:58:59;  author: pmuir;  state: Exp;jboss-seam/seam-ui-cdk/jboss-seam-ui/src/main/java/org/jboss/seam/ui/renderkit/ButtonRendererBase.java
  
  Index: ButtonRendererBase.java
  ===================================================================
  package org.jboss.seam.ui.renderkit;
  
  import java.io.IOException;
  
  import javax.faces.component.UIComponent;
  import javax.faces.context.FacesContext;
  import javax.faces.context.ResponseWriter;
  
  import org.jboss.seam.ui.component.UIButton;
  import org.jboss.seam.ui.component.UISeamCommandBase;
  
  public abstract class ButtonRendererBase extends SeamCommandRendererBase
  {
     @Override
     public void writeStart(ResponseWriter writer, FacesContext facesContext,
              UISeamCommandBase seamCommand) throws IOException
     {
        
        UIButton button = (UIButton) seamCommand;
        writer.startElement("input", seamCommand);
  
        if (button.getImage() == null) {
            writer.writeAttribute("type", "button", null);
        } else {
            writer.writeAttribute("type", "image", null);
            writer.writeAttribute("src", button.getImage(), null);
        }
        
        if ( seamCommand.disabled() ) writer.writeAttribute("disabled", true, "disabled");
  
     }
  
     @Override
     public void writeEnd(ResponseWriter writer, FacesContext facesContext,
              UISeamCommandBase seamCommand) throws IOException
     {
        Object label = seamCommand.getValue();
        if (label!=null) 
        {
           writer.writeAttribute("value", label, "label");
        }
     }
     
     @Override
     protected void doEncodeEnd(ResponseWriter writer, FacesContext context, UIComponent component) throws IOException
     {
        writer.endElement("input");
     }
  }
  
  
  
  1.1      date: 2007/03/20 17:58:59;  author: pmuir;  state: Exp;jboss-seam/seam-ui-cdk/jboss-seam-ui/src/main/java/org/jboss/seam/ui/renderkit/FileUploadRendererBase.java
  
  Index: FileUploadRendererBase.java
  ===================================================================
  package org.jboss.seam.ui.renderkit;
  
  import java.io.IOException;
  import java.io.InputStream;
  import java.lang.reflect.Field;
  import java.lang.reflect.Method;
  
  import javax.faces.component.UIComponent;
  import javax.faces.context.FacesContext;
  import javax.faces.context.ResponseWriter;
  import javax.servlet.ServletRequest;
  
  import org.ajax4jsf.framework.renderer.AjaxComponentRendererBase;
  import org.jboss.seam.ui.component.UIFileUpload;
  import org.jboss.seam.ui.util.HTML;
  import org.jboss.seam.web.MultipartRequest;
  
  public class FileUploadRendererBase extends AjaxComponentRendererBase
  {
  
     @Override
     protected Class getComponentClass()
     {
        return UIFileUpload.class;
     }
     
     @Override
     protected void doEncodeEnd(ResponseWriter writer, FacesContext context, UIComponent component) throws IOException
     {
        UIFileUpload fileUpload = (UIFileUpload) component;
        
        writer.startElement(HTML.INPUT_ELEM, component);      
        writer.writeAttribute(HTML.TYPE_ATTR, HTML.FILE_ATTR, null);      
        
        String clientId = component.getClientId(context);      
        writer.writeAttribute(HTML.ID_ATTR, clientId, null);     
        writer.writeAttribute(HTML.NAME_ATTR, clientId, null);
        if (fileUpload.getAccept() != null)
        {
           writer.writeAttribute(HTML.ACCEPT_ATTR, fileUpload.getAccept(), null);
        }
        if (fileUpload.getStyleClass() != null)
        {
           writer.writeAttribute(HTML.STYLE_CLASS_ATTR, fileUpload.getStyleClass(), null);
        }
        if (fileUpload.getStyle() != null)
        {
           writer.writeAttribute(HTML.STYLE_CLASS_ATTR, fileUpload.getStyle(), null);
        }
        writer.endElement(HTML.INPUT_ELEM);
     }
        
     
     
     @Override
     protected void doDecode(FacesContext context, UIComponent component)
     {
        UIFileUpload fileUpload = (UIFileUpload) component;
        ServletRequest request = (ServletRequest) context.getExternalContext().getRequest();
        
        if (!(request instanceof MultipartRequest))
        {
           request = unwrapMultipartRequest(request);
        }
  
        if (request instanceof MultipartRequest)
        {
           MultipartRequest req = (MultipartRequest) request;
           
           String clientId = component.getClientId(context);         
           String contentType = req.getFileContentType(clientId);
           String fileName = req.getFileName(clientId);
           int fileSize = req.getFileSize(clientId);
                    
           if (fileUpload.getData() != null)
           {
              
              Class cls = fileUpload.getData().getType(context);
              if (cls.isAssignableFrom(InputStream.class))
              {
                 fileUpload.getData().setValue(context, req.getFileInputStream(clientId));
              }
              else if (cls.isAssignableFrom(byte[].class))
              {
                 fileUpload.getData().setValue(context, req.getFileBytes(clientId));
              }
           }
           
           
           if (fileUpload.getContentType() != null)
           {
              fileUpload.getContentType().setValue(context, contentType);
           }
           if (fileUpload.getFileName() != null)
           {
              fileUpload.getFileName().setValue(context, fileName);
           }
           
           if (fileUpload.getFileSize() != null)
           {
              fileUpload.getFileSize().setValue(context, fileSize);
           }
        }      
     }
     
     private static ServletRequest unwrapMultipartRequest(ServletRequest request)
     {      
        while (!(request instanceof MultipartRequest))
        {
           boolean found = false;
           
           for (Method m : request.getClass().getMethods())
           {
              if (ServletRequest.class.isAssignableFrom(m.getReturnType()) && 
                  m.getParameterTypes().length == 0)
              {
                 try
                 {
                    request = (ServletRequest) m.invoke(request);
                    found = true;
                    break;
                 }
                 catch (Exception ex) { /* Ignore, try the next one */ } 
              }
           }
           
           if (!found)
           {
              for (Field f : request.getClass().getDeclaredFields())
              {
                 if (ServletRequest.class.isAssignableFrom(f.getType()))
                 {
                    try
                    {
                       request = (ServletRequest) f.get(request);
                    }
                    catch (Exception ex) { /* Ignore */}
                 }
              }
           }
           
           if (!found) break;
        }
        
        return request;     
     }
  
  }
  
  
  
  1.1      date: 2007/03/20 17:58:59;  author: pmuir;  state: Exp;jboss-seam/seam-ui-cdk/jboss-seam-ui/src/main/java/org/jboss/seam/ui/renderkit/LinkRendererBase.java
  
  Index: LinkRendererBase.java
  ===================================================================
  package org.jboss.seam.ui.renderkit;
  
  import java.io.IOException;
  
  import javax.faces.component.UIComponent;
  import javax.faces.context.FacesContext;
  import javax.faces.context.ResponseWriter;
  
  import org.jboss.seam.ui.component.UISeamCommandBase;
  
  public abstract class LinkRendererBase extends SeamCommandRendererBase
  {
     @Override
     public void writeStart(ResponseWriter writer, FacesContext facesContext, UISeamCommandBase seamCommand) throws IOException
     {
        writer.startElement("a", seamCommand);
     }
     
     @Override
     public void writeEnd(ResponseWriter writer, FacesContext facesContext, UISeamCommandBase seamCommand) throws IOException
     {
        Object label = seamCommand.getValue();
        if (label!=null) 
        {
           writer.writeText( label, null );
        }
     }
     
     @Override
     protected void doEncodeEnd(ResponseWriter writer, FacesContext context, UIComponent component) throws IOException
     {
        context.getResponseWriter().endElement("a");
     }
     
  }
  
  
  



More information about the jboss-cvs-commits mailing list