Logo
Distributed Genetic Programming Framework
print print

File org.sfc.meta.PropertyPort.java

Here you can find all the information about the file org.sfc.meta.PropertyPort.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.1
 * Last modification: 2006-08-06
 *                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 java.lang.reflect.Method;

import org.sfc.collections.Arrays;
import org.sfc.id.LeafHID;
import org.sfc.utils.Typesafe;


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

public final  class PropertyPort<Type>  extends LeafHID<Class<?>,
                                                PropertyPort<Type>>
  {
/**
 * The serial version uid.
 */

  private static final long serialVersionUID = 1;
  
/**
 * The no-class array.
 */

  private static final Class[]  C0    = Arrays.EMPTY_CLASS_ARRAY;
/**
 * The no-object array.
 */

  private static final Object[] O0    = Arrays.EMPTY_OBJECT_ARRAY;
/**
 * The one-class array.
 */

  private static final Class[]  C1    = new Class[1];
/**
 * The one-object array.
 */

  private static final Object[] O1    = new Object[1];
/**
 * The two-class array.
 */

  private static final Class[]  C2    = new Class[2];
/**
 * The two-object array.
 */

  private static final Object[] O2    = new Object[2];    
/**
 * The getter method of the property.
 */

  private transient final     Method                    m_getter  ;
/**
 * If this method is specified, the property is an array property
 * (and can be indexed by an integer), this method will be used to obtain
 * the array length.
 */

  private transient final     Method                    m_counter ;
/**
 * The setter method of the property.
 */

  private transient final     Method                    m_setter  ;
  
/**
 * Create a new property definition.
 * @param p_owner        The owning property.
 * @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.
 */

  PropertyPort  (final Property<Type>   p_owner,
                 final Class            p_target,
                 final String           p_getter_name,
                 final String           p_setter_name,
                 final String           p_counter_name)
    {
    super(p_owner, p_target);
    
    Class<Type>      l_tt;
    
    l_tt           = p_owner.get_type();
    
    Method  l_m;

    l_m = null;
    if(p_getter_name != null)
      {
      try
        {
        if(p_counter_name != null)
          {        
          synchronized(C1)
            {
            C1[0] = int.class;
            l_m = p_target.getMethod(p_getter_name, C1);
            }
          }
        else
          {
          l_m = p_target.getMethod(p_getter_name, C0);
          }
        }
      catch(Throwable l_t)
        {
        Typesafe.tunnel_error(l_t);
        }
      }
    this.m_getter  = l_m;

    l_m = null;
    if(p_counter_name != null)
      {
      try
        {
        l_m = p_target.getMethod(p_counter_name, C0);
        }
      catch(Throwable l_t)
        {
        Typesafe.tunnel_error(l_t);
        }
      }
    this.m_counter = l_m;  

    l_m = null;
    if(p_setter_name != null)
      {  
      try
        {     
        if(p_counter_name != null)
          {
          synchronized(C2)
            {
            C2[0] = int.class;
            C2[1] = l_tt;
            l_m = p_target.getMethod(p_setter_name, C2);
            }
          }
        else
          {
          synchronized(C1)
            {
            C1[0] = l_tt;
            l_m = p_target.getMethod(p_setter_name, C1);
            }
          }
        }
      catch(Throwable l_t)
        {
        Typesafe.tunnel_error(l_t);
        }
      }
    
    this.m_setter = l_m;
    }
  
  
/**
 * 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  final boolean   is_valid(final Type p_value)
    {
    Property<Type>  l_p;
    
    l_p = Typesafe.cast(this.get_property());
    return l_p.is_valid(p_value);
    }

  
/**
 * Set a new value of this property from a specified instance of the target
 * object class. Use this only if this property is no array property.
 * @param p_instance  The instance to set the value to.
 * @param p_value     The new value of this property in the specified
 *                    instance.
 * @return  <code>true</code> if and only if the value has been set
 *          correctly, <code>false</code> if it either was invalid or the
 *          call to the internal setter failed.
 * @see PropertyPort#is_valid(Object)
 */

  public  final boolean set (final Object p_instance,
                             final Type   p_value)
    {
    if(this.is_valid(p_value))
      {
      try
        {
        synchronized(O1)
          {
          O1[0] = p_value;
          this.m_setter.invoke(p_instance, O1);
          return true;
          }
        }
      catch(Throwable l_t)
        {
        //
        }
      }
    
    return false;
    }

/**
 * Set a new  value of this property to a specified instance of the target
 * object class. Use this only if this property is an array property.
 * @param p_instance  The instance to set the value to.
 * @param p_index     The array index to use.
 * @param p_value     The new value of this property in the specified
 *                    instance.
 * @return  <code>true</code> if and only if the value has been set
 *          correctly, <code>false</code> if it either was invalid or the
 *          call to the internal setter failed.
 * @see PropertyPort#is_valid(Object)
 */

  public  final boolean  set (final Object p_instance,
                              final int    p_index,
                              final Type   p_value)
    {
    if(this.is_valid(p_value))
      {
      try
        {
        synchronized(O2)
          {
          O2[0] = Integer.valueOf(p_index);
          O2[1] = p_value;
          this.m_setter.invoke(p_instance, O2);
          return true;
          }
        }
      catch(Throwable l_t)
        {
        //
        }
      }
    
    return false;
    }

  
  
/**
 * Get the value of this property from a specified instance of the target
 * object class. Use this only if this property is no array property.
 * @param p_instance  The instance to get the value from.
 * @return  The value of this property in the specified instance, or
 *          <code>null</code> if an error occured.
 */

  public  final Type  get (final Object p_instance)
    {
    try
      {
      return Typesafe.cast(this.m_getter.invoke(p_instance, O0));
      }
    catch(Throwable l_t)
      {
      return null;
      }
    }

/**
 * Get the value of this property from a specified instance of the target
 * object class. Use this only if this property is an array property.
 * @param p_instance  The instance to get the value from.
 * @param p_index     The array index to use.
 * @return  The value of this property in the specified instance, or
 *          <code>null</code> if an error occured.
 */

  public  final Type  get (final Object p_instance,
                           final int    p_index)
    {
    try
      {
      synchronized(O1)
        {
        O1[0] = Integer.valueOf(p_index);
        return Typesafe.cast(this.m_getter.invoke(p_instance, O1));
        }
      }
    catch(Throwable l_t)
      {
      return this.get(p_instance);
      }
    }

/**
 * Obtain the array length of this property in the specified instance.
 * Use this method only if the property is an array property.
 * @param p_instance  The instance to obtain the array length of this
 *                    property of.
 * @return  The array length of this property in the specified instance.
 */

  public  final int get_count (final Object p_instance)
    {
    try
      {
      return ((Integer)(this.m_counter.invoke(p_instance))).intValue();
      }
    catch(Throwable l_t)
      {
      return 0;
      }
    }
  

/**
 * Returns wether the value of this property can be read or not.
 * @return  <code>true</code> if this property can be read,
 *          <code>false</code> if it cannot be read.
 */

  public  final boolean can_get()
    {
    return (this.m_getter != null);
    }

/**
 * Check whether this property port access an array or not.
 * @return  <code>true</code> if this property accesses an array,
 *          <code>false</code> otherwise.
 */

  public  final boolean is_array()
    {
    return (this.m_counter != null);
    }

  
  
  
/**
 * Returns wether the value of this property can be written or not.
 * @return  <code>true</code> if this property can be written,
 *          <code>false</code> if it is read-only.
 */

  public  final boolean can_set()
    {
    return (this.m_setter != null);
    }
  
  
/**
 * Obtain the property owning this port.
 * @return The property this port belongs to.
 */

  public  final Property<Type>  get_property()
    {
    return Typesafe.cast(this.get_owner());
    }
  }

File Information:

file name:PropertyPort.java
package:org.sfc.meta
qualified name:org.sfc.meta.PropertyPort.java
file type:Java Source File
download location:download http://dgpf.sourceforge.net/source/org/sfc/meta/PropertyPort.java
size:10.448 KB (10699 B)
uploaded: 2015-07-22 04:11:12 GMT+0000
last update: 2006-08-06 14:15:15 GMT+0000
last access: 2018-01-22 04:10:55 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-22 04:10:55 GMT+0000.
Valid CSS Valid XHTML 1.1
Valid RSS SourceForge.net Logo