blob: 2fc55547b291358e48e10b6dd74796e893b12523 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.empire.jsf2.controls;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import org.apache.empire.commons.StringUtils;
import org.apache.empire.exceptions.InternalException;
import org.apache.empire.exceptions.InvalidArgumentException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public final class InputControlManager
{
private static final Logger log = LoggerFactory.getLogger(InputControlManager.class);
private static Class<? extends javax.faces.component.html.HtmlOutputLabel> labelComponentClass = javax.faces.component.html.HtmlOutputLabel.class;
private static boolean showLabelRequiredMark = false;
public static Class<? extends javax.faces.component.html.HtmlOutputLabel> getLabelComponentClass()
{
return labelComponentClass;
}
public static void setLabelComponentClass(Class<? extends javax.faces.component.html.HtmlOutputLabel> labelComponentClass)
{
InputControlManager.labelComponentClass = labelComponentClass;
}
public static boolean isShowLabelRequiredMark()
{
return showLabelRequiredMark;
}
public static void setShowLabelRequiredMark(boolean showLabelRequiredMark)
{
InputControlManager.showLabelRequiredMark = showLabelRequiredMark;
}
static HashMap<String, InputControl> controlMap = null;
static
{
controlMap = new HashMap<String, InputControl>();
registerControl(new TextInputControl());
registerControl(new SelectInputControl());
registerControl(new TextAreaInputControl());
registerControl(new CheckboxInputControl());
registerControl(new RadioInputControl());
/*
registerControl(new PhoneInputControl());
registerControl(new EMailInputControl());
registerControl(new HLinkInputControl());
registerControl(new PasswordInputControl());
*/
}
private InputControlManager()
{
// Default Constructor
}
public static void registerControl(InputControl control)
{
controlMap.put(control.getName(), control);
}
public static InputControl getControl(String name)
{
return controlMap.get(name);
}
static InputAttachedObjectsHandler attachedObjectsHandler = new InputAttachedObjectsHandler();
public static InputAttachedObjectsHandler getAttachedObjectsHandler()
{
return attachedObjectsHandler;
}
public static void setAttachedObjectsHandler(InputAttachedObjectsHandler attachedObjectsHandler)
{
InputControlManager.attachedObjectsHandler = attachedObjectsHandler;
}
private static Map<Class<? extends UIComponent>, String> componentTypeMap = new HashMap<Class<? extends UIComponent>, String>();
@SuppressWarnings("unchecked")
public static <T extends UIComponent> T createComponent(FacesContext context, Class<T> clazz)
{
// Get component type from class
String type = componentTypeMap.get(clazz);
if (type == null)
{ // Detect type
try
{ // Detect component type
Field field = clazz.getDeclaredField("COMPONENT_TYPE");
if (field != null)
type = StringUtils.toString(field.get(null), ""); // Empty string is default
else
type = ""; // Empty string is default
// show
log.debug("Component-Type for class {} is {}", clazz.getName(), type);
}
catch (SecurityException e)
{
throw new InternalException(e);
}
catch (NoSuchFieldException e)
{ // No COMPONENT_TYPE field
log.debug("No Component-Type available for class {}!", clazz.getName());
type = ""; // Empty string is default
}
catch (IllegalArgumentException e)
{
throw new InternalException(e);
}
catch (IllegalAccessException e)
{
throw new InternalException(e);
}
// put in map
componentTypeMap.put(clazz, type);
}
// Now, create the instance
if (StringUtils.isEmpty(type))
{
try
{ // create instance directly
return clazz.newInstance();
}
catch (InstantiationException e)
{
throw new InternalException(e);
}
catch (IllegalAccessException e)
{
throw new InternalException(e);
}
}
// otherwise ask the application
return (T) context.getApplication().createComponent(type);
}
public static void registerComponentType(Class<? extends UIComponent> componentClass, String componentType)
{
if (componentClass==null)
throw new InvalidArgumentException("componentClass", componentClass);
if (StringUtils.isNotEmpty(componentType))
{ // add
log.debug("registering Component type {} for {}", componentType, componentClass.getName());
componentTypeMap.put(componentClass, componentType);
}
else
{ // remove
log.debug("unregisterin Component type {} for {}", componentType, componentClass.getName());
componentTypeMap.remove(componentClass);
}
}
}