[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