2005/5/9

     
 

Field.cpp

artefaktur
// -*- mode:C++; tab-width:2; c-basic-offset:2; indent-tabs-mode:nil -*- 
//
// Copyright (C) 2000-2005 by Roger Rene Kommer / artefaktur, Kassel, Germany.
// 
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Library General Public License (LGPL).
// 
// 
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the 
// License ACDK-FreeLicense document enclosed in the distribution
// for more for more details.
// This file is part of the Artefaktur Component Development Kit:
//                         ACDK
// 
// Please refer to
// - http://www.acdk.de
// - http://www.artefaktur.com
// - http://acdk.sourceforge.net
// for more information.
// 
// $Header: /cvsroot/acdk/acdk/acdk_core/src/acdk/lang/reflect/Field.cpp,v 1.16 2005/04/13 13:28:34 kommer Exp $


#include <acdk.h>

#include "../Boolean.h"
#include "../Integer.h"
#include "../Byte.h"
#include "../Character.h"
#include "../Long.h"
#include "../Short.h"
#include "../Float.h"
#include "../Double.h"

#include "../IllegalArgumentException.h"
#include "../UnsupportedOperationException.h"
#include <acdk/lang/dmi/AcdkStdWeakTypeDmiClient.h>


namespace acdk {
namespace lang {
namespace reflect {

using ::acdk::lang::IllegalArgumentException;
using ::acdk::lang::dmi::AcdkStdWeakTypeDmiClient;

Field::Field(const acdk::lang::dmi::ClazzInfo* clazz, const acdk::lang::dmi::ClazzFieldInfo* field) 
: AccessibleObject(),
  _clazz(clazz),
  _field(field)
{
  setAccessible(field->flags & dmi::MiPublic);
}

//virtual 
bool 
Field::equals(IN(acdk::lang::Object) obj)
{
  if (instanceof(obj, Field) == false)
    return false;
  RField o = RField(obj);
  return toString()->compareTo(o->toString()) == 0;
}


bool 
Field::_isStatic()
{
  return dmi::MetaInfo::isStatic(_field->flags);
}



//virtual 
acdk::lang::Object 
Field::get(IN(acdk::lang::Object) obj, int accessFlags)
{
  if (obj == Nil)
    return get();
  AcdkStdWeakTypeDmiClient dmiclient;
  return (acdk::lang::Object)obj->getMember(ACDK_STACK_STR(_field->name), dmiclient, accessFlags);
}

acdk::lang::Object 
Field::get(int accessFlags)
{
  AcdkStdWeakTypeDmiClient dmiclient;
  return (acdk::lang::Object)getStaticMember(_clazz, ACDK_STACK_STR(_field->name), dmiclient, accessFlags);
}


//virtual 
bool 
Field::getBoolean(IN(acdk::lang::Object) obj, int accessFlags)
{
  if (obj == Nil)
    return getStaticMember(_clazz, ACDK_STACK_STR(_field->name), 
                                       ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), 
                                       accessFlags,
                                       ::acdk::lang::dmi::ClazzInfo::getBoolClazz());
  return obj->getMember(ACDK_STACK_STR(_field->name), ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), 
                                       accessFlags,
                                       ::acdk::lang::dmi::ClazzInfo::getBoolClazz());
}

//virtual 
byte 
Field::getByte(IN(acdk::lang::Object) obj, int accessFlags)
{
  if (obj == Nil)
    return getStaticMember(_clazz, ACDK_STACK_STR(_field->name), 
                                       ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), 
                                       accessFlags,
                                       ::acdk::lang::dmi::ClazzInfo::getByteClazz());
  return obj->getMember(ACDK_STACK_STR(_field->name), ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), 
                                       accessFlags,
                                       ::acdk::lang::dmi::ClazzInfo::getByteClazz());
}

//virtual 
char 
Field::getChar(IN(acdk::lang::Object) obj, int accessFlags)
{
  if (obj == Nil)
    return getStaticMember(_clazz, ACDK_STACK_STR(_field->name), 
                                       ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), 
                                       accessFlags,
                                       ::acdk::lang::dmi::ClazzInfo::getCharClazz());
  return obj->getMember(ACDK_STACK_STR(_field->name), ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), 
                                       accessFlags,
                                       ::acdk::lang::dmi::ClazzInfo::getCharClazz());
}

//virtual 
ucchar 
Field::getUcChar(IN(acdk::lang::Object) obj, int accessFlags)
{
	if (obj == Nil)
    return getStaticMember(_clazz, ACDK_STACK_STR(_field->name), 
                                       ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), 
                                       accessFlags,
                                       ::acdk::lang::dmi::ClazzInfo::getUcCharClazz());
  return obj->getMember(ACDK_STACK_STR(_field->name), ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), 
                                       accessFlags,
                                       ::acdk::lang::dmi::ClazzInfo::getUcCharClazz());
}

//virtual 
RClass 
Field::getDeclaringClass()
{
  return Class::getSingeltonClass(_clazz);
}

//virtual 
double 
Field::getDouble(IN(acdk::lang::Object) obj, int accessFlags)
{
  if (obj == Nil)
    return getStaticMember(_clazz, ACDK_STACK_STR(_field->name), 
                                       ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), 
                                       accessFlags,
                                       ::acdk::lang::dmi::ClazzInfo::getDoubleClazz());
  return obj->getMember(ACDK_STACK_STR(_field->name), ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), 
                                       accessFlags,
                                       ::acdk::lang::dmi::ClazzInfo::getDoubleClazz());
}

//virtual 
float 
Field::getFloat(IN(acdk::lang::Object) obj, int accessFlags)
{
  if (obj == Nil)
    return getStaticMember(_clazz, ACDK_STACK_STR(_field->name), 
                                       ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), 
                                       accessFlags,
                                       ::acdk::lang::dmi::ClazzInfo::getFloatClazz());
  return obj->getMember(ACDK_STACK_STR(_field->name), ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), 
                                       accessFlags,
                                       ::acdk::lang::dmi::ClazzInfo::getFloatClazz());
}

//virtual 
int 
Field::getInt(IN(acdk::lang::Object) obj, int accessFlags)
{
  if (obj == Nil)
    return getStaticMember(_clazz, ACDK_STACK_STR(_field->name), 
                                       ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), 
                                       accessFlags,
                                       ::acdk::lang::dmi::ClazzInfo::getIntClazz());
  return obj->getMember(ACDK_STACK_STR(_field->name), ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), 
                                       accessFlags,
                                       ::acdk::lang::dmi::ClazzInfo::getIntClazz());
  
}

//virtual 
jlong 
Field::getLong(IN(acdk::lang::Object) obj, int accessFlags)
{
  if (obj == Nil)
    return getStaticMember(_clazz, ACDK_STACK_STR(_field->name), 
                                       ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), 
                                       accessFlags,
                                       ::acdk::lang::dmi::ClazzInfo::getLongClazz());
  return obj->getMember(ACDK_STACK_STR(_field->name), ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), 
                                       accessFlags,
                                       ::acdk::lang::dmi::ClazzInfo::getLongClazz());
}

//virtual 
int 
Field::getModifiers()
{
  return _field->flags;
}

//virtual 
RString 
Field::getName()
{
  return new String(_field->name);
}
 
//virtual 
short 
Field::getShort(IN(acdk::lang::Object) obj, int accessFlags)
{
  if (obj == Nil)
    return getStaticMember(_clazz, ACDK_STACK_STR(_field->name), 
                                       ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), 
                                       accessFlags,
                                       ::acdk::lang::dmi::ClazzInfo::getShortClazz());
  return obj->getMember(ACDK_STACK_STR(_field->name), ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), 
                                       accessFlags,
                                       ::acdk::lang::dmi::ClazzInfo::getShortClazz());
}


//virtual 
RClass 
Field::getType()
{
  return Class::getSingeltonClass(_field->type);
}
 
//virtual 
int 
Field::hashCode()
{
  return getType()->hashCode() ^ getName()->hashCode();
}

//virtual 
void 
Field::set(IN(acdk::lang::Object) obj, IN(acdk::lang::Object) value, int accessFlags)
{
  AcdkStdWeakTypeDmiClient dmiclient;
  if (obj == Nil)
  {
    setStaticMember(_clazz, _field->name, value, dmiclient, accessFlags);
    return;
  }
  obj->setMember(ACDK_STACK_STR(_field->name), value, dmiclient, accessFlags);
}

//virtual 
void 
Field::setBoolean(IN(acdk::lang::Object) obj, bool v, int accessFlags)
{
  if (obj == Nil)
  {
    setStaticMember(_clazz, _field, v, ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), accessFlags); // ### @todo accessFlags will be ignored
    return;
  }
  obj->setMember(ACDK_STACK_STR(_field->name), v, ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), accessFlags);

  
}

//virtual 
void 
Field::setByte(IN(acdk::lang::Object) obj, byte c, int accessFlags)
{
  if (obj == Nil)
  {
    setStaticMember(_clazz, _field, c, ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), accessFlags);
    return;
  }
  obj->setMember(ACDK_STACK_STR(_field->name), c, ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), accessFlags);
}


//virtual 
void 
Field::setChar(IN(acdk::lang::Object) obj, char c, int accessFlags)
{
  if (obj == Nil)
  {
    setStaticMember(_clazz, _field, c, ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), accessFlags);
    return;
  }
  obj->setMember(ACDK_STACK_STR(_field->name), c, ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), accessFlags);
}

//virtual 
void 
Field::setUcChar(IN(acdk::lang::Object) obj, ucchar c, int accessFlags)
{
  if (obj == Nil)
  {
    setStaticMember(_clazz, _field, c, ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), accessFlags);
    return;
  }
  obj->setMember(ACDK_STACK_STR(_field->name), c, ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), accessFlags);
}


//virtual 
void 
Field::setDouble(IN(acdk::lang::Object) obj, double d, int accessFlags)
{
  if (obj == Nil)
  {
    setStaticMember(_clazz, _field, d, ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), accessFlags);
    return;
  }
  obj->setMember(ACDK_STACK_STR(_field->name), d, ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), accessFlags);
}

//virtual 
void 
Field::setFloat(IN(acdk::lang::Object) obj, float v, int accessFlags)
{
  if (obj == Nil)
  {
    setStaticMember(_clazz, _field, v, ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), accessFlags);
    return;
  }
  obj->setMember(ACDK_STACK_STR(_field->name), v, ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), accessFlags);
}

//virtual 
void 
Field::setInt(IN(acdk::lang::Object) obj, int i, int accessFlags)
{
  if (obj == Nil)
  {
    setStaticMember(_clazz, _field, i, ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), accessFlags);
    return;
  }
  obj->setMember(ACDK_STACK_STR(_field->name), i, ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), accessFlags);
}

//virtual 
void 
Field::setLong(IN(acdk::lang::Object) obj, jlong l, int accessFlags)
{
  if (obj == Nil)
  {
    setStaticMember(_clazz, _field, l, ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), accessFlags);
    return;
  }
  obj->setMember(ACDK_STACK_STR(_field->name), l, ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), accessFlags);
}

//virtual 
void 
Field::setShort(IN(acdk::lang::Object) obj, short s, int accessFlags)
{
  if (obj == Nil)
  {
    setStaticMember(_clazz, _field, s, ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), accessFlags);
    return;
  }
  obj->setMember(ACDK_STACK_STR(_field->name), s, ::acdk::lang::dmi::AcdkDmiClient::getDmiClient(), accessFlags);
}

//virtual 
RString 
Field::toString()
{
  return const_cast<Field*>(this)->getType()->toString() + " " + getName();
}



} // reflect
} // lang
} // acdk