Logo
Distributed Genetic Programming Framework
print print

File org.sfc.meta.Property.java

Here you can find all the information about the file org.sfc.meta.Property.java. You may explore it here or download it onto your local disk.
/*
 * Copyright (c) 2006 Thomas Weise
 *
 * E-Mail           : tweise@gmx.de
 * Creation Date    : 2006-05-04 05:40:49
 * Original Filename: org.sfc.meta.Property.java
 * Version          : 1.0.3
 * Last modification: 2006-07-24
 *                by: Thomas Weise
 *
 * License          : GNU LESSER GENERAL PUBLIC LICENSE
 *                    Version 2.1, February 1999
 *                    You should have received a copy of this license along
 *                    with this library; if not, write to the Free Software
 *                    Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 *                    MA 02111-1307, USA or download the license under
 *                    http://www.gnu.org/copyleft/lesser.html.
 *
 * Warranty         : This software is provided "as is" without any
 *                    warranty; without even the implied warranty of
 *                    merchantability or fitness for a particular purpose.
 *                    See the Gnu Lesser General Public License for more
 *                    details.
 */


package org.sfc.meta;

import org.sfc.id.HID;
import org.sfc.text.Text;
import org.sfc.utils.Typesafe;


/**
 * This class holds the information on one single property of an object.
 * 
 * @param <Type> The type of the property.
 * 
 * @author Thomas Weise
 */

public class Property<Type>
       extends HID<String,Class<?>, PropertyPort<Type>, Property<Type>>
  {
/**
 * The serial version uid.
 */

  private static final long serialVersionUID = 1;  
/**
 * The type of the property.
 */

  private transient final     Class<Type>               m_type  ;
/**
 * The next twin property.
 */

  private transient volatile  Property<?>               m_next  ;
/**
 * The cached name.
 */

  private transient final     String                    m_name  ;
/**
 * <code>true</code> if and only if there is at least one property port
 * able to read this property's value.
 */

  private transient           boolean                   m_can_get  ;
/**
 * <code>true</code> if and only if there is at least one property port
 * able to write this property's value.
 */

  private transient           boolean                   m_can_set  ;
  
/**
 * Create a new property definition.
 * @param p_name         The id of the property. This should be a short
 *                       english abbreviation of the property. It could be
 *                       used as a key for a resource file, so we can
 *                       support i18n.
 * @param p_twin         The twin property.     
 * @param p_group        The property group this property belongs to.
 * @param p_type         The type of the property.
 */

  @SuppressWarnings("unchecked")
  Property  (final String         p_name,
             final PropertyGroup  p_group,
             final Property<?>    p_twin,
             final Class<Type>    p_type)
    {
    super(((HID<String, String, Property<Type>,?>)p_group),
           Text.preprocess((p_twin != null) ?
                           (p_name + '.' + p_type.getCanonicalName()) :
                            p_name));
    Property<?>  l_p;
    
    synchronized(Property.class)
      {
      if(p_twin == null)
        {
        this.m_next = this;
        this.m_name = this.get_id();
        }
      else
        {
        l_p           = p_twin.m_next;
        p_twin.m_next = this;
        this.m_next   = l_p;
        this.m_name   = l_p.get_name();
        }
      }
        
    this.m_type  = p_type;    
    }
  
  
  
/**
 * Create a new property definition.
 * @param p_name         The id of the property. This should be a short
 *                       english abbreviation of the property. It could be
 *                       used as a key for a resource file, so we can
 *                       support i18n.
 * @param p_group        The property group this property belongs to.
 * @param p_type         The type of the property.
 */

  public  Property  (final String         p_name,
                     final PropertyGroup  p_group,
                     final Class<Type>    p_type)
    {
    this(p_name, p_group, null, p_type);
    }
   
  
/**
 * Create a new twin property definition. A twin property is a property
 * that has the same semantical meaning as the other twin but another type.
 * This can happen for example when defining a property whose values are
 * complicated objects. You could define a twin property of the type string
 * to represent only the string representations of that objects if having
 * implemented regarding accessor routines.
 * @param p_twin         The twin property.      
 * @param p_type         The type of the property.
 */

  public  Property  (final Property<?>      p_twin,
                     final Class<Type>      p_type)
    {
    this(null, p_twin.get_group(), p_twin, p_type);
    }
  
  
  
/**
 * Obtain the property-port for the specified target class.
 * @param p_target  The target class.
 * @return  The property port defined for this class, or <code>null</code>
 *          if none exists.
 */

  public  final PropertyPort<Type> get_port (Class<?> p_target)
    {
    PropertyPort<Type> l_p;
    
    for(; p_target != null; p_target = p_target.getSuperclass())
      {
      l_p = this.get(p_target);
      if(l_p != null) return l_p;
      }
    
    return null;
    }
  

  
/**
 * Obtain the property group of this property.
 * @return The property group of this property.
 */

  public  final PropertyGroup get_group()
    {
    return Typesafe.cast(this.get_owner());
    }

/**
 * Check whether a given value would be a valid value for this property or
 * not.
 * @param p_value   The value to be checked.
 * @return  <code>true</code> if and only if the value is valid for this
 *          property.
 */

  public  boolean   is_valid(final Type p_value)
    {
    return true;
    }

  
/**
 * Obtain the next twin property. All twin properties are arranged in
 * a ring list. This means, you can iterate over the list like:
 * <code><pre>
 * Property<?> l_a, l_b;
 * l_a = get property from somewhere
 * l_b = l_a;
 * do
 *  {
 *  do something here
 *  l_b = l_b.get_next_twin();
 *  } while (l_b != l_a);
 *  </pre></code> 
 * @return  The next twin property of this property.
 */

  public  final Property<?> get_next_twin()
    {
    return this.m_next;
    }
  
/**
 * Returns the name of the id.
 * @return  The name of the id.
 */

  public   final  String  get_name  ()
    {
    return this.m_name;
    }
  
  
/**
 * Obtain the type of this property.
 * @return  The type of this property.
 */

  public  final Class<Type> get_type()
    {
    return this.m_type;
    }
  
/**
 * Check whether this property is equal to a given object.
 * @param p_p The object to compare to.
 * @return  <code>true</code> if the object <code>p_p</code> is a twin
 *          property of this one.
 */

  @Override
  public  final boolean equals  (final Object p_p)
    {
    Property<?> l_p;
    
    if(p_p == thisreturn true;
    
    if(p_p instanceof Property)
      {    
      l_p = Typesafe.cast(p_p);
      
      do
        {
        if(l_p == thisreturn true;
        l_p = l_p.m_next;
        } while(l_p != p_p);
      }
    
    return false;
    }
  
/**
 * Add a new property port.
 * @param p_target       The target base class that owns this property.
 * @param p_setter_name  The name of the setter method of the property.
 * @param p_getter_name  The name of the getter method of the property.
 * @param p_counter_name If this method name is specified, the property is
 *                       an array property (and can be indexed by an
 *                       integer), this method will be used to obtain the
 *                       cardinality of the property.
 */

  public  final void  add_port  (final Class<?>   p_target,
                                 final String     p_getter_name,
                                 final String     p_setter_name,
                                 final String     p_counter_name)
    {
    PropertyPort<Type>  l_pp;
    
    l_pp = new PropertyPort<Type>(this, p_target, p_getter_name, p_setter_name,
                           p_counter_name);
    this.m_can_get |= l_pp.can_get();
    this.m_can_set |= l_pp.can_set();
    }
  
  
/**
 * Add a new property port by computing the getter, setter and counter
 * names using the property's name.
 * @param p_target       The target base class that owns this property.
 * @param p_has_setter   <code>true</code> if and only if a setter is
 *                       available.
 * @param p_has_getter   <code>true</code> if and only if a getter is
 *                       available.
 * @param p_counter_name If this method name is specified, the property is
 *                       an array property (and can be indexed by an
 *                       integer), this method will be used to obtain the
 *                       cardinality of the property.
 *              
 */

  public  final void  add_port  (final Class<?>   p_target,
                                 final boolean    p_has_getter,
                                 final boolean    p_has_setter,
                                 final String     p_counter_name)
    {
    this.add_port(p_target,
                  (p_has_getter ? ("get_" + this.m_name) : null),
                  (p_has_setter ? ("set_" + this.m_name) : null),                  
                  p_counter_name);
    }
  
/**
 * Obtain the unique name of this property.
 * @return  The unique name of this property which can be resolved back to
 *          the property.
 * @see #resolve_unique_name(String)
 */

  public  final String  get_unique_name ()
    {
    return (this.get_id() + '@' + this.get_group().get_name());
    }
  
/**
 * Returns wether the value of this property can be read by at least
 * one property port or not.
 * @return  <code>true</code> if this property can be read by at least
 *          one property port, <code>false</code> if it cannot be read.
 */

  public  final boolean can_get()
    {
    return this.m_can_get;
    }
  
  
  
/**
 * Returns wether the value of this property can be written  by at least
 * one property port or not.
 * @return  <code>true</code> if this property can be written  by at least
 *          one property port, <code>false</code> if it is read-only.
 */

  public  final boolean can_set()
    {
    return this.m_can_set;
    }
  
/**
 * Resolve a unique property name back to a property.
 * @param p_name    The unique name of the property, obtained using
 *                  <code>get_unique_name</code>.
 * @return  The property identified with the name <code>p_name</code> or
 *          <code>null</code> if no such property exists.        
 */

  public static final Property<?> resolve_unique_name (final String p_name)
    {
    int           l_i;
    PropertyGroup l_g;
    
    if(p_name == null) return null;
    l_i = p_name.indexOf('@');
    if(l_i < 0) return null;
    
    l_g = PropertyGroup.MANAGER.get(p_name.substring(l_i+1));
    if(l_g == null) return null;
    
    return l_g.get(p_name.substring(0, l_i));
    }
  
/**
 * Check whether this property holds numeric values or not.
 * @return <code>true</code> if and only if the property represents a
 *         numberic value.
 */

  public  final boolean is_numeric  ()
    {
    Class l_c;
    
    l_c = this.m_type;
    return ( (Number.class.isAssignableFrom(l_c)) ||
             (l_c == byte.class)  ||
             (l_c == short.class) ||
             (l_c == int.class)   ||
             (l_c == long.class)  ||
             (l_c == float.class) ||
             (l_c == double.class) );
    }
  }

File Information:

file name:Property.java
package:org.sfc.meta
qualified name:org.sfc.meta.Property.java
file type:Java Source File
download location:download http://dgpf.sourceforge.net/source/org/sfc/meta/Property.java
size:11.731 KB (12013 B)
uploaded: 2015-07-22 04:11:12 GMT+0000
last update: 2006-07-24 08:19:07 GMT+0000
last access: 2018-01-23 15:36:08 GMT+0000

statistics online since 2006-01-02.   RSS Feed
Contact us by sending an email to tweise@gmx.de to receive further information, to report errors, or to join our project.
All content on this site (http://dgpf.sourceforge.net/) is LGPL-licensed.
http://dgpf.sourceforge.net/scripts/source/source.php last modified at 2015-07-22 04:10:53 GMT+0000 served at 2018-01-23 15:36:08 GMT+0000.
Valid CSS Valid XHTML 1.1
Valid RSS SourceForge.net Logo