/*
* RHQ Management Platform
* Copyright (C) 2009-2010 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.core.gui.table.renderer;
import com.sun.faces.util.MessageUtils;
import org.ajax4jsf.renderkit.HeaderResourceProducer2;
import org.ajax4jsf.renderkit.ProducerContext;
import org.ajax4jsf.resource.InternetResource;
import org.ajax4jsf.resource.InternetResourceBuilder;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.faces.FacesException;
import javax.faces.component.UIComponent;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.render.Renderer;
import java.io.IOException;
/**
*
*/
public abstract class AbstractRenderer extends Renderer implements HeaderResourceProducer2 {
private final Log log = LogFactory.getLog(this.getClass());
private InternetResourceBuilder resourceBuilder;
protected void validateParameters(FacesContext context, UIComponent component) {
if (context == null) {
throw new NullPointerException(MessageUtils.getExceptionMessageString(
MessageUtils.NULL_PARAMETERS_ERROR_MESSAGE_ID, "context"));
}
if (component == null) {
throw new NullPointerException(MessageUtils.getExceptionMessageString(
MessageUtils.NULL_PARAMETERS_ERROR_MESSAGE_ID, "component"));
}
}
protected void initializeComponentId(FacesContext context, UIComponent component) {
if (component.getId() == null) {
String id = context.getViewRoot().createUniqueId();
component.setId(id);
}
}
protected void writeIdAttributeIfNecessary(FacesContext context,
ResponseWriter writer,
UIComponent component) {
initializeComponentId(context, component);
if (!component.getId().startsWith(UIViewRoot.UNIQUE_ID_PREFIX)) {
try {
writer.writeAttribute("id", component.getClientId(context), "id");
} catch (IOException e) {
String message = MessageUtils.getExceptionMessageString
(MessageUtils.CANT_WRITE_ID_ATTRIBUTE_ERROR_MESSAGE_ID,
e.getMessage());
log.warn(message);
}
}
}
/**
* Hook method to return array of script resources to store in head.
*/
protected InternetResource[] getScripts() {
return null;
}
/**
* Hook method to return array of styles resources to store in head.
*/
protected InternetResource[] getStyles() {
return null;
}
/**
* @param context
* @param component
* @param resources
* @throws IOException
*/
protected void encodeResourcesArray(FacesContext context,
UIComponent component, InternetResource[] resources)
throws IOException {
if (resources != null) {
for (InternetResource resource : resources) {
resource.encode(context, component);
}
}
}
public void encodeToHead(FacesContext context, UIComponent component, ProducerContext pc) throws IOException {
if (pc.isProcessScripts()) {
encodeResourcesArray(context, component, getScripts());
}
if (pc.isProcessStyles()) {
encodeResourcesArray(context, component, getStyles());
}
}
/**
* Base stub method for produce internet resource ( image, script ... )
* since resources must be implemented in "lightweight" pattern, it instances
* put in internal map to caching.
* @param resourceURI - relative ( to renderer class ) uri to resource in jar or
* key for generate ( in Java2D , for example ).
* @return - resource instance for this uri.
* @throws org.ajax4jsf.resource.ResourceNotFoundException - if reqested resource not instantiated.
*/
protected InternetResource getResource(String resourceURI ) throws FacesException {
return getResourceBuilder().createResource(this,resourceURI);
}
private InternetResourceBuilder getResourceBuilder(){
if (this.resourceBuilder == null) {
this.resourceBuilder = InternetResourceBuilder.getInstance();
}
return this.resourceBuilder;
}
}