blob: 333c591bab63dff66c994b020c7456998212ae9d [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.myfaces.trinidaddemo;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import javax.faces.component.UIComponent;
import org.apache.myfaces.trinidad.context.RequestContext;
public class ComponentEditorHandler
{
public String update()
{
boolean rendered = _editedComponent.isRendered();
List<PropertyOfComponent> list = _list;
if (list != null)
{
for(PropertyOfComponent prop : list)
{
prop.flushToComponent();
}
}
RequestContext rc = RequestContext.getCurrentInstance();
// If we toggled rendered, we'd better toggle the parent
if (rendered != _editedComponent.isRendered())
rc.addPartialTarget(_editedComponent.getParent());
else
rc.addPartialTarget(_editedComponent);
return null;
}
public void setComponent(UIComponent component)
{
_editedComponent = component;
}
public UIComponent getComponent()
{
return _editedComponent;
}
public boolean isJavascriptShown()
{
return _javascriptShown;
}
public void setJavascriptShown(boolean javascriptShown)
{
_javascriptShown = javascriptShown;
}
public List<PropertyOfComponent> getAttributes()
{
if (_list != null)
return _list;
UIComponent comp = getComponent();
if (comp == null)
return null;
List<PropertyOfComponent> list = new ArrayList<PropertyOfComponent>();
try
{
BeanInfo beanInfo = Introspector.getBeanInfo(comp.getClass());
PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors();
for (int i = 0; i < descriptors.length; i++)
{
PropertyDescriptor descriptor = descriptors[i];
// "Write-only" properties - no go
if (descriptor.getReadMethod() == null)
continue;
PropertyOfComponent poc = null;
boolean readOnly = descriptor.getWriteMethod() == null;
if (readOnly)
continue;
// For now, skip any attributes with ValueBindings
String name = descriptor.getName();
if (comp.getValueBinding(name) != null)
continue;
Class<?> type = descriptor.getPropertyType();
if ((type == String.class) ||
(type == Object.class))
{
if (!isJavascriptShown() &&
name.startsWith("on"))
continue;
poc = new StringProperty(comp, descriptor);
}
else if ((type == Integer.class) ||
(type == Integer.TYPE))
{
poc = new IntegerProperty(comp, descriptor);
}
else if ((type == Boolean.class) ||
(type == Boolean.TYPE))
{
poc = new BooleanProperty(comp, descriptor);
}
else if (type == Date.class)
{
poc = new DateProperty(comp, descriptor);
}
if (poc != null)
list.add(poc);
}
// Sort the list by property name
Collections.sort(list);
_list = list;
return list;
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
static public class PropertyOfComponent implements Comparable<PropertyOfComponent>
{
public PropertyOfComponent(UIComponent component,
PropertyDescriptor descriptor)
{
_component = component;
_descriptor = descriptor;
}
// Sort by the name of the property
public int compareTo(PropertyOfComponent poc)
{
return getName().compareTo(poc.getName());
}
public String getName()
{
return _descriptor.getName();
}
public String getType()
{
return null;
}
@SuppressWarnings("unchecked")
public void flushToComponent()
{
if (_valueSet)
_component.getAttributes().put(getName(), _value);
}
protected Object getBeanProperty()
{
Method method = _descriptor.getReadMethod();
try
{
return method.invoke(_component, (Object[])null);
}
catch (Exception e)
{
e.printStackTrace();
}
return getProperty();
}
protected Object getProperty()
{
return _component.getAttributes().get(getName());
}
protected void setProperty(Object value)
{
if ("".equals(value))
value = null;
_valueSet = true;
_value = value;
}
private boolean _valueSet = false;
private Object _value = null;
private final PropertyDescriptor _descriptor;
private final UIComponent _component;
}
static public class IntegerProperty extends PropertyOfComponent
{
public IntegerProperty(UIComponent component, PropertyDescriptor descriptor)
{
super(component, descriptor);
}
public Integer getValue()
{
return (Integer) getProperty();
}
public void setValue(Integer i)
{
setProperty(i);
}
@Override
public String getType()
{
return "integer";
}
}
static public class DateProperty extends PropertyOfComponent
{
public DateProperty(UIComponent component, PropertyDescriptor descriptor)
{
super(component, descriptor);
}
public Date getValue()
{
return (Date) getProperty();
}
public void setValue(Date i)
{
setProperty(i);
}
@Override
public String getType()
{
return "date";
}
}
static public class StringProperty extends PropertyOfComponent
{
public StringProperty(UIComponent component, PropertyDescriptor descriptor)
{
super(component, descriptor);
}
public String getValue()
{
Object o = getProperty();
if (o == null)
return null;
return o.toString();
}
public void setValue(String s)
{
setProperty(s);
}
@Override
public String getType()
{
return "string";
}
}
static public class BooleanProperty extends PropertyOfComponent
{
public BooleanProperty(UIComponent component, PropertyDescriptor descriptor)
{
super(component, descriptor);
}
public Boolean getValue()
{
return (Boolean) getBeanProperty();
}
public void setValue(Boolean b)
{
setProperty(b);
}
@Override
public String getType()
{
return "boolean";
}
}
private UIComponent _editedComponent;
private boolean _javascriptShown = true;
private List<PropertyOfComponent> _list;
}