package org.jboss.seam.excel.ui; import java.io.IOException; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; import javax.faces.component.UIComponent; import javax.faces.component.UIComponentBase; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import javax.faces.render.RenderKit; import org.jboss.seam.excel.ExcelWorkbook; import org.jboss.seam.excel.WorksheetItem; import org.jboss.seam.excel.ui.command.Command; import org.jboss.seam.ui.util.JSF; /** * Common superclass for the UI components. Contains helper methods for merging * etc. * * @author Nicklas Karlsson (nickarls@gmail.com) * @author Daniel Roth (danielc.roth@gmail.com) */ public abstract class ExcelComponent extends UIComponentBase { private static final String DEFAULT_CONTENT_TYPE = "text/html"; private static final String DEFAULT_CHARACTER_ENCODING = "utf-8"; // The CSS style class private String styleClass; // The CSS style private String style; /** * Helper method for rendering a component (usually on a facescontext with a caching * reponsewriter) * * @param facesContext The faces context to render to * @param component The component to render * @return The textual representation of the component * @throws IOException If the JSF helper class can't render the component */ public static String cmp2String(FacesContext facesContext, UIComponent component) throws IOException { ResponseWriter oldResponseWriter = facesContext.getResponseWriter(); String contentType = oldResponseWriter != null ? oldResponseWriter.getContentType() : DEFAULT_CONTENT_TYPE; String characterEncoding = oldResponseWriter != null ? oldResponseWriter.getCharacterEncoding() : DEFAULT_CHARACTER_ENCODING; RenderKit renderKit = facesContext.getRenderKit(); StringWriter cacheingWriter = new StringWriter(); ResponseWriter newResponseWriter = renderKit.createResponseWriter(cacheingWriter, contentType, characterEncoding); facesContext.setResponseWriter(newResponseWriter); JSF.renderChild(facesContext, component); if (oldResponseWriter != null) { facesContext.setResponseWriter(oldResponseWriter); } cacheingWriter.flush(); cacheingWriter.close(); return cacheingWriter.toString(); } public ExcelComponent() { super(); } /** * Helper class that returns all children of a certain type (implements * interface) * * @param <T> The type to check for * @param children The list of children to search * @param childType The child type * @return The list of matching items */ @SuppressWarnings("unchecked") public static <T> List<T> getChildrenOfType(List<UIComponent> children, Class<T> childType) { List<T> matches = new ArrayList<T>(); for (UIComponent child : children) { if (childType.isAssignableFrom(child.getClass())) { matches.add((T) child); } } return matches; } /** * Returns all commands from a child list * * @param children The list to search * @return The commands */ protected static List<Command> getCommands(List<UIComponent> children) { return getChildrenOfType(children, Command.class); } /** * Returns all worksheet items (cells, images, hyperlinks) from a child list * * @param children The list to search * @return The items */ protected static List<WorksheetItem> getItems(List<UIComponent> children) { return getChildrenOfType(children, WorksheetItem.class); } /** * Helper method for fetching value through binding * * @param name The field to bind to * @param defaultValue The default value to fall back to * @return The field value */ protected Object valueOf(String name, Object defaultValue) { Object value = defaultValue; if (getValueExpression(name) != null) { value = getValueExpression(name).getValue(FacesContext.getCurrentInstance().getELContext()); } return value; } /** * Fetches the parent workbook from a component * * @param component The component to examine * @return The workbook */ protected ExcelWorkbook getWorkbook(UIComponent component) { if (component == null) return null; if (component instanceof UIWorkbook) { UIWorkbook uiWorkBook = (UIWorkbook) component; return uiWorkBook.getExcelWorkbook(); } else { return getWorkbook(component.getParent()); } } /** * Gets a parent of a certain class * * @param root The root where to start searching * @param searchClass The class to search for * @return The parent, if found. */ @SuppressWarnings("unchecked") protected UIComponent getParentByClass(UIComponent root, Class searchClass) { if (root == null) { return null; } if (root.getClass() == searchClass) { return root; } return getParentByClass(root.getParent(), searchClass); } public String getStyleClass() { return (String) valueOf("styleClass", styleClass); } public void setStyleClass(String styleClass) { this.styleClass = styleClass; } public String getStyle() { return (String) valueOf("style", style); } public void setStyle(String style) { this.style = style; } }