blob: 6feacb89cdb96e6233f4be3d92853d20339f2a0d [file] [log] [blame]
/*
* Copyright (c) 2011-2013, 2015 Eike Stepper (Berlin, Germany) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Eike Stepper - initial API and implementation
* Christian W. Damus (CEA LIST) - bug 418452
*/
package org.eclipse.net4j.util.properties;
import org.eclipse.net4j.internal.util.bundle.OM;
import org.eclipse.net4j.util.ObjectUtil;
import org.eclipse.net4j.util.lifecycle.LifecycleException;
import org.eclipse.net4j.util.lifecycle.LifecycleUtil;
/**
* Describes a property of a receiver object and extracts its value.
*
* @author Eike Stepper
* @since 3.2
*/
public abstract class Property<RECEIVER>
{
private final String name;
private final String label;
private final String description;
private final String category;
public Property(String name, String label, String description, String category)
{
this.name = name;
this.label = label;
this.description = description;
this.category = category;
}
public Property(String name, String label, String description)
{
this(name, label, description, null);
}
public Property(String name)
{
this(name, null, null);
}
public final String getName()
{
return name;
}
public final String getLabel()
{
return label;
}
public final String getDescription()
{
return description;
}
public final String getCategory()
{
return category;
}
public boolean testValue(RECEIVER receiver, Object[] args, Object expectedValue)
{
Object value = getValue(receiver);
if (value instanceof Boolean && expectedValue == null)
{
// Per the Expressions extension point spec, the 'value' attribute
// is optional for boolean-valued properties, in which case its
// default is true
expectedValue = Boolean.TRUE;
}
return ObjectUtil.equals(value, expectedValue);
}
public final Object getValue(RECEIVER receiver)
{
try
{
Object value = eval(receiver);
if (value == null)
{
return value;
}
Class<? extends Object> c = value.getClass();
if (c == Boolean.class)
{
return value;
}
if (c == Boolean.class)
{
return value;
}
if (c == Character.class)
{
return value;
}
if (c == Byte.class)
{
return value;
}
if (c == Short.class)
{
return value;
}
if (c == Integer.class)
{
return value;
}
if (c == Long.class)
{
return value;
}
if (c == Float.class)
{
return value;
}
if (c == Double.class)
{
return value;
}
return value.toString();
}
catch (LifecycleException ex)
{
//$FALL-THROUGH$
}
catch (Throwable ex)
{
if (LifecycleUtil.isActive(receiver))
{
OM.LOG.error(ex);
}
}
return null;
}
/**
* Returns the receiver's value for this property, either a {@link String} or a boxed primitive type. Return values of
* all other types are converted with {@link #toString()} in {@link #eval(Object)}.
*/
protected abstract Object eval(RECEIVER receiver);
}