blob: 2829e98f63fe539a28fb8380e1c5f57811ba605e [file] [log] [blame]
/*
* $Id$
*/
/*
* Copyright 2004 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistribution in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* Neither the name of Sun Microsystems, Inc. or the names of
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any
* kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
* WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
* EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY
* DAMAGES OR LIABILITIES SUFFERED BY LICENSEE AS A RESULT OF OR
* RELATING TO USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE OR
* ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE
* FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT,
* SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF
* THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS
* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that this software is not designed, licensed or
* intended for use in the design, construction, operation or
* maintenance of any nuclear facility.
*/
// Util.java
package org.apache.cocoon.faces.samples.components.renderkit;
import javax.faces.FactoryFinder;
import javax.faces.application.Application;
import javax.faces.application.ApplicationFactory;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.el.MethodBinding;
import javax.faces.el.ValueBinding;
/**
* <B>Util</B> is a class which houses common functionality used by
* other classes.
*
* @version $Id$
*/
public class Util extends Object {
//
// Protected Constants
//
//
// Class Variables
//
/**
* This array contains attributes that have a boolean value in JSP,
* but have have no value in HTML. For example "disabled" or
* "readonly". <P>
*
* @see #renderBooleanPassthruAttributes
*/
private static String booleanPassthruAttributes[] = {
"disabled",
"readonly",
"ismap"
};
/**
* This array contains attributes whose value is just rendered
* straight to the content. This array should only contain
* attributes that require no interpretation by the Renderer. If an
* attribute requires interpretation by a Renderer, it should be
* removed from this array.<P>
*
* @see #renderPassthruAttributes
*/
private static String passthruAttributes[] = {
"accesskey",
"alt",
"cols",
"height",
"lang",
"longdesc",
"maxlength",
"onblur",
"onchange",
"onclick",
"ondblclick",
"onfocus",
"onkeydown",
"onkeypress",
"onkeyup",
"onload",
"onmousedown",
"onmousemove",
"onmouseout",
"onmouseover",
"onmouseup",
"onreset",
"onselect",
"onsubmit",
"onunload",
"rows",
"size",
"tabindex",
//"class", PENDING(rlubke) revisit this for JSFA105
"title",
"style",
"width",
"dir",
"rules",
"frame",
"border",
"cellspacing",
"cellpadding",
"summary",
"bgcolor",
"usemap",
"enctype",
"accept-charset",
"accept",
"target",
"onsubmit",
"onreset"
};
private static long id = 0;
//
// Instance Variables
//
// Attribute Instance Variables
// Relationship Instance Variables
//
// Constructors and Initializers
//
private Util() {
throw new IllegalStateException();
}
//
// Class methods
//
public static Class loadClass(String name) throws ClassNotFoundException {
ClassLoader loader =
Thread.currentThread().getContextClassLoader();
if (loader == null) {
return Class.forName(name);
} else {
return loader.loadClass(name);
}
}
/**
* Generate a new identifier currently used to uniquely identify
* components.
*/
public static synchronized String generateId() {
if (id == Long.MAX_VALUE) {
id = 0;
} else {
id++;
}
return Long.toHexString(id);
}
/**
* NOTE: Commented out to remove JSTL dependency.
*
* Return a Locale instance using the following algorithm: <P>
*
* <UL>
*
* <LI>
*
* If this component instance has an attribute named "bundle",
* interpret it as a model reference to a LocalizationContext
* instance accessible via FacesContext.getModelValue().
*
* </LI>
*
* <LI>
*
* If FacesContext.getModelValue() returns a LocalizationContext
* instance, return its Locale.
*
* </LI>
*
* <LI>
*
* If FacesContext.getModelValue() doesn't return a
* LocalizationContext, return the FacesContext's Locale.
*
* </LI>
*
* </UL>
public static Locale
getLocaleFromContextOrComponent(FacesContext context,
UIComponent component) {
Locale result = null;
String bundleName = null, bundleAttr = "bundle";
// ParameterCheck.nonNull(context);
// ParameterCheck.nonNull(component);
// verify our component has the proper attributes for bundle.
if (null !=
(bundleName = (String) component.getAttributes().get(bundleAttr))) {
// verify there is a Locale for this modelReference
javax.servlet.jsp.jstl.fmt.LocalizationContext locCtx = null;
if (null != (locCtx =
(javax.servlet.jsp.jstl.fmt.LocalizationContext)
(Util.getValueBinding(bundleName)).getValue(context))) {
result = locCtx.getLocale();
// Assert.assert_it(null != result);
}
}
if (null == result) {
result = context.getViewRoot().getLocale();
}
return result;
}
*/
/**
* Render any boolean "passthru" attributes.
* <P>
*
* @see #passthruAttributes
*/
public static String renderBooleanPassthruAttributes(FacesContext context,
UIComponent component) {
int i = 0, len = booleanPassthruAttributes.length;
String value;
boolean thisIsTheFirstAppend = true;
StringBuffer renderedText = new StringBuffer();
for (i = 0; i < len; i++) {
if (null != (value = (String)
component.getAttributes().get(booleanPassthruAttributes[i]))) {
if (thisIsTheFirstAppend) {
// prepend ' '
renderedText.append(' ');
thisIsTheFirstAppend = false;
}
if (Boolean.valueOf(value).booleanValue()) {
renderedText.append(booleanPassthruAttributes[i] + ' ');
}
}
}
return renderedText.toString();
}
/**
* Render any "passthru" attributes, where we simply just output the
* raw name and value of the attribute. This method is aware of the
* set of HTML4 attributes that fall into this bucket. Examples are
* all the javascript attributes, alt, rows, cols, etc. <P>
*
* @return the rendererd attributes as specified in the component.
* Padded with leading and trailing ' '. If there are no passthru
* attributes in the component, return the empty String.
*
* @see #passthruAttributes
*/
public static String renderPassthruAttributes(FacesContext context,
UIComponent component) {
int i = 0, len = passthruAttributes.length;
String value;
boolean thisIsTheFirstAppend = true;
StringBuffer renderedText = new StringBuffer();
for (i = 0; i < len; i++) {
if (null != (value = (String)
component.getAttributes().get(passthruAttributes[i]))) {
if (thisIsTheFirstAppend) {
// prepend ' '
renderedText.append(' ');
thisIsTheFirstAppend = false;
}
renderedText.append(passthruAttributes[i] + "=\"" + value +
"\" ");
}
}
return renderedText.toString();
}
public static ValueBinding getValueBinding(String valueRef) {
ApplicationFactory af = (ApplicationFactory)
FactoryFinder.getFactory(FactoryFinder.APPLICATION_FACTORY);
Application a = af.getApplication();
return (a.createValueBinding(valueRef));
}
public static MethodBinding createConstantMethodBinding(String outcome) {
return new ConstantMethodBinding(outcome);
}
//
// General Methods
//
} // end of class Util