All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.icesoft.faces.component.outputresource.OutputResource Maven / Gradle / Ivy

/*
 * 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;

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;
	}

	/**
	 * 

* Return the value of the styleClass property. *

* * @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; } /** *

* Return the value of the renderedOnUserRole property. *

*/ public String getRenderedOnUserRole() { if (renderedOnUserRole != null) { return renderedOnUserRole; } ValueBinding vb = getValueBinding("renderedOnUserRole"); return vb != null ? (String) vb.getValue(getFacesContext()) : null; } /** *

* Return the value of the rendered property. *

*/ 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); } } /** *

* Gets the state of the instance as a Serializable Object. *

*/ 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)); } /** *

* Perform any processing required to restore the state from the entries in * the state Object. *

*/ 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; } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy