summaryrefslogtreecommitdiffstats
path: root/sdo-cpp/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/PropertyImpl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sdo-cpp/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/PropertyImpl.cpp')
-rw-r--r--sdo-cpp/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/PropertyImpl.cpp594
1 files changed, 594 insertions, 0 deletions
diff --git a/sdo-cpp/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/PropertyImpl.cpp b/sdo-cpp/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/PropertyImpl.cpp
new file mode 100644
index 0000000000..38997e421e
--- /dev/null
+++ b/sdo-cpp/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/PropertyImpl.cpp
@@ -0,0 +1,594 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/* $Rev$ $Date$ */
+
+#include "commonj/sdo/export.h"
+
+#include <iostream>
+using namespace std;
+
+
+#include "commonj/sdo/Sequence.h"
+#include "commonj/sdo/DataObject.h"
+#include "commonj/sdo/TypeList.h"
+
+#include "commonj/sdo/Type.h"
+#include "commonj/sdo/TypeImpl.h"
+#include "commonj/sdo/Property.h"
+#include "commonj/sdo/PropertyImpl.h"
+#include "commonj/sdo/DataFactoryImpl.h"
+#include "commonj/sdo/SDORuntimeException.h"
+
+namespace commonj{
+ namespace sdo{
+
+
+ Substitution::Substitution() : name(), type(0)
+ {
+ }
+
+ // Standard Constructor
+ Substitution::Substitution(DataFactoryPtr mdg,
+ const SDOString& inname,
+ const Type& intype) : name(inname)
+ {
+ DataFactory* f = (DataFactory*)mdg;
+
+ type = ((DataFactoryImpl*)f)->findType(intype.getURI(),intype.getName());
+ }
+
+ // Copy constructor
+ Substitution::Substitution(const Substitution& s) : name(s.name), type(s.type)
+ {
+ }
+
+ Substitution::~Substitution()
+ {
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////
+ // construction by DAS
+ ///////////////////////////////////////////////////////////////////////////
+
+ PropertyImpl::PropertyImpl(const Type& cont,
+ const char* inname,
+ const TypeImpl& intype,
+ bool many ,
+ bool ro ,
+ bool contain) :
+ containertype(cont),
+ type(intype),
+ defvalue(0),
+ defvaluelength(0),
+ opposite(0),
+ stringdef(0),
+ bisMany(many),
+ bisArray(false),
+ bisReadOnly(ro),
+ bisContainer(contain),
+ bDefaulted(false),
+ bisReference(false)
+ {
+ if (inname != 0)
+ {
+ name = inname;
+ }
+ else
+ {
+ name.erase();
+ }
+ if (contain == false && intype.isDataObjectType())
+ {
+ bisReference = true;
+ }
+ }
+
+ PropertyImpl::PropertyImpl(const Type& cont,
+ const SDOString& inname,
+ const TypeImpl& intype,
+ bool many,
+ bool ro,
+ bool contain) :
+ containertype(cont),
+ name(inname),
+ type(intype),
+ bisMany(many),
+ bisArray(false),
+ bisReadOnly(ro),
+ bisContainer(contain),
+ bDefaulted(false),
+ opposite(0),
+ stringdef(0),
+ defvalue(0),
+ defvaluelength(0),
+ bisReference(false)
+ {
+ if (contain == false && intype.isDataObjectType())
+ {
+ bisReference = true;
+ }
+ }
+
+ PropertyImpl::PropertyImpl(const PropertyImpl& p) :
+ type((*(p.getTypeImpl()))),
+ containertype(p.getContainingType()),
+ name(p.name),
+ bisMany(p.bisMany),
+ bisArray(false),
+ bisReadOnly(p.bisReadOnly),
+ bisContainer(p.bisContainer),
+ bDefaulted(false),
+ opposite(0),
+ defvalue(0),
+ defvaluelength(0),
+ stringdef(0),
+ bisReference(false)
+ {
+ if (bisContainer == false && type.isDataObjectType())
+ {
+ bisReference = true;
+ }
+ }
+
+ PropertyImpl::~PropertyImpl()
+ {
+ // If the default value is an array type then we must use delete[]
+ // otherwise delete
+ if (defvalue != 0)
+ {
+ if (bisArray)
+ {
+ delete[] defvalue;
+ }
+ else
+ {
+ delete defvalue;
+ }
+ }
+ if (stringdef != 0)
+ {
+ delete[] stringdef;
+ }
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Setting of attributes by DAS
+ ///////////////////////////////////////////////////////////////////////////
+
+ void PropertyImpl::setMany(bool many)
+ {
+ bisMany = many;
+ }
+
+ void PropertyImpl::setReadOnly(bool readonly)
+ {
+ bisReadOnly = readonly;
+ }
+
+ void PropertyImpl::setContainment(bool contains)
+ {
+ if (contains == true && type.isDataType())
+ {
+ return;
+ }
+ bisContainer = contains;
+ if (bisContainer == false && type.isDataObjectType())
+ {
+ bisReference = true;
+ }
+ else
+ {
+ bisReference = false;
+ }
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Setting of defaults by DAS
+ ///////////////////////////////////////////////////////////////////////////
+
+ void PropertyImpl::setDefault(bool b )
+ {
+ setDefaultBoolean(b);
+ }
+
+ void PropertyImpl::setDefault(char c )
+ {
+ setDefaultByte(c);
+ }
+
+ void PropertyImpl::setDefault(wchar_t c )
+ {
+ setDefaultCharacter(c);
+ }
+ void PropertyImpl::setDefault(char* c )
+ {
+ setDefaultCString(c);
+ }
+ void PropertyImpl::setDefault(const SDOString& c)
+ {
+ setDefaultCString(c);
+ }
+ void PropertyImpl::setDefault(short s )
+ {
+ setDefaultShort(s);
+ }
+#if __WORDSIZE !=64
+ void PropertyImpl::setDefault(long i )
+ {
+ setDefaultInteger(i);
+ }
+#endif
+ void PropertyImpl::setDefault(int64_t i )
+ {
+ setDefaultLong(i);
+ }
+ void PropertyImpl::setDefault(float f )
+ {
+ setDefaultFloat(f);
+ }
+ void PropertyImpl::setDefault(long double d )
+ {
+ setDefaultDouble(d);
+ }
+ void PropertyImpl::setDefault(const SDODate d )
+ {
+ setDefaultDate(d);
+ }
+ void PropertyImpl::setDefault(const char* c , unsigned int len)
+ {
+ setDefaultBytes(c, len);
+ }
+ void PropertyImpl::setDefault(const SDOString& c , unsigned int len)
+ {
+ setDefaultBytes(c, len);
+ }
+
+ void PropertyImpl::setDefault(const wchar_t* c, unsigned int len )
+ {
+ setDefaultString(c, len);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Substitution groups.
+ ///////////////////////////////////////////////////////////////////////////
+ const Type* PropertyImpl::getSubstitutionType(const char* inname) const
+ {
+ for (unsigned int i=0;i<substitutions.size();i++)
+ {
+ if (!strcmp(inname, substitutions[i].name.c_str()))
+ {
+ return substitutions[i].type;
+ }
+ }
+ return 0;
+ }
+
+ const char * PropertyImpl::getSubstitutionName(unsigned int index) const
+ {
+ if (index < getSubstitutionCount())
+ {
+ return (substitutions[index].name.c_str());
+ }
+ SDO_THROW_EXCEPTION("getSubstitutionName", SDOIndexOutOfRangeException,
+ "index out of range");
+ }
+
+ unsigned int PropertyImpl::getSubstitutionCount(void) const
+ {
+ return substitutions.size();
+ }
+
+ const Type* PropertyImpl::getSubstitutionType(unsigned int index) const
+ {
+ if (index < getSubstitutionCount())
+ {
+ return (substitutions[index].type);
+ }
+ return 0;
+ }
+
+ void PropertyImpl::setSubstitution(DataFactoryPtr mdg, const char* alias,
+ const Type& substype)
+ {
+ substitutions.push_back(Substitution(mdg,alias,substype));
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Returns the name of the property.
+ ///////////////////////////////////////////////////////////////////////////
+ const char* PropertyImpl::getName() const
+ {
+ return name.c_str();
+ }
+
+// const SDOString& PropertyImpl::getName() const
+// {
+// return name;
+// }
+
+ void PropertyImpl::setAlias(const char* alias)
+ {
+ char* tmp = new char[strlen(alias)+1];
+ strcpy(tmp,alias);
+ aliases.push_back(tmp);
+ }
+
+ void PropertyImpl::setAlias(const SDOString& alias)
+ {
+ aliases.push_back(alias);
+ }
+
+ const char* PropertyImpl::getAlias(unsigned int index) const
+ {
+ if (index < aliases.size())
+ {
+ return aliases[index].c_str();
+ }
+ return name.c_str();
+ }
+
+ unsigned int PropertyImpl::getAliasCount() const
+ {
+ return aliases.size();
+ }
+
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Returns the type of the property.
+ ///////////////////////////////////////////////////////////////////////////
+ const Type& PropertyImpl::getType() const
+ {
+ return (Type&)type;
+ }
+
+ const Type::Types PropertyImpl::getTypeEnum() const
+ {
+ return type.getTypeEnum();
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Returns the type of the property.
+ ///////////////////////////////////////////////////////////////////////////
+ const TypeImpl* PropertyImpl::getTypeImpl() const
+ {
+ return &type;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Returns whether the property is many-valued.
+ ///////////////////////////////////////////////////////////////////////////
+ bool PropertyImpl::isMany() const
+ {
+ if(getTypeImpl()->isFromList())return true;
+ return bisMany;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Returns whether the property is containment.
+ ///////////////////////////////////////////////////////////////////////////
+ bool PropertyImpl::isContainment() const
+ {
+ return bisContainer;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Returns whether the property is containment.
+ ///////////////////////////////////////////////////////////////////////////
+ bool PropertyImpl::isReference() const
+ {
+ return bisReference;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Returns the containing type of this property.
+ ///////////////////////////////////////////////////////////////////////////
+ const Type& PropertyImpl::getContainingType() const
+ {
+ return containertype;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Returns the opposite.
+ ///////////////////////////////////////////////////////////////////////////
+ const Property* PropertyImpl::getOpposite() const
+ {
+ return opposite;
+ }
+
+ void PropertyImpl::setOpposite(const Property* opp)
+ {
+ opposite = opp;
+ }
+ ///////////////////////////////////////////////////////////////////////////
+ // Returns the default value this property will have in a
+ // data object where the property hasn't been set.
+ ///////////////////////////////////////////////////////////////////////////
+
+ // check whether the property has a default first
+ bool PropertyImpl::isDefaulted() const
+ {
+ return bDefaulted;
+ }
+
+ const char* PropertyImpl::getCStringDefault() const
+ {
+ PropertyImpl* p = (PropertyImpl*)this;
+ return getTypeImpl()->convertToCString(defvalue, &(p->stringdef), defvaluelength);
+ }
+ bool PropertyImpl::getBooleanDefault() const
+ {
+ return getTypeImpl()->convertToBoolean(defvalue,defvaluelength);
+ }
+ char PropertyImpl::getByteDefault() const
+ {
+ return getTypeImpl()->convertToByte(defvalue,defvaluelength);
+ }
+ wchar_t PropertyImpl::getCharacterDefault() const
+ {
+ return getTypeImpl()->convertToCharacter(defvalue,defvaluelength);
+ }
+ short PropertyImpl::getShortDefault() const
+ {
+ return getTypeImpl()->convertToShort(defvalue,defvaluelength);
+ }
+ long PropertyImpl::getIntegerDefault() const
+ {
+ return getTypeImpl()->convertToInteger(defvalue,defvaluelength);
+ }
+ int64_t PropertyImpl::getLongDefault() const
+ {
+ return getTypeImpl()->convertToLong(defvalue,defvaluelength);
+ }
+ float PropertyImpl::getFloatDefault() const
+ {
+ return getTypeImpl()->convertToFloat(defvalue,defvaluelength);
+ }
+ long double PropertyImpl::getDoubleDefault() const
+ {
+ return getTypeImpl()->convertToDouble(defvalue,defvaluelength);
+ }
+ const SDODate PropertyImpl::getDateDefault() const
+ {
+ return getTypeImpl()->convertToDate(defvalue,defvaluelength);
+ }
+ unsigned int PropertyImpl::getStringDefault(wchar_t* val, unsigned int max) const
+ {
+ if (val == 0 || max == 0) return defvaluelength;
+ return getTypeImpl()->convertToString(defvalue, val, defvaluelength, max);
+
+ }
+ unsigned int PropertyImpl::getBytesDefault(char* val, unsigned int max) const
+ {
+ if (val == 0 || max == 0) return defvaluelength;
+ return getTypeImpl()->convertToBytes(defvalue, val, defvaluelength, max);
+ }
+
+ unsigned int PropertyImpl::getBytesDefault(SDOString& val, unsigned int max) const
+ {
+ if (max == 0) return defvaluelength;
+ return getTypeImpl()->convertToBytes(defvalue, val, defvaluelength, max);
+ }
+
+ unsigned int PropertyImpl::getDefaultLength() const
+ {
+ return defvaluelength;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // sets the default value by type
+ ///////////////////////////////////////////////////////////////////////////
+
+ void PropertyImpl::setDefaultCString(const char* s)
+ {
+ bDefaulted=true;
+ bisArray = true;
+ defvaluelength = getTypeImpl()->convert(&defvalue,s);
+ }
+ void PropertyImpl::setDefaultCString(const SDOString& s)
+ {
+ bDefaulted=true;
+ bisArray = true;
+ defvaluelength = getTypeImpl()->convert(&defvalue, s);
+ }
+ void PropertyImpl::setDefaultString( const wchar_t* c , unsigned int len )
+ {
+ bDefaulted=true;
+ bisArray = true;
+ defvaluelength = getTypeImpl()->convert(&defvalue,c, len);
+ }
+ void PropertyImpl::setDefaultBytes( const char* c , unsigned int len )
+ {
+ bDefaulted=true;
+ bisArray = true;
+ defvaluelength = getTypeImpl()->convert(&defvalue,c, len);
+ }
+ void PropertyImpl::setDefaultBytes(const SDOString& c , unsigned int len)
+ {
+ bDefaulted=true;
+ bisArray = true;
+ defvaluelength = getTypeImpl()->convert(&defvalue,c, len);
+ }
+ void PropertyImpl::setDefaultBoolean( const bool b )
+ {
+ bDefaulted=true;
+ defvaluelength = getTypeImpl()->convert(&defvalue,b);
+ }
+ void PropertyImpl::setDefaultByte( const char c )
+ {
+ bDefaulted=true;
+ defvaluelength = getTypeImpl()->convert(&defvalue,c);
+ }
+ void PropertyImpl::setDefaultCharacter( const wchar_t c)
+ {
+ bDefaulted=true;
+ defvaluelength = getTypeImpl()->convert(&defvalue,c);
+ }
+ void PropertyImpl::setDefaultShort( const short s )
+ {
+ bDefaulted=true;
+ defvaluelength = getTypeImpl()->convert(&defvalue,s);
+ }
+ void PropertyImpl::setDefaultInteger( const long i )
+ {
+ bDefaulted=true;
+#if __WORDSIZE ==64
+ defvaluelength = getTypeImpl()->convert(&defvalue,(int64_t)i);
+#else
+ defvaluelength = getTypeImpl()->convert(&defvalue,i);
+#endif
+ }
+ void PropertyImpl::setDefaultLong(const int64_t l)
+ {
+ bDefaulted=true;
+ defvaluelength = getTypeImpl()->convert(&defvalue,l);
+ }
+ void PropertyImpl::setDefaultFloat( const float f )
+ {
+ bDefaulted=true;
+ defvaluelength = getTypeImpl()->convert(&defvalue,f);
+ }
+ void PropertyImpl::setDefaultDouble( const long double d )
+ {
+ bDefaulted=true;
+ defvaluelength = getTypeImpl()->convert(&defvalue,d);
+ }
+ void PropertyImpl::setDefaultDate( const SDODate d )
+ {
+ bDefaulted=true;
+ defvaluelength = getTypeImpl()->convertDate(&defvalue,d);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Returns true if values for this Property cannot be modified using the SDO APIs.
+ // When true, DataObject.set(Property property, Object value) throws an exception.
+ // Values may change due to other factors, such as services operating on DataObjects.
+ ///////////////////////////////////////////////////////////////////////////
+ bool PropertyImpl::isReadOnly() const
+ {
+ return bisReadOnly;
+ }
+
+};
+};
+
+