com.icesoft.faces.component.outputresource.OutputResource.java Source code

Java tutorial

Introduction

Here is the source code for com.icesoft.faces.component.outputresource.OutputResource.java

Source

/*
 * Copyright 2004-2013 ICEsoft Technologies Canada Corp.
 *
 * Licensed 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 com.icesoft.faces.component.outputresource;

import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.net.URLEncoder;

import javax.faces.component.UIComponent;
import javax.faces.component.UIComponentBase;
import javax.faces.component.UIData;
import javax.faces.context.FacesContext;
import javax.faces.el.ValueBinding;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.icesoft.faces.component.CSS_DEFAULT;
import com.icesoft.faces.component.ext.taglib.Util;
import com.icesoft.faces.context.FileResource;
import com.icesoft.faces.context.Resource;
import com.icesoft.faces.context.ResourceRegistry;
import com.icesoft.faces.context.ResourceRegistryLocator;

import com.icesoft.faces.component.tree.Tree;
import org.icefaces.resources.BrowserType;
import org.icefaces.resources.ICEResourceDependencies;
import org.icefaces.resources.ICEResourceDependency;

@ICEResourceDependencies({
        @ICEResourceDependency(name = "icefaces-compat.js", library = "ice.compat", target = "head", browser = BrowserType.ALL, browserOverride = {}),
        @ICEResourceDependency(name = "compat.js", library = "ice.compat", target = "head", browser = BrowserType.ALL, browserOverride = {}) })
public class OutputResource extends UIComponentBase {

    public static final String COMPONENT_FAMILY = "com.icesoft.faces.OutputResource";
    public static final String COMPONENT_TYPE = "com.icesoft.faces.OutputResource";
    public static final String DEFAULT_RENDERER_TYPE = "com.icesoft.faces.OutputResourceRenderer";
    private static Log log = LogFactory.getLog(OutputResource.class);
    protected Resource resource;
    protected transient RegisteredResource registeredResource;
    private String mimeType;
    private Date lastModified;
    private String fileName;
    private String image;
    private String type;
    private String label;
    private String style;
    private String styleClass;
    private String renderedOnUserRole;
    private Boolean attachment;
    private transient int lastResourceHashCode;
    transient String path;
    private Boolean shared;
    private String target;
    private Boolean UIDataChild = null;
    public static final String TYPE_IMAGE = "image";
    public static final String TYPE_BUTTON = "button";
    private transient Map resources;
    private Boolean disabled = null;

    /*
    * (non-Javadoc)
    * 
    * @see javax.faces.component.UIComponent#getFamily()
    */
    public String getFamily() {
        return COMPONENT_FAMILY;
    }

    public String getComponentType() {
        return COMPONENT_TYPE;
    }

    /*
     * (non-Javadoc)
     * 
     * @see javax.faces.component.UIComponent#getRendererType()
     */
    public String getRendererType() {
        return DEFAULT_RENDERER_TYPE;
    }

    public Resource getResource() {
        final Resource currResource;
        if (this.resource != null) {
            currResource = this.resource;
        } else {
            ValueBinding vb = getValueBinding("resource");
            if (vb == null) {
                addInfo();
                return null;
            }
            currResource = (Resource) vb.getValue(getFacesContext());
        }
        if (currResource == null)
            return null;
        final String fileName = getFileName();
        if (!isUIDataChild()) {
            if (registeredResource == null) {
                registeredResource = new RegisteredResource(this, currResource, fileName);
            } else {
                registeredResource.updateContents(this, currResource, fileName);
            }
            path = ResourceRegistryLocator.locate(FacesContext.getCurrentInstance())
                    .registerResource(registeredResource).getRawPath();
            registeredResource.setPath(path);
        } else {
            if (resources == null) {
                resources = new HashMap();
            }
            if (!resources.containsKey(currResource)) {
                registeredResource = new RegisteredResource(this, currResource, fileName);
                resources.put(currResource, registeredResource);
            } else {
                registeredResource = (RegisteredResource) resources.get(currResource);
                registeredResource.updateContents(this, currResource, fileName);
            }
            path = ResourceRegistryLocator.locate(FacesContext.getCurrentInstance())
                    .registerResource(registeredResource).getRawPath();
            registeredResource.setPath(path);
        }

        return currResource;
    }

    public void addInfo() {
        if (log.isInfoEnabled()) {
            log.info("The \"resource\" is not defined");
        }
    }

    public void setResource(Resource resource) {
        this.resource = resource;
    }

    public String getMimeType() {
        if (mimeType != null) {
            return mimeType;
        }
        ValueBinding vb = getValueBinding("mimeType");
        return vb != null ? (String) vb.getValue(getFacesContext()) : null;
    }

    public void setMimeType(String mimeType) {
        this.mimeType = mimeType;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public String getFileName() {
        //must check fileName as valuebinding first and set local as 
        //ResourceDispatcher may not have access to FacesContext
        ValueBinding vb = getValueBinding("fileName");
        if (vb != null) {
            fileName = (String) vb.getValue(getFacesContext());
        }
        return fileName;
    }

    public void setLastModified(Date lastModified) {
        this.lastModified = lastModified;
    }

    public Date getLastModified() {
        if (lastModified != null)
            return lastModified;
        ValueBinding vb = getValueBinding("lastModified");
        return vb != null ? (Date) vb.getValue(getFacesContext()) : null;
    }

    public void setImage(String img) {
        this.image = img;
    }

    public String getImage() {
        if (image != null) {
            return image;
        }
        ValueBinding vb = getValueBinding("image");
        return vb != null ? (String) vb.getValue(getFacesContext()) : null;

    }

    public void setType(String type) {
        this.type = type;
    }

    public String getType() {
        if (type != null) {
            return type;
        }
        ValueBinding vb = getValueBinding("type");
        return vb != null ? (String) vb.getValue(getFacesContext()) : null;

    }

    public void setLabel(String label) {
        this.label = label;
    }

    public String getLabel() {
        if (label != null) {
            return label;
        }
        ValueBinding vb = getValueBinding("label");
        if (vb != null)
            return (String) vb.getValue(getFacesContext());
        String fileName = getFileName();
        if (fileName != null && fileName.length() > 0)
            return fileName;
        vb = getValueBinding("resource");
        Resource r = null;
        if (vb != null)
            r = (Resource) vb.getValue(getFacesContext());
        if (r != null && r instanceof FileResource)
            return ((FileResource) r).getFile().getName();
        return null;
    }

    public void setStyle(String style) {
        this.style = style;
    }

    public String getStyle() {
        if (style != null) {
            return style;
        }
        ValueBinding vb = getValueBinding("style");
        return vb != null ? (String) vb.getValue(getFacesContext()) : null;
    }

    public void setStyleClass(String styleClass) {
        this.styleClass = styleClass;
    }

    /**
     * <p>
     * Return the value of the <code>styleClass</code> property.
     * </p>
     * 
     * @return String styleClass
     */
    public String getStyleClass() {
        String defaultStyle = CSS_DEFAULT.OUTPUT_LINK_DEFAULT_STYLE_CLASS;
        if (TYPE_BUTTON.equals(getType()))
            defaultStyle = CSS_DEFAULT.COMMAND_BTN_DEFAULT_STYLE_CLASS;
        return Util.getQualifiedStyleClass(this, styleClass, defaultStyle, "styleClass", false);
    }

    public void setRenderedOnUserRole(String role) {
        this.renderedOnUserRole = role;
    }

    /**
     * <p>
     * Return the value of the <code>renderedOnUserRole</code> property.
     * </p>
     */
    public String getRenderedOnUserRole() {
        if (renderedOnUserRole != null) {
            return renderedOnUserRole;
        }
        ValueBinding vb = getValueBinding("renderedOnUserRole");
        return vb != null ? (String) vb.getValue(getFacesContext()) : null;
    }

    /**
     * <p>
     * Return the value of the <code>rendered</code> property.
     * </p>
     */
    public boolean isRendered() {
        if (!Util.isRenderedOnUserRole(this)) {
            return false;
        }
        return super.isRendered();
    }

    public void setAttachment(boolean b) {
        this.attachment = Boolean.valueOf(b);
    }

    public boolean isAttachment() {
        if (attachment != null) {
            return (this.attachment.booleanValue());
        }
        ValueBinding vb = getValueBinding("attachment");
        if (vb != null) {
            return ((Boolean) vb.getValue(getFacesContext())).booleanValue();
        } else {
            return (true);
        }

    }

    /**
     * <p>
     * Gets the state of the instance as a <code>Serializable</code> Object.
     * </p>
     */
    public Object saveState(FacesContext context) {
        Object values[] = new Object[16];
        values[0] = super.saveState(context);
        values[1] = resource;
        values[2] = mimeType;
        values[3] = lastModified;
        values[4] = fileName;
        values[5] = image;
        values[6] = type;
        values[7] = label;
        values[8] = style;
        values[9] = styleClass;
        values[10] = renderedOnUserRole;
        values[11] = attachment;
        values[12] = shared;
        values[13] = target;
        values[14] = UIDataChild;
        values[15] = disabled;
        return ((Object) (values));
    }

    /**
     * <p>
     * Perform any processing required to restore the state from the entries in
     * the state Object.
     * </p>
     */
    public void restoreState(FacesContext context, Object state) {
        Object values[] = (Object[]) state;
        super.restoreState(context, values[0]);
        resource = (Resource) values[1];
        mimeType = (String) values[2];
        lastModified = (Date) values[3];
        fileName = (String) values[4];
        image = (String) values[5];
        type = (String) values[6];
        label = (String) values[7];
        style = (String) values[8];
        styleClass = (String) values[9];
        renderedOnUserRole = (String) values[10];
        attachment = (Boolean) values[11];
        shared = (Boolean) values[12];
        target = (String) values[13];
        UIDataChild = (Boolean) values[14];
        disabled = (Boolean) values[15];
    }

    public boolean getAttachment() {
        return this.isAttachment();
    }

    public int getLastResourceHashCode() {
        return lastResourceHashCode;
    }

    public String getPath() {
        return path;
    }

    public boolean isShared() {
        if (shared != null) {
            return (this.shared.booleanValue());
        }
        ValueBinding vb = getValueBinding("shared");
        if (vb != null) {
            return ((Boolean) vb.getValue(getFacesContext())).booleanValue();
        } else {
            return (true);
        }
    }

    public void setShared(boolean s) {
        this.shared = Boolean.valueOf(s);
    }

    public String getTarget() {
        if (target != null)
            return target;
        ValueBinding vb = getValueBinding("target");
        if (vb == null)
            return "_blank";
        Object value = vb.getValue(getFacesContext());
        if (value == null)
            return "_blank";
        return (String) value;
    }

    public void setTarget(String target) {
        this.target = target;
    }

    private boolean isUIDataChild() {
        if (UIDataChild == null) {
            UIDataChild = Boolean.FALSE;
            UIComponent parent = this.getParent();
            while (parent != null) {
                if (parent instanceof UIData || parent instanceof Tree) {
                    UIDataChild = Boolean.TRUE;
                    break;
                }
                parent = parent.getParent();
            }
        }
        return UIDataChild.booleanValue();
    }

    public void setDisabled(boolean disabled) {
        this.disabled = new Boolean(disabled);
        ValueBinding vb = getValueBinding("disabled");
        if (vb != null) {
            vb.setValue(getFacesContext(), this.disabled);
            this.disabled = null;
        }
    }

    public boolean isDisabled() {
        if (!Util.isEnabledOnUserRole(this)) {
            return true;
        }
        if (disabled != null) {
            return disabled.booleanValue();
        }
        ValueBinding vb = getValueBinding("disabled");
        Boolean v = vb != null ? (Boolean) vb.getValue(getFacesContext()) : null;
        return v != null ? v.booleanValue() : false;
    }
}

class RegisteredResource implements Resource, Serializable {
    private Resource resource;
    private String fileName;
    private String label;
    private Date lastModified;
    private String mimeType;
    private boolean isAttachment;
    private boolean isShared;
    private String path;

    public RegisteredResource(OutputResource outputResource, Resource resource, String fileName) {
        updateContents(outputResource, resource, fileName);
    }

    public String calculateDigest() {
        return resource.calculateDigest() + (isShared ? "" : String.valueOf(resource.hashCode()));
    }

    public Date lastModified() {
        return lastModified;
    }

    public InputStream open() throws IOException {
        return resource.open();
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    void updateContents(OutputResource outputResource, Resource resource, String fileName) {
        this.resource = resource;
        this.fileName = fileName;
        label = outputResource.getLabel();
        lastModified = outputResource.getLastModified();
        mimeType = outputResource.getMimeType();
        isAttachment = outputResource.isAttachment();
        isShared = outputResource.isShared();
    }

    public void withOptions(Options options) {
        ResourceOptions resourceOptions = new ResourceOptions();
        try {
            resource.withOptions(resourceOptions);
        } catch (IOException e) {
        }
        String fName = null;

        if (resourceOptions.fileName != null)
            fName = resourceOptions.fileName;
        else if (fileName != null) {
            fName = fileName;
        } else if (resource instanceof FileResource) {
            fName = (((FileResource) resource).getFile().getName());
        } else if (label != null)
            fName = label.replace(' ', '_');

        options.setFileName(fName);

        if (resourceOptions.lastModified != null)
            options.setLastModified(resourceOptions.lastModified);
        else if (lastModified != null)
            options.setLastModified(lastModified);

        if (resourceOptions.mimeType != null)
            options.setMimeType(resourceOptions.mimeType);
        else if (mimeType != null)
            options.setMimeType(mimeType);

        if (resourceOptions.isAttachment)
            options.setAsAttachement();
        else if (isAttachment)
            options.setAsAttachement();

    }

    private class ResourceOptions implements Resource.Options {
        private Date lastModified;
        private String mimeType;
        private String fileName;
        private boolean isAttachment;

        public void setMimeType(String mimeType) {
            this.mimeType = mimeType;
        }

        public void setLastModified(Date lastModified) {
            this.lastModified = lastModified;
        }

        public void setFileName(String fileName) {
            this.fileName = fileName;
        }

        public void setExpiresBy(Date date) {
        }

        public void setAsAttachement() {
            isAttachment = true;
        }
    }
}