/*
* Copyright 2004 Geert Bevin <gbevin[remove] at uwyn dot com>
*
* $Id: ConstrainedUtils.java 3750 2007-05-12 15:05:53Z gbevin $
*/
package com.uwyn.rife.site;
import com.uwyn.rife.tools.BeanUtils;
import com.uwyn.rife.tools.ClassUtils;
import com.uwyn.rife.tools.exceptions.BeanUtilsException;
import java.util.Iterator;
public class ConstrainedUtils
{
public static Constrained getConstrainedInstance(Class beanClass)
{
if (null == beanClass)
{
return null;
}
Constrained constrained = null;
if (Constrained.class.isAssignableFrom(beanClass))
{
try
{
constrained = (Constrained)beanClass.newInstance();
}
catch (Throwable e)
{
return null;
}
}
return constrained;
}
public static Constrained makeConstrainedInstance(Object bean)
{
if (null == bean)
{
return null;
}
Constrained constrained = null;
if (bean instanceof Constrained)
{
constrained = (Constrained)bean;
}
return constrained;
}
public static ConstrainedProperty getConstrainedProperty(Object bean, String name)
{
if (null == bean)
{
return null;
}
Constrained constrained = ConstrainedUtils.makeConstrainedInstance(bean);
ConstrainedProperty contrained_property = null;
if (constrained != null)
{
contrained_property = constrained.getConstrainedProperty(name);
}
return contrained_property;
}
public static String getIdentityProperty(Class beanClass)
{
String identity_property = null;
Constrained constrained_bean = getConstrainedInstance(beanClass);
if (constrained_bean != null)
{
Iterator<ConstrainedProperty> properties_it = constrained_bean.getConstrainedProperties().iterator();
ConstrainedProperty property;
while (properties_it.hasNext())
{
property = properties_it.next();
if (property.isIdentifier())
{
identity_property = property.getPropertyName();
break;
}
}
}
if (null == identity_property)
{
identity_property = "id";
}
return identity_property;
}
public static boolean editConstrainedProperty(Constrained bean, String propertyName, String prefix)
{
if (null == bean)
{
return true;
}
if (prefix != null &&
propertyName.startsWith(prefix))
{
propertyName = propertyName.substring(prefix.length());
}
ConstrainedProperty constrained_property = bean.getConstrainedProperty(propertyName);
return !(constrained_property != null &&
!constrained_property.isEditable());
}
public static boolean persistConstrainedProperty(Constrained bean, String propertyName, String prefix)
{
if (null == bean)
{
return true;
}
if (prefix != null &&
propertyName.startsWith(prefix))
{
propertyName = propertyName.substring(prefix.length());
}
ConstrainedProperty constrained_property = bean.getConstrainedProperty(propertyName);
if (constrained_property != null)
{
if (!constrained_property.isPersistent() ||
constrained_property.isSameAs() ||
constrained_property.hasManyToOneAssociation() ||
constrained_property.hasManyToMany() ||
constrained_property.hasManyToManyAssociation())
{
return false;
}
if (constrained_property.hasManyToOne() &&
!isManyToOneJoinProperty(bean.getClass(), propertyName))
{
return false;
}
}
return true;
}
private static boolean isManyToOneJoinProperty(Class beanClass, String propertyName)
{
try
{
Class property_type = BeanUtils.getPropertyType(beanClass, propertyName);
if (ClassUtils.isBasic(property_type))
{
return true;
}
}
catch (BeanUtilsException e)
{
return true;
}
return false;
}
public static boolean saveConstrainedProperty(Constrained bean, String propertyName, String prefix)
{
if (null == bean)
{
return true;
}
if (prefix != null &&
propertyName.startsWith(prefix))
{
propertyName = propertyName.substring(prefix.length());
}
ConstrainedProperty constrained_property = bean.getConstrainedProperty(propertyName);
if (constrained_property != null)
{
if (!constrained_property.isPersistent() ||
!constrained_property.isSaved() ||
constrained_property.isSameAs() ||
constrained_property.hasManyToOneAssociation() ||
constrained_property.hasManyToMany() ||
constrained_property.hasManyToManyAssociation())
{
return false;
}
if (constrained_property.hasManyToOne() &&
!isManyToOneJoinProperty(bean.getClass(), propertyName))
{
return false;
}
}
return true;
}
public static boolean fileConstrainedProperty(Constrained bean, String propertyName, String prefix)
{
if (null == bean)
{
return false;
}
if (prefix != null &&
propertyName.startsWith(prefix))
{
propertyName = propertyName.substring(prefix.length());
}
ConstrainedProperty constrained_property = bean.getConstrainedProperty(propertyName);
return constrained_property != null && constrained_property.isFile();
}
}