summaryrefslogtreecommitdiffstats
path: root/sdo-cpp/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/DataFactoryImpl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sdo-cpp/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/DataFactoryImpl.cpp')
-rw-r--r--sdo-cpp/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/DataFactoryImpl.cpp2141
1 files changed, 2141 insertions, 0 deletions
diff --git a/sdo-cpp/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/DataFactoryImpl.cpp b/sdo-cpp/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/DataFactoryImpl.cpp
new file mode 100644
index 0000000000..4d1e3640c3
--- /dev/null
+++ b/sdo-cpp/branches/sdo-cpp-pre2.1/runtime/core/src/commonj/sdo/DataFactoryImpl.cpp
@@ -0,0 +1,2141 @@
+/*
+ * 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$ */
+
+//////////////////////////////////////////////////////////////////////
+// DataFactoryImpl.cpp: implementation of the DataFactory class.
+//
+//////////////////////////////////////////////////////////////////////
+#include "commonj/sdo/SDORuntimeException.h"
+
+#include "commonj/sdo/DataFactoryImpl.h"
+#include "commonj/sdo/DataObjectImpl.h"
+
+#include "commonj/sdo/Logger.h"
+
+#include "commonj/sdo/SDOUtils.h"
+
+#include "commonj/sdo/PropertyList.h"
+
+#include <iostream>
+#include <stdio.h>
+
+
+using namespace std;
+using namespace commonj::sdo;
+
+namespace commonj{
+namespace sdo {
+
+// ===================================================================
+// Constructor
+// ===================================================================
+DataFactoryImpl::DataFactoryImpl()
+{
+
+ /* add the primitives to every mdg - */
+
+ isResolved = false;
+ addType(Type::SDOTypeNamespaceURI,"BigDecimal");
+ addType(Type::SDOTypeNamespaceURI,"BigInteger");
+ addType(Type::SDOTypeNamespaceURI,"Boolean");
+
+ addType(Type::SDOTypeNamespaceURI,"Byte");
+ addType(Type::SDOTypeNamespaceURI,"Bytes");
+ addType(Type::SDOTypeNamespaceURI,"Character");
+
+ addType(Type::SDOTypeNamespaceURI,"String");
+ addType(Type::SDOTypeNamespaceURI,"DataObject");
+ addType(Type::SDOTypeNamespaceURI,"OpenDataObject", true, true, false, false);
+ addType(Type::SDOTypeNamespaceURI,"Date");
+ addType(Type::SDOTypeNamespaceURI,"Double");
+ addType(Type::SDOTypeNamespaceURI,"Float");
+ addType(Type::SDOTypeNamespaceURI,"Integer");
+ addType(Type::SDOTypeNamespaceURI,"Long");
+ addType(Type::SDOTypeNamespaceURI,"Short");
+ addType(Type::SDOTypeNamespaceURI,"URI");
+
+ // abstract
+ addType(Type::SDOTypeNamespaceURI,"ChangeSummary");
+
+}
+
+// ===================================================================
+// Destructor
+// ===================================================================
+DataFactoryImpl::~DataFactoryImpl()
+{
+
+ resolvePending.clear();
+
+ TYPES_MAP::iterator typeIter;
+ for (typeIter = types.begin() ; typeIter != types.end() ; ++typeIter)
+ {
+ if (strncmp((typeIter->first).c_str(),"ALIAS::", 7))
+ {
+ delete typeIter->second;
+ }
+ }
+}
+
+// ===================================================================
+// copy constructor
+// ===================================================================
+DataFactoryImpl::DataFactoryImpl(const DataFactoryImpl& inmdg)
+{
+ isResolved = false;
+ copyTypes(inmdg);
+}
+
+// ===================================================================
+// Assignment operator
+// ===================================================================
+DataFactoryImpl& DataFactoryImpl::operator=(const DataFactoryImpl& inmdg)
+{
+ if (this != &inmdg)
+ {
+ copyTypes(inmdg);
+ }
+ return *this;
+}
+
+// ===================================================================
+// copy Types to this DataFactory
+// ===================================================================
+void DataFactoryImpl::copyTypes(const DataFactoryImpl& inmdg)
+{
+
+
+ TYPES_MAP::const_iterator typeIter;
+ TYPES_MAP::iterator typeIter2;
+ SDOString fullTypeName;
+
+ for (typeIter = inmdg.types.begin() ; typeIter != inmdg.types.end() ; ++typeIter)
+ {
+ // add this type to this metadata
+ addType((typeIter->second)->getURI(), (typeIter->second)->getName());
+
+ // re-find the type we just added.
+ getFullTypeName(fullTypeName,
+ (typeIter->second)->getURI(),
+ (typeIter->second)->getName());
+ typeIter2 = types.find(fullTypeName);
+
+ // copy the aliases , if there are any.
+
+ if ((typeIter->second)->getAliasCount() > 0)
+ {
+ for (unsigned int j=0;j<(typeIter->second)->getAliasCount();j++)
+ {
+ (typeIter2->second)->setAlias(
+ (typeIter->second)->getAlias());
+ }
+ }
+
+
+ // Now add all the properties
+ const std::list<PropertyImpl*> props = typeIter->second->getPropertyListReference();
+
+ for (std::list<PropertyImpl*>::const_iterator i = props.begin();
+ i != props.end();
+ i++)
+ {
+ // Ensure the properties type is added
+ const Type& propType = (*i)->getType();
+ addType(propType.getURI(), propType.getName());
+
+ // Now add the property
+ addPropertyToType((typeIter->second)->getURI(),
+ (typeIter->second)->getName(),
+ (*i)->getName(),
+ propType.getURI(),
+ propType.getName(),
+ (*i)->isMany(),
+ (*i)->isReadOnly(),
+ (*i)->isContainment());
+
+ // copy the aliases if there are any.
+ if ((*i)->getAliasCount() > 0)
+ {
+
+ PropertyImpl* p = (typeIter2->second)->
+ getPropertyImpl((*i)->getName());
+ if (p != 0)
+ {
+ for (unsigned int j=0;j<p->getAliasCount();j++)
+ {
+ p->setAlias((*i)->getAlias(j));
+ }
+ }
+
+ }
+
+ } // end - iterate over Properties
+ } // end - iterate over Types
+}
+
+// ===================================================================
+// addType - adds a new Type if it does not already exist
+// ===================================================================
+void DataFactoryImpl::addType(const char* uri, const char* inTypeName,
+ bool isSeq,
+ bool isOp,
+ bool isAbs,
+ bool isData)
+{
+ addType(uri,inTypeName,isSeq,isOp,isAbs,isData,false);
+}
+
+void DataFactoryImpl::addType(const SDOString& uri, const SDOString& inTypeName,
+ bool isSeq,
+ bool isOp,
+ bool isAbs,
+ bool isData)
+{
+ addType(uri.c_str(),inTypeName.c_str(),isSeq,isOp,isAbs,isData,false);
+}
+
+bool empty(const char* inTypeName)
+{
+ return inTypeName == 0 || strlen(inTypeName) == 0;
+}
+void assertTypeName(const char* inTypeName, const char* function)
+{
+ if (empty(inTypeName))
+ {
+ SDO_THROW_EXCEPTION(function,
+ SDOIllegalArgumentException, " Type has empty name");
+ }
+}
+
+void DataFactoryImpl::addType(const char* uri, const char* inTypeName,
+ bool isSeq,
+ bool isOp,
+ bool isAbs,
+ bool isData,
+ bool isFromList)
+{
+ assertTypeName(inTypeName, "DataFactory::addType");
+
+ SDOString typeUri;
+
+ if (uri)
+ typeUri = uri;
+ if (findType(typeUri, inTypeName) == 0)
+ {
+ SDOString fullTypeName;
+ getFullTypeName(fullTypeName, uri, inTypeName);
+ types[fullTypeName] = new TypeImpl(uri, inTypeName, isSeq, isOp, isAbs, isData, isFromList);
+ resolvePending[fullTypeName] = types[fullTypeName];
+ }
+}
+
+void DataFactoryImpl::addType(const SDOString& uri, const SDOString& inTypeName,
+ bool isSeq,
+ bool isOp,
+ bool isAbs,
+ bool isData,
+ bool isFromList)
+{
+ addType(uri.c_str(), inTypeName.c_str(), isSeq, isOp, isAbs, isData, isFromList);
+}
+
+// ===================================================================
+// Check whether a change summary would clash.
+// ===================================================================
+
+bool DataFactoryImpl::recursiveCheck(TypeImpl* cs, TypeImpl* t)
+{
+ if (cs->isDataType()) return false;
+
+ if (! strcmp(cs->getName(), t->getName()) &&
+ ! strcmp(cs->getURI() , t->getURI()) )
+ {
+ return true;
+ }
+
+ const std::list<PropertyImpl*> pl = cs->getPropertyListReference();
+
+ for (std::list<PropertyImpl*>::const_iterator j = pl.begin();
+ j != pl.end();
+ j++)
+ {
+ if (recursiveCheck((TypeImpl*)&((*j)->getType()), t)) return true;
+ }
+ return false;
+}
+
+// ===================================================================
+// Check whether a change summary would clash.
+// ===================================================================
+bool DataFactoryImpl::checkForValidChangeSummary(TypeImpl* t)
+{
+ // None of the containing types can have a cs already.
+ // None of the properties of this type can hold a type
+ // which has a change summary.
+
+ if (t->isResolved)
+ {
+ SDO_THROW_EXCEPTION("DataFactory::checkForValidChangeSummary",
+ SDOUnsupportedOperationException, "Adding Change Summary after type completed");
+ }
+
+ if (cstypes.size() > 0) {
+ for (unsigned int i = 0 ;i < cstypes.size(); i++)
+ {
+ if (recursiveCheck(cstypes[i], t))
+ {
+ return false;
+
+ }
+ }
+ }
+ cstypes.push_back(t);
+ return true;
+}
+
+const char*const addPropertyToType = "DataFactory::addPropertyToType";
+void assertNames(const char* inTypeName, const char* propname)
+{
+ assertTypeName(inTypeName, addPropertyToType);
+ if (empty(propname))
+ {
+ SDO_THROW_EXCEPTION(addPropertyToType,
+ SDOIllegalArgumentException, " Property has an empty name");
+ }
+}
+
+// ===================================================================
+// addPropertyToType - adds a Property to an existing Type
+// ===================================================================
+void DataFactoryImpl::addPropertyToType(const char* uri,
+ const char* inTypeName,
+ const char* propname,
+ const char* propTypeUri,
+ const char* propTypeName,
+ bool many)
+{
+ assertNames(inTypeName, propname);
+ SDOString fullPropTypeName;
+ getFullTypeName(fullPropTypeName, propTypeUri, propTypeName);
+
+ TYPES_MAP::iterator typeIter;
+ typeIter = types.find(fullPropTypeName);
+ if (typeIter != types.end())
+ {
+ addPropertyToType(uri,inTypeName,
+ propname,
+ propTypeUri,
+ propTypeName,
+ many,
+ false,
+ !(typeIter->second)->isDataType());
+ }
+}
+
+void DataFactoryImpl::addPropertyToType(const SDOString& uri,
+ const SDOString& inTypeName,
+ const SDOString& propname,
+ const SDOString& propTypeUri,
+ const SDOString& propTypeName,
+ bool many)
+{
+ addPropertyToType(uri.c_str(), inTypeName.c_str(), propname.c_str(), propTypeUri.c_str(), propTypeName.c_str(), many);
+}
+
+void DataFactoryImpl::addPropertyToType(const char* uri,
+ const char* inTypeName,
+ const char* propname,
+ const char* propTypeUri,
+ const char* propTypeName,
+ bool many,
+ bool rdonly,
+ bool cont)
+{
+ assertNames(inTypeName, propname);
+
+ TYPES_MAP::iterator typeIter, typeIter2;
+
+ //cout << "Adding property " << propname << "(" << propTypeUri << "#" << propTypeName
+ // << ") to type " << uri << "#" << inTypeName << endl;
+
+
+ SDOString fullTypeName;
+ getFullTypeName(fullTypeName, uri, inTypeName);
+ typeIter = types.find(fullTypeName);
+
+ if(typeIter == types.end())
+ {
+ string msg("Type not found: ");
+ if (uri != 0)msg += uri;
+ msg += " ";
+ if (inTypeName != 0)msg += inTypeName;
+ SDO_THROW_EXCEPTION("addPropertyToType",
+ SDOTypeNotFoundException, msg.c_str());
+
+ }
+
+ if ((typeIter->second)->isDataType())
+ {
+ string msg("Cannot add property ");
+ msg += propname;
+ msg += " of type ";
+ msg += propTypeUri;
+ msg += "#";
+ msg += propTypeName;
+ msg += " to this data type ";
+ msg += uri;
+ msg += "#";
+ msg += inTypeName;
+ SDO_THROW_EXCEPTION("addPropertyToType",
+ SDOIllegalArgumentException, msg.c_str());
+ }
+
+ getFullTypeName(fullTypeName, propTypeUri, propTypeName);
+ typeIter2 = types.find(fullTypeName);
+
+ if (typeIter2 == types.end())
+ {
+ string msg("Type not found: ");
+ if (propTypeUri != 0)msg += propTypeUri;
+ msg += " ";
+ if (propTypeName != 0)msg += propTypeName;
+ SDO_THROW_EXCEPTION("addPropertyToType",
+ SDOTypeNotFoundException, msg.c_str());
+ }
+
+ // Check if its a ChangeSummary
+ if (propTypeUri != 0 && !strcmp(propTypeUri,Type::SDOTypeNamespaceURI.c_str()) &&
+ !strcmp(propTypeName,"ChangeSummary") )
+ {
+ if (checkForValidChangeSummary(typeIter->second))
+ {
+ // The change summary is allowable if we got to here - force the right params.
+ // we will not use this property - its just for compatibility.
+ // we have to use getChangeSummary to get the change summary,
+ // and isChangeSummaryType to see if this is a type which may have
+ // a change summary.
+ (typeIter->second)->addChangeSummary();
+ // dont even show the property - its not needed
+ //((typeIter->second)->addProperty(propname, *(typeIter2->second),false,true, false));
+
+ }
+ return;
+ }
+
+
+ if ((typeIter->second)->isDataType())
+ {
+ string msg("Cannot add property to a data type : ");
+ msg += (typeIter->second)->getName();
+ SDO_THROW_EXCEPTION("addPropertyToType",
+ SDOIllegalArgumentException, msg.c_str());
+ // cannot add a property to a primitive
+ }
+
+ // @PGR@ containment should be ignored for DataType
+/* if ((typeIter2->second)->isDataType() && cont == true)
+ {
+ string msg("Data types may not be containment : ");
+ msg += (typeIter2->second)->getName();
+ SDO_THROW_EXCEPTION("addPropertyToType",
+ SDOIllegalArgumentException, msg.c_str());
+ // cannot try to make a property containment on a data type
+ }
+*/
+
+ if ((typeIter->second)->isResolved)
+ {
+ SDO_THROW_EXCEPTION("DataFactory::addPropertyToType",
+ SDOUnsupportedOperationException, "Adding Properties after type completed");
+ }
+
+ ((typeIter->second)->addProperty(propname, *(typeIter2->second),many,rdonly, cont));
+ return;
+}
+
+void DataFactoryImpl::addPropertyToType(const SDOString& uri,
+ const SDOString& inTypeName,
+ const SDOString& propname,
+ const SDOString& propTypeUri,
+ const SDOString& propTypeName,
+ bool many,
+ bool rdonly,
+ bool cont)
+{
+ addPropertyToType(uri.c_str(),
+ inTypeName.c_str(),
+ propname.c_str(),
+ propTypeUri.c_str(),
+ propTypeName.c_str(),
+ many,
+ rdonly,
+ cont);
+}
+
+// ===================================================================
+// addPropertyToType - adds a Property to an existing Type
+// ===================================================================
+
+void DataFactoryImpl::addPropertyToType(const char* uri,
+ const char* inTypeName,
+ const char* propname,
+ const Type& tprop,
+ bool many)
+{
+ addPropertyToType(uri,
+ inTypeName,
+ propname,
+ tprop,
+ many,
+ false,
+ !tprop.isDataType());
+}
+
+void DataFactoryImpl::addPropertyToType(const SDOString& uri,
+ const SDOString& inTypeName,
+ const SDOString& propname,
+ const Type& tprop,
+ bool many)
+{
+ addPropertyToType(uri.c_str(),
+ inTypeName.c_str(),
+ propname.c_str(),
+ tprop,
+ many,
+ false,
+ !tprop.isDataType());
+}
+
+void DataFactoryImpl::addPropertyToType(const char* uri,
+ const char* inTypeName,
+ const char* propname,
+ const Type& tprop,
+ bool many,
+ bool rdonly,
+ bool cont)
+{
+ addPropertyToType(uri,
+ inTypeName,
+ propname,
+ tprop.getURI(),
+ tprop.getName(),
+ many,
+ rdonly, cont);
+}
+
+void DataFactoryImpl::addPropertyToType(const SDOString& uri,
+ const SDOString& inTypeName,
+ const SDOString& propname,
+ const Type& tprop,
+ bool many,
+ bool rdonly,
+ bool cont)
+{
+ addPropertyToType(uri.c_str(),
+ inTypeName.c_str(),
+ propname.c_str(),
+ tprop.getURI(),
+ tprop.getName(),
+ many,
+ rdonly,
+ cont);
+}
+
+// ===================================================================
+// addPropertyToType - adds a Property to an existing Type
+// ===================================================================
+void DataFactoryImpl::addPropertyToType(const Type& cont,
+ const char* propname,
+ const char* propTypeUri,
+ const char* propTypeName,
+ bool many)
+{
+ addPropertyToType(cont.getURI(),
+ cont.getName(),
+ propname,
+ propTypeUri,
+ propTypeName,
+ many);
+}
+
+void DataFactoryImpl::addPropertyToType(const Type& cont,
+ const SDOString& propname,
+ const SDOString& propTypeUri,
+ const SDOString& propTypeName,
+ bool many)
+{
+ addPropertyToType(cont.getURI(),
+ cont.getName(),
+ propname.c_str(),
+ propTypeUri.c_str(),
+ propTypeName.c_str(),
+ many);
+}
+
+void DataFactoryImpl::addPropertyToType(const Type& cont,
+ const char* propname,
+ const char* propTypeUri,
+ const char* propTypeName,
+ bool many,
+ bool rdonly,
+ bool contain)
+{
+ addPropertyToType(cont.getURI(),
+ cont.getName(),
+ propname,
+ propTypeUri,
+ propTypeName,
+ many,
+ rdonly,
+ contain);
+}
+
+void DataFactoryImpl::addPropertyToType(const Type& cont,
+ const SDOString& propname,
+ const SDOString& propTypeUri,
+ const SDOString& propTypeName,
+ bool many,
+ bool rdonly,
+ bool contain)
+{
+ addPropertyToType(cont.getURI(),
+ cont.getName(),
+ propname.c_str(),
+ propTypeUri.c_str(),
+ propTypeName.c_str(),
+ many,
+ rdonly,
+ contain);
+}
+
+// ===================================================================
+// addPropertyToType - adds a Property to an existing Type
+// ===================================================================
+void DataFactoryImpl::addPropertyToType(const Type& tp,
+ const char* propname,
+ const Type& tprop,
+ bool many)
+{
+ addPropertyToType(tp.getURI(),
+ tp.getName(),
+ propname,
+ tprop.getURI(),
+ tprop.getName(),
+ many);
+}
+
+void DataFactoryImpl::addPropertyToType(const Type& tp,
+ const SDOString& propname,
+ const Type& tprop,
+ bool many)
+{
+ addPropertyToType(tp.getURI(),
+ tp.getName(),
+ propname.c_str(),
+ tprop.getURI(),
+ tprop.getName(),
+ many);
+}
+
+void DataFactoryImpl::addPropertyToType(const Type& tp,
+ const char* propname,
+ const Type& tprop,
+ bool many,
+ bool rdonly,
+ bool cont)
+{
+ addPropertyToType(tp.getURI(),
+ tp.getName(),
+ propname,
+ tprop.getURI(),
+ tprop.getName(),
+ many,
+ rdonly,
+ cont);
+}
+
+void DataFactoryImpl::addPropertyToType(const Type& tp,
+ const SDOString& propname,
+ const Type& tprop,
+ bool many,
+ bool rdonly,
+ bool cont)
+{
+ addPropertyToType(tp.getURI(),
+ tp.getName(),
+ propname.c_str(),
+ tprop.getURI(),
+ tprop.getName(),
+ many,
+ rdonly,
+ cont);
+}
+
+// ===================================================================
+// getFullTypeName - return the name used as a key in the types map
+// ===================================================================
+SDOString& DataFactoryImpl::getFullTypeName(SDOString& stringBuffer, const SDOString& uri, const SDOString& inTypeName)
+{
+ stringBuffer = uri;
+ stringBuffer += "#";
+ stringBuffer += inTypeName;
+ return stringBuffer;
+}
+
+// ===================================================================
+// getAliasTypeName - return the name used as a key in the types map
+// ===================================================================
+SDOString& DataFactoryImpl::getAliasTypeName(SDOString& stringBuffer, const SDOString& uri, const SDOString& inTypeName)
+{
+ getFullTypeName(stringBuffer, uri, inTypeName);
+ stringBuffer.insert(0, "ALIAS::");
+ return stringBuffer;
+}
+
+// ===================================================================
+// getType - return a pointer to the required Type
+// ===================================================================
+const Type& DataFactoryImpl::getType(const char* uri, const char* inTypeName) const
+{
+
+ const Type* type = findType(uri, inTypeName);
+
+ if (type == 0)
+ {
+ string msg("Type not found :");
+ if (uri != 0) msg += uri;
+ msg += " ";
+ if (inTypeName != 0) msg += inTypeName;
+ SDO_THROW_EXCEPTION("getType" ,
+ SDOTypeNotFoundException, msg.c_str());
+ }
+
+ return *type;
+}
+
+const Type& DataFactoryImpl::getType(const SDOString& uri, const SDOString& inTypeName) const
+{
+ return getType(uri.c_str(), inTypeName.c_str());
+}
+
+// ===================================================================
+// setBaseType - sets the type from which this type inherits properties
+// ===================================================================
+
+void DataFactoryImpl::setBaseType( const Type& type,
+ const Type& base, bool isRestriction)
+{
+ setBaseType(type.getURI(),type.getName(),base.getURI(), base.getName(),
+ isRestriction);
+}
+
+// ===================================================================
+// setBaseType - sets the type from which this type inherits properties
+// ===================================================================
+
+void DataFactoryImpl::setBaseType( const char* typeuri,
+ const char* typenam,
+ const char* baseuri,
+ const char* basename,
+ bool isRestriction )
+{
+ const TypeImpl* base = findTypeImpl(baseuri, basename);
+ if (base == 0)
+ {
+ string msg("Type not found :");
+ if (baseuri != 0) msg += baseuri;
+ msg += " ";
+ if (basename != 0) msg += basename;
+ SDO_THROW_EXCEPTION("setBaseType" ,
+ SDOTypeNotFoundException, msg.c_str());
+ }
+
+ TYPES_MAP::const_iterator typeIter;
+
+ SDOString fullTypeName;
+ getFullTypeName(fullTypeName, typeuri, typenam);
+ typeIter = types.find(fullTypeName);
+
+ if(typeIter == types.end())
+ {
+ string msg("Type not found :");
+ if (typeuri != 0) msg += typeuri;
+ msg += " ";
+ if (typenam != 0) msg += typenam;
+ SDO_THROW_EXCEPTION("setBaseType" ,
+ SDOTypeNotFoundException, msg.c_str());
+ }
+
+ (typeIter->second)->setBaseType(base, isRestriction);
+}
+
+void DataFactoryImpl::setBaseType(const SDOString& typeuri,
+ const SDOString& typenam,
+ const SDOString& baseuri,
+ const SDOString& basename,
+ bool isRestriction)
+{
+ setBaseType(typeuri.c_str(),
+ typenam.c_str(),
+ baseuri.c_str(),
+ basename.c_str(),
+ isRestriction);
+}
+
+
+// ===================================================================
+// setPropertySubstitute - additional type for a property
+// ===================================================================
+
+ void DataFactoryImpl::setPropertySubstitute(
+ const char* uri,
+ const char* inTypeName,
+ const char* propname,
+ const char* subname,
+ const char* subTypeUri,
+ const char* subTypeName)
+ {
+ const TypeImpl* cont = findTypeImpl(uri, inTypeName);
+ if (cont == 0)
+ {
+ string msg("Type not found :");
+ if (uri != 0) msg += uri;
+ msg += " ";
+ if (inTypeName != 0) msg += inTypeName;
+ SDO_THROW_EXCEPTION("setPropertySubstitute" ,
+ SDOTypeNotFoundException, msg.c_str());
+ }
+ PropertyImpl* pi = cont->getPropertyImpl(propname);
+ const Type& tsub = getType(subTypeUri,
+ subTypeName);
+ if (pi != 0)pi->setSubstitution(this,subname,tsub);
+ }
+
+ void DataFactoryImpl::setPropertySubstitute(
+ const SDOString& uri,
+ const SDOString& inTypeName,
+ const SDOString& propname,
+ const SDOString& subname,
+ const SDOString& subTypeUri,
+ const SDOString& subTypeName)
+ {
+ setPropertySubstitute(uri.c_str(),
+ inTypeName.c_str(),
+ propname.c_str(),
+ subname.c_str(),
+ subTypeUri.c_str(),
+ subTypeName.c_str());
+ }
+
+ void DataFactoryImpl::setPropertySubstitute(
+ const Type& containertype,
+ const char* propname,
+ const char* subname,
+ const Type& subtype)
+ {
+ setPropertySubstitute(
+ containertype.getURI(),
+ containertype.getName(),
+ propname,subname,
+ subtype.getURI(),subtype.getName());
+ }
+
+ void DataFactoryImpl::setPropertySubstitute(
+ const Type& containertype,
+ const SDOString& propname,
+ const SDOString& subname,
+ const Type& subtype)
+ {
+ setPropertySubstitute(containertype, propname.c_str(), subname.c_str(), subtype);
+ }
+// ===================================================================
+// setDefault - sets the default value for a property of a type
+// ===================================================================
+
+ void DataFactoryImpl::setDefault(
+ const Type& t, const char* propname, bool b )
+ {
+ setDefault(t.getURI(), t.getName(), propname, b);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const Type& t, const SDOString& propname, bool b )
+ {
+ setDefault(t.getURI(), t.getName(), propname.c_str(), b);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const Type& t, const char* propname , char c)
+
+ {
+ setDefault(t.getURI(), t.getName(), propname, c);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const Type& t, const SDOString& propname , char c)
+
+ {
+ setDefault(t.getURI(), t.getName(), propname.c_str(), c);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const Type& t, const char* propname , wchar_t c)
+ {
+ setDefault(t.getURI(), t.getName(), propname, c);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const Type& t, const SDOString& propname , wchar_t c)
+ {
+ setDefault(t.getURI(), t.getName(), propname.c_str(), c);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const Type& t, const char* propname , char* c)
+ {
+ setDefault(t.getURI(), t.getName(), propname, c);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const Type& t, const SDOString& propname , SDOString& outstr)
+ {
+ setDefault(t.getURI(), t.getName(), propname, outstr);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const Type& t, const char* propname , short s)
+ {
+ setDefault(t.getURI(), t.getName(), propname, s);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const Type& t, const SDOString& propname , short s)
+ {
+ setDefault(t.getURI(), t.getName(), propname.c_str(), s);
+ }
+
+#if __WORDSIZE !=64
+ void DataFactoryImpl::setDefault(
+ const Type& t, const char* propname , long l)
+ {
+ setDefault(t.getURI(), t.getName(), propname, l);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const Type& t, const SDOString& propname , long l)
+ {
+ setDefault(t.getURI(), t.getName(), propname.c_str(), l);
+ }
+
+#endif
+
+ void DataFactoryImpl::setDefault(
+ const Type& t, const char* propname , int64_t i)
+ {
+ setDefault(t.getURI(), t.getName(), propname, i);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const Type& t, const SDOString& propname , int64_t i)
+ {
+ setDefault(t.getURI(), t.getName(), propname.c_str(), i);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const Type& t, const char* propname , float f)
+ {
+ setDefault(t.getURI(), t.getName(), propname, f);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const Type& t, const SDOString& propname , float f)
+ {
+ setDefault(t.getURI(), t.getName(), propname.c_str(), f);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const Type& t, const char* propname , long double d)
+ {
+ setDefault(t.getURI(), t.getName(), propname, d);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const Type& t, const SDOString& propname , long double d)
+ {
+ setDefault(t.getURI(), t.getName(), propname.c_str(), d);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const Type& t, const char* propname , const SDODate d)
+ {
+ setDefault(t.getURI(), t.getName(), propname, d);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const Type& t, const SDOString& propname , const SDODate d)
+ {
+ setDefault(t.getURI(), t.getName(), propname.c_str(), d);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const Type& t, const char* propname , const wchar_t* c, unsigned int len)
+ {
+ setDefault(t.getURI(), t.getName(), propname, c, len);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const Type& t, const SDOString& propname , const wchar_t* c, unsigned int len)
+ {
+ setDefault(t.getURI(), t.getName(), propname.c_str(), c, len);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const Type& t, const char* propname , const char* c, unsigned int len)
+ {
+ setDefault(t.getURI(), t.getName(), propname, c, len);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const Type& t, const SDOString& propname , const SDOString& c, unsigned int len)
+ {
+ setDefault(t.getURI(), t.getName(), propname.c_str(), c.c_str(), len);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const char* typuri, const char* typnam,
+ const char* propname, bool b )
+ {
+ const TypeImpl* ti = findTypeImpl(typuri,typnam);
+ PropertyImpl* pi = ti->getPropertyImpl(propname);
+ if (pi != 0)pi->setDefault(b);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const SDOString& typuri, const SDOString& typnam,
+ const SDOString& propname, bool b )
+ {
+ setDefault(typuri.c_str(), typnam.c_str(), propname.c_str(), b);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const char* typuri, const char* typnam,
+ const char* propname , char c)
+ {
+ const TypeImpl* ti = findTypeImpl(typuri,typnam);
+ PropertyImpl* pi = ti->getPropertyImpl(propname);
+ if (pi != 0)pi->setDefault(c);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const SDOString& typuri, const SDOString& typnam,
+ const SDOString& propname , char c)
+ {
+ setDefault(typuri.c_str(), typnam.c_str(), propname.c_str(), c);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const char* typuri, const char* typnam,
+ const char* propname , wchar_t c)
+ {
+ const TypeImpl* ti = findTypeImpl(typuri,typnam);
+ PropertyImpl* pi = ti->getPropertyImpl(propname);
+ if (pi != 0)pi->setDefault(c);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const SDOString& typuri, const SDOString& typnam,
+ const SDOString& propname , wchar_t c)
+ {
+ setDefault(typuri.c_str(), typnam.c_str(), propname.c_str(), c);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const char* typuri, const char* typnam,
+ const char* propname , char* c)
+ {
+ const TypeImpl* ti = findTypeImpl(typuri,typnam);
+ PropertyImpl* pi = ti->getPropertyImpl(propname);
+ if (pi != 0)pi->setDefault(c);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const SDOString& typuri, const SDOString& typnam,
+ const SDOString& propname , SDOString& c)
+ {
+ const TypeImpl* ti = findTypeImpl(typuri, typnam);
+ PropertyImpl* pi = ti->getPropertyImpl(propname);
+ if (pi != 0)pi->setDefault(c);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const char* typuri, const char* typnam,
+ const char* propname , short s)
+ {
+ const TypeImpl* ti = findTypeImpl(typuri,typnam);
+ PropertyImpl* pi = ti->getPropertyImpl(propname);
+ if (pi != 0)pi->setDefault(s);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const SDOString& typuri, const SDOString& typnam,
+ const SDOString& propname , short s)
+ {
+ setDefault(typuri.c_str(), typnam.c_str(), propname.c_str(), s);
+ }
+
+#if __WORDSIZE !=64
+ void DataFactoryImpl::setDefault(
+ const char* typuri, const char* typnam,
+ const char* propname , long l)
+ {
+ const TypeImpl* ti = findTypeImpl(typuri,typnam);
+ PropertyImpl* pi = ti->getPropertyImpl(propname);
+ if (pi != 0)pi->setDefault(l);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const SDOString& typuri, const SDOString& typnam,
+ const SDOString& propname , long l)
+ {
+ setDefault(typuri.c_str(), typnam.c_str(), propname.c_str(), l);
+ }
+
+#endif
+
+ void DataFactoryImpl::setDefault(
+ const char* typuri, const char* typnam,
+ const char* propname , int64_t i)
+ {
+ const TypeImpl* ti = findTypeImpl(typuri,typnam);
+ PropertyImpl* pi = ti->getPropertyImpl(propname);
+ if (pi != 0)pi->setDefault(i);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const SDOString& typuri, const SDOString& typnam,
+ const SDOString& propname , int64_t i)
+ {
+ setDefault(typuri.c_str(), typnam.c_str(), propname.c_str(), i);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const char* typuri, const char* typnam,
+ const char* propname , float f)
+ {
+ const TypeImpl* ti = findTypeImpl(typuri,typnam);
+ PropertyImpl* pi = ti->getPropertyImpl(propname);
+ if (pi != 0)pi->setDefault(f);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const SDOString& typuri, const SDOString& typnam,
+ const SDOString& propname , float f)
+ {
+ setDefault(typuri.c_str(), typnam.c_str(), propname.c_str(), f);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const char* typuri, const char* typnam,
+ const char* propname , long double d)
+ {
+ const TypeImpl* ti = findTypeImpl(typuri,typnam);
+ PropertyImpl* pi = ti->getPropertyImpl(propname);
+ if (pi != 0)pi->setDefault(d);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const SDOString& typuri, const SDOString& typnam,
+ const SDOString& propname , long double d)
+ {
+ setDefault(typuri.c_str(), typnam.c_str(), propname.c_str(), d);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const char* typuri, const char* typnam,
+ const char* propname , const SDODate d)
+ {
+ const TypeImpl* ti = findTypeImpl(typuri,typnam);
+ PropertyImpl* pi = ti->getPropertyImpl(propname);
+ if (pi != 0)pi->setDefault(d);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const SDOString& typuri, const SDOString& typnam,
+ const SDOString& propname , const SDODate d)
+ {
+ setDefault(typuri.c_str(), typnam.c_str(), propname.c_str(), d);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const char* typuri, const char* typnam,
+ const char* propname , const wchar_t* c, unsigned int len)
+ {
+ const TypeImpl* ti = findTypeImpl(typuri,typnam);
+ PropertyImpl* pi = ti->getPropertyImpl(propname);
+ if (pi != 0)pi->setDefault(c,len);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const SDOString& typuri, const SDOString& typnam,
+ const SDOString& propname , const wchar_t* c, unsigned int len)
+ {
+ setDefault(typuri.c_str(), typnam.c_str(), propname.c_str(), c, len);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const char* typuri, const char* typnam,
+ const char* propname , const char* c, unsigned int len)
+ {
+ const TypeImpl* ti = findTypeImpl(typuri,typnam);
+ PropertyImpl* pi = ti->getPropertyImpl(propname);
+ if (pi != 0)pi->setDefault(c,len);
+ }
+
+ void DataFactoryImpl::setDefault(
+ const SDOString& typuri, const SDOString& typnam,
+ const SDOString& propname , const SDOString& c, unsigned int len)
+ {
+ setDefault(typuri.c_str(), typnam.c_str(), propname.c_str(), c.c_str(), len);
+ }
+
+ void DataFactoryImpl::setOpposite(
+ const Type& typ,
+ const char* propnam,
+ const Type& opptyp,
+ const char* opppropnam)
+ {
+ SDO_THROW_EXCEPTION("setOpposite" ,
+ SDOUnsupportedOperationException, " Not implemented");
+ }
+
+ void DataFactoryImpl::setOpposite(
+ const Type& typ,
+ const SDOString& propnam,
+ const Type& opptyp,
+ const SDOString& opppropnam)
+ {
+ setOpposite(typ, propnam.c_str(), opptyp, opppropnam.c_str());
+ }
+
+// ===================================================================
+// getTypeImpl - return a pointer to the required TypeImpl
+// ===================================================================
+const TypeImpl& DataFactoryImpl::getTypeImpl(const SDOString& uri, const SDOString& inTypeName) const
+{
+ const TypeImpl* type = findTypeImpl(uri, inTypeName);
+
+ if (type == 0)
+ {
+ string msg("Type not found :");
+ msg += uri + " " + inTypeName;
+ SDO_THROW_EXCEPTION("getTypeImpl" ,
+ SDOTypeNotFoundException, msg.c_str());
+ }
+
+ return *type;;
+}
+
+// ===================================================================
+// findType
+// ===================================================================
+const Type* DataFactoryImpl::findType(const SDOString uri, const SDOString inTypeName) const
+{
+ return (Type*) findTypeImpl(uri, inTypeName);
+}
+
+// ===================================================================
+// findTypeImpl
+// ===================================================================
+
+const TypeImpl* DataFactoryImpl::findTypeImpl(const SDOString& uri, const SDOString& inTypeName) const
+{
+ SDOString fullTypeName;
+ getFullTypeName(fullTypeName, uri, inTypeName);
+ TYPES_MAP::const_iterator typeIter;
+ typeIter = types.find(fullTypeName);
+ if(typeIter != types.end())
+ {
+ return typeIter->second;
+ }
+ else
+ {
+ // try alias names
+ getAliasTypeName(fullTypeName, uri, inTypeName);
+ typeIter = types.find(fullTypeName);
+ if(typeIter != types.end())
+ {
+ return typeIter->second;
+ }
+ }
+ return 0;
+}
+
+// ===================================================================
+// setAlias - sets a new alias for this type
+// ===================================================================
+
+void DataFactoryImpl::setAlias(const char* typeuri,
+ const char* typenam,
+ const char* alias)
+{
+
+ SDOString fullTypeName;
+ getFullTypeName(fullTypeName, typeuri, typenam);
+ TYPES_MAP::iterator typeIter;
+ typeIter = types.find(fullTypeName);
+ if(typeIter != types.end())
+ {
+ (typeIter->second)->setAlias(alias);
+ getAliasTypeName(fullTypeName, typeuri, alias);
+ types[fullTypeName] = typeIter->second;
+ }
+
+}
+
+void DataFactoryImpl::setAlias(const SDOString& typeuri,
+ const SDOString& typenam,
+ const SDOString& alias)
+{
+ setAlias(typeuri.c_str(), typenam.c_str(), alias.c_str());
+}
+
+// ===================================================================
+// setAlias - sets a new alias for this type
+// ===================================================================
+
+void DataFactoryImpl::setAlias(const char* typeuri,
+ const char* typenam,
+ const char* propname,
+ const char* alias)
+{
+ const TypeImpl& t = getTypeImpl(typeuri, typenam);
+ PropertyImpl* p = t.getPropertyImpl(propname);
+ if (p != 0)p->setAlias(alias);
+
+}
+
+void DataFactoryImpl::setAlias(const SDOString& typeuri,
+ const SDOString& typenam,
+ const SDOString& propname,
+ const SDOString& alias)
+{
+ setAlias(typeuri.c_str(), typenam.c_str(), propname.c_str(), alias.c_str());
+}
+
+// ===================================================================
+// getTypes - gets the full list of types for this factory
+// ===================================================================
+
+TypeList DataFactoryImpl::getTypes() const
+{
+ TYPES_MAP::const_iterator typeIter;
+
+
+ std::vector<const Type*> typeVector;
+
+ for (typeIter = types.begin() ; typeIter != types.end();
+ ++typeIter) {
+ if (strncmp((typeIter->first).c_str(),"ALIAS::", 7)) {
+ typeVector.insert(typeVector.end(),typeIter->second);
+ }
+ }
+
+
+ return typeVector;
+}
+
+
+// ===================================================================
+// resolve - resolves the type and includes all the properties from
+// the supertype. After this has been called, no further changes
+// to the type hierarchy are allowed.
+// ===================================================================
+
+void DataFactoryImpl::resolve()
+{
+
+ TYPES_MAP::iterator typeIter;
+ for (typeIter = resolvePending.begin() ; typeIter != resolvePending.end();
+ ++typeIter)
+ {
+ (typeIter->second)->initCompoundProperties();
+ (typeIter->second)->validateChangeSummary();
+ }
+ // Need to empty the resolvePending set.
+ resolvePending.clear();
+
+}
+
+// ===================================================================
+// create - creates a data object from the types available.
+// This first resolves the type hierarchy, and thus no further changes
+// to the type hierarchy are allowed.
+// ===================================================================
+
+
+RefCountingPointer<DataObject> DataFactoryImpl::create(const char* uri, const char* typeName)
+{
+
+// New types can always be added now, so if there are any that haven't been
+// resolved, do them now. The isResolved boolean is superseded by the
+// resolvePending set being non-empty.
+
+ if (!resolvePending.empty())
+ {
+ // Allow creation of types and properties before resolve.
+ if (uri != 0 && !strcmp(uri,Type::SDOTypeNamespaceURI.c_str())) {
+ if (!strcmp(typeName,"Type") || !strcmp(typeName,"Property"))
+ {
+ DataObject* dob = (DataObject*)(new DataObjectImpl(this, getTypeImpl(uri, typeName)));
+ return dob;
+ }
+ }
+ resolve();
+ }
+
+ const TypeImpl* ti = findTypeImpl(uri,typeName);
+ if (ti == 0)
+ {
+ string msg("Instantiation of unknown type :");
+ if (uri != 0) msg += uri;
+ msg += " ";
+ if (typeName != 0)msg += typeName;
+ SDO_THROW_EXCEPTION("create" ,
+ SDOTypeNotFoundException, msg.c_str());
+ }
+
+ if (ti->isAbstractType())
+ {
+ string msg("Instantiation of abstract type :");
+ if (uri != 0)msg += uri;
+ msg += " ";
+ if (typeName != 0)msg += typeName;
+ SDO_THROW_EXCEPTION("create" ,
+ SDOUnsupportedOperationException, msg.c_str());
+ }
+
+ DataObject* dob = (DataObject*)(new DataObjectImpl(this, getTypeImpl(uri, typeName)));
+ return dob;
+}
+
+// ===================================================================
+// create - creates a data object from the types available.
+// This first resolves the type hierarchy, and thus no further changes
+// to the type hierarchy are allowed.
+// ===================================================================
+
+
+RefCountingPointer<DataObject> DataFactoryImpl::create(const SDOString& uri, const SDOString& typeName)
+{
+ return create(uri.c_str(), typeName.c_str());
+}
+
+// ===================================================================
+// The openProperties map is a list of the curently present open
+// properties as used by this factory. It will cause the
+// open properties to be written out as attributes and elements
+// of the root data object when a graph is serialized.
+// ===================================================================
+ const propertyMap& DataFactoryImpl::getOpenProperties()
+ {
+ return openProperties;
+ }
+
+ void DataFactoryImpl::addOpenProperty(const PropertyImpl& prop)
+ {
+ propertyMap::iterator i;
+ while ((i = openProperties.find(prop.getName())) !=
+ openProperties.end())
+ {
+ openProperties.erase(i);
+ }
+ openProperties.insert(make_pair(prop.getName(),prop));
+ }
+
+ void DataFactoryImpl::removeOpenProperty(const SDOString& name)
+ {
+ propertyMap::iterator i =
+ openProperties.find(name.c_str());
+ if (i != openProperties.end())
+ {
+ openProperties.erase(i);
+ }
+ }
+
+
+// ===================================================================
+// create - creates a data object from the types available.
+// This first resolves the type hierarchy, and thus no further changes
+// to the type hierarchy are allowed.
+// ===================================================================
+
+RefCountingPointer<DataObject> DataFactoryImpl::create(const Type& type)
+{
+ return create( type.getURI(), type.getName());
+}
+
+
+// ===================================================================
+// setDASValue - Set a value on a Type
+// ===================================================================
+void DataFactoryImpl::setDASValue(const Type& type,
+ const char* name,
+ DASValue* value)
+{
+ setDASValue(type.getURI(), type.getName(), name, value);
+}
+
+void DataFactoryImpl::setDASValue(const Type& type,
+ const SDOString& name,
+ DASValue* value)
+{
+ setDASValue(type.getURI(), type.getName(), name.c_str(), value);
+}
+
+void DataFactoryImpl::setDASValue(const char* typeuri,
+ const char* typenam,
+ const char* name,
+ DASValue* value)
+{
+ TypeImpl* type = (TypeImpl*)findTypeImpl(typeuri, typenam);
+ if (type != NULL)
+ {
+ type->setDASValue(name, value);
+ }
+}
+
+void DataFactoryImpl::setDASValue(const SDOString& typeuri,
+ const SDOString& typenam,
+ const SDOString& name,
+ DASValue* value)
+{
+ setDASValue(typeuri.c_str(), typenam.c_str(), name.c_str(), value);
+}
+
+// ===================================================================
+// getDASValue - retrieve a value from a Type
+// ===================================================================
+
+DASValue* DataFactoryImpl::getDASValue(const Type& type,
+ const char* name) const
+{
+ return getDASValue(type.getURI(), type.getName(), name);
+}
+
+DASValue* DataFactoryImpl::getDASValue(const Type& type,
+ const SDOString& name) const
+{
+ return getDASValue(type.getURI(), type.getName(), name.c_str());
+}
+
+DASValue* DataFactoryImpl::getDASValue(const char* typeuri,
+ const char* typenam,
+ const char* name) const
+{
+ TypeImpl* type = (TypeImpl*)findTypeImpl(typeuri, typenam);
+ if (type != NULL)
+ {
+ return type->getDASValue(name);
+ }
+
+ return NULL;
+}
+
+DASValue* DataFactoryImpl::getDASValue(const SDOString& typeuri,
+ const SDOString& typenam,
+ const SDOString& name) const
+{
+ return getDASValue(typeuri.c_str(), typenam.c_str(), name.c_str());
+}
+
+// ===================================================================
+// setDASValue - Set a value on a Property
+// ===================================================================
+void DataFactoryImpl::setDASValue(
+ const Type& type,
+ const char* propertyName,
+ const char* name,
+ DASValue* value)
+{
+ setDASValue(type.getURI(), type.getName(), propertyName, name, value);
+}
+
+void DataFactoryImpl::setDASValue(
+ const Type& type,
+ const SDOString& propertyName,
+ const SDOString& name,
+ DASValue* value)
+{
+ setDASValue(type.getURI(), type.getName(), propertyName.c_str(), name.c_str(), value);
+}
+
+void DataFactoryImpl::setDASValue(
+ const char* typeuri,
+ const char* typenam,
+ const char* propertyName,
+ const char* name,
+ DASValue* value)
+{
+ const TypeImpl* type = findTypeImpl(typeuri, typenam);
+ if (type != NULL)
+ {
+ PropertyImpl* prop = type->getPropertyImplPure(propertyName);
+ if (prop != 0)prop->setDASValue(name, value);
+ }
+}
+
+void DataFactoryImpl::setDASValue(
+ const SDOString& typeuri,
+ const SDOString& typenam,
+ const SDOString& propertyName,
+ const SDOString& name,
+ DASValue* value)
+{
+ setDASValue(typeuri.c_str(), typenam.c_str(), propertyName.c_str(), name.c_str(), value);
+}
+
+// ===================================================================
+// getDASValue - retrieve a value from a Property
+// ===================================================================
+DASValue* DataFactoryImpl::getDASValue(
+ const Type& type,
+ const char* propertyName,
+ const char* name) const
+{
+ return getDASValue(type.getURI(), type.getName(), propertyName, name);
+}
+
+DASValue* DataFactoryImpl::getDASValue(
+ const Type& type,
+ const SDOString& propertyName,
+ const SDOString& name) const
+{
+ return getDASValue(type.getURI(), type.getName(), propertyName.c_str(), name.c_str());
+}
+
+DASValue* DataFactoryImpl::getDASValue(
+ const char* typeuri,
+ const char* typenam,
+ const char* propertyName,
+ const char* name) const
+{
+ const TypeImpl* type = findTypeImpl(typeuri, typenam);
+ if (type != NULL)
+ {
+ try
+ {
+ PropertyImpl* prop = type->getPropertyImpl(propertyName);
+ if (prop != 0)return prop->getDASValue(name);
+ }
+ catch (const SDOPropertyNotFoundException&)
+ {
+ // Ignore - return null
+ }
+ }
+
+ return NULL;
+}
+
+DASValue* DataFactoryImpl::getDASValue(
+ const SDOString& typeuri,
+ const SDOString& typenam,
+ const SDOString& propertyName,
+ const SDOString& name) const
+{
+ return getDASValue(typeuri.c_str(), typenam.c_str(), propertyName.c_str(), name.c_str());
+}
+
+
+bool DataFactoryImpl::generateInterface(const char* fileroot, const char* factoryname)
+{
+
+ FILE* header;
+ FILE* body;
+
+ if ((fileroot == 0) || (strlen(fileroot) == 0)) return false;
+
+ if (factoryname == 0 || (strlen(factoryname) == 0)) return false;
+
+
+ char *headername = new char[strlen(fileroot) + 5];
+ char *bodyname = new char[strlen(fileroot) + 5];
+ strcpy(headername,fileroot);
+ strcpy(bodyname,fileroot);
+ strcat(headername,".h");
+ strcat(bodyname,".cpp");
+
+ // here we should check the files - and if they are present with
+ // contents we should read them, and merge the new generated code
+ // I think the way to do that is to allow sections in between comment
+ // pairs in three locations:
+ // a) outside any method in the CPP file.
+ // b) in the header file anywhere.
+ // c) inside method definitions in cpp, either before, or after the
+ // entire generated contents.
+ //
+ //
+
+ header = fopen(headername,"w+");
+ if (header == 0) return false;
+
+ body = fopen(bodyname,"w+");
+ if (body == 0) return false;
+
+
+ fprintf(header,"/*******************************************\n");
+ fprintf(header," * Generated Typesafe Interface Header *\n");
+ fprintf(header," *******************************************/\n\n\n");
+ fprintf(header,"#include \"commonj/sdo/SDO.h\"\n");
+ fprintf(header,"using namespace commonj::sdo;\n\n\n");
+
+ fprintf(body,"/*******************************************\n");
+ fprintf(body," * Generated Typesafe Interface Body *\n");
+ fprintf(body," *******************************************/\n\n\n");
+ fprintf(body,"#include \"%s\"\n",headername);
+ fprintf(body,"using namespace commonj::sdo;\n\n\n");
+
+ delete headername;
+ delete bodyname;
+
+ try {
+
+ int nscount;
+
+ TypeList tl = getTypes();
+
+ // forward declarations and smart pointers
+
+ fprintf(header,"/*******************************************\n");
+ fprintf(header," * Forward declarations and smart pointers *\n");
+ fprintf(header," *******************************************/\n\n\n");
+
+ unsigned int i;
+ for (i=0;i<tl.size();i++)
+ {
+ nscount = 0;
+
+ if (!strcmp(tl[i].getURI(),"commonj.sdo")) continue;
+
+ const char *uri = tl[i].getURI();
+ char *c = (char*)strchr(uri,'.');
+
+ if (c == 0)
+ {
+ fprintf(header,"namespace %s{\n",uri);
+ nscount = 1;
+ }
+ else
+ {
+ char* buf = new char[strlen(uri) + 1];
+ strcpy(buf, uri);
+ c = buf;
+ char* c1;
+ do {
+ c1 = strchr(c,'.');
+ if (c1) *c1 = 0;
+ fprintf(header,"namespace %s{\n", c);
+ nscount++;
+ if (c1) c = c1+1;
+ } while (c1 != 0);
+ delete buf;
+ }
+
+ const char* name = tl[i].getName();
+
+ fprintf(header," class %s;\n",name);
+ fprintf(header," typedef RefCountingPointer<%s> %sPtr;\n",
+ name, name);
+
+ for (int i=0;i<nscount;i++)
+ {
+ fprintf(header,"}\n");
+ }
+ }
+ fprintf(header,"\n\n");
+ fprintf(header,"/*******************************************\n");
+ fprintf(header," * The Data factory *\n");
+ fprintf(header," *******************************************/\n\n\n");
+
+ fprintf(header,"class %sDataFactory {\n", factoryname);
+ fprintf(header," public:\n");
+ fprintf(header," static %sDataFactory* get%sDataFactory();\n",
+ factoryname, factoryname);
+
+ for (i=0;i<tl.size();i++)
+ {
+
+ if (!strcmp(tl[i].getURI(),"commonj.sdo")) continue;
+
+ const char *uri = tl[i].getURI();
+ const char *name = tl[i].getName();
+ char* the_uri = (char*) strchr(uri,'.');
+
+ if (the_uri == 0)
+ {
+ the_uri = new char[strlen(uri) + 1];
+ strcpy(the_uri,uri);
+ }
+ else
+ {
+ the_uri = new char[2 * strlen(uri) + 1];
+ int jj=0;
+ for (unsigned int ii=0;ii<strlen(uri);ii++)
+ {
+ if (uri[ii] == '.')
+ {
+ the_uri[jj++]=':';
+ the_uri[jj++]=':';
+ }
+ else
+ {
+ the_uri[jj++] = uri[ii];
+ }
+ }
+ the_uri[jj] = 0;
+ }
+
+ fprintf(header," %s::%sPtr create%s();\n", the_uri, name, name);
+
+ fprintf(body,"%s::%sPtr %sDataFactory::create%s()\n",the_uri, name, factoryname, name);
+ fprintf(body,"{\n");
+ fprintf(body," DataObjectPtr dob = the_factory->create(\"%s\",\"%s\");\n",
+ tl[i].getURI(),name);
+ fprintf(body," %s::%s* the_ob = new %s::%s(dob);\n",the_uri,name,the_uri,name);
+ fprintf(body," return the_ob;\n");
+ fprintf(body,"}\n\n");
+
+ delete the_uri;
+
+ }
+
+ fprintf(header," DataFactory* getDataFactory()\n");
+ fprintf(header," {\n");
+ fprintf(header," return (DataFactory*)the_factory;\n");
+ fprintf(header," }\n");
+ fprintf(header," private:\n");
+ fprintf(header," DataFactoryPtr the_factory;\n");
+ fprintf(header,"};\n");
+
+ fprintf(header,"\n\n");
+
+ fprintf(body,"%sDataFactory* %sDataFactory::get%sDataFactory()\n",
+ factoryname,factoryname,factoryname);
+ fprintf(body,"{\n");
+ fprintf(body," %sDataFactory* t = new %sDataFactory();\n",
+ factoryname, factoryname);
+ fprintf(body," t->the_factory = DataFactory::getDataFactory();\n");
+ fprintf(body," return t;\n");
+ fprintf(body,"}\n\n");
+
+
+ fprintf(header,"/*******************************************\n");
+ fprintf(header," * DataObject Type definitions *\n");
+ fprintf(header," *******************************************/\n\n\n");
+
+
+ for (i=0;i<tl.size();i++)
+ {
+ nscount = 0;
+
+ if (!strcmp(tl[i].getURI(),"commonj.sdo")) continue;
+ const char *uri = tl[i].getURI();
+ char *c = (char*) strchr(uri,'.');
+
+ if (c == 0)
+ {
+ fprintf(header,"namespace %s{\n",uri);
+ fprintf(body, "namespace %s{\n",uri);
+ nscount = 1;
+ }
+ else
+ {
+ char* buf = new char[strlen(uri) + 1];
+ strcpy(buf, uri);
+ c = buf;
+ char* c1;
+ do {
+ c1 = strchr(c,'.');
+ if (c1) *c1 = 0;
+ fprintf(header,"namespace %s{\n", c);
+ fprintf(body, "namespace %s{\n", c);
+ nscount++;
+ if (c1) c = c1+1;
+ } while (c1 != 0);
+ delete buf;
+ }
+
+
+ const char* name = tl[i].getName();
+
+ fprintf(header," class %s :public RefCountingObject {\n", name);
+ fprintf(header," public:\n");
+ fprintf(header," %s(DataObject* d);",name);
+
+ // construction from a data object
+
+ fprintf(body,"%s::%s(DataObject* d)\n",name,name);
+ fprintf(body,"{\n");
+ fprintf(body," the_object = d;\n");
+ fprintf(body," the_object->setUserData((void*)this);\n");
+ fprintf(body,"}\n\n\n");
+
+
+
+ PropertyList pl = tl[i].getProperties();
+ for (unsigned int j=0;j<pl.size();j++)
+ {
+ const char* pname = pl[j].getName();
+
+ if (pl[j].isMany())
+ {
+ fprintf(header," DataObjectList& get%s();\n",pname);
+ fprintf(body, "DataObjectList& %s::get%s\n{\n",name,pname);
+ fprintf(body, " return the_object->getList(\"%s\");\n",pname);
+ fprintf(body, "}\n\n");
+ }
+ else
+ {
+ if (pl[j].getType().isDataType())
+ {
+ switch (pl[j].getTypeEnum())
+ {
+ case Type::BooleanType:
+ fprintf(header," bool get%s();\n",pname);
+ fprintf(body, "bool %s::get%s\n(){\n",name, pname);
+ fprintf(body, " return the_object->getBoolean(\"%s\");\n",pname);
+ fprintf(body, "}\n\n");
+ fprintf(header," void set%s(bool b);\n",pname);
+ fprintf(body, "void %s::set%s(bool b)\n{\n",name, pname);
+ fprintf(body, " the_object->setBoolean(\"%s\",b);\nreturn;\n",pname);
+ fprintf(body, "}\n\n");
+
+ break;
+
+ case Type::ByteType:
+
+ fprintf(header," char get%s();\n",pname);
+ fprintf(body, "char %s::get%s\n{\n",name, pname);
+ fprintf(body, " return the_object->getByte(\"%s\");\n",pname);
+ fprintf(body, "}\n\n");
+ fprintf(header," void set%s(char c);\n",pname);
+ fprintf(body, "void %s::set%s(char c)\n{\n",name, pname);
+ fprintf(body, " the_object->setByte(\"%s\",c);\nreturn;\n",pname);
+ fprintf(body, "}\n\n");
+
+ break;
+
+ case Type::BytesType:
+
+ fprintf(header," unsigned int get%s(char *buf, unsigned int len);\n",pname);
+ fprintf(body, "unsigned int %s::get%s(char *buf, unsigned int len)\n{\n",name,
+ pname);
+ fprintf(body, " return the_object->getBytes(\"%s\", buf,len);\n",pname);
+ fprintf(body, "}\n\n");
+ fprintf(header," void set%s(char *buf,unsigned int len);\n",pname);
+ fprintf(body, "void %s::set%s(char *buf, unsigned int len)\n{\n",name,
+ pname);
+ fprintf(body, " the_object->setBytes(\"%s\", buf,len);\nreturn;\n",pname);
+ fprintf(body, "}\n\n");
+
+ break;
+
+ case Type::CharacterType:
+
+ fprintf(header," wchar_t get%s();\n",pname);
+ fprintf(body, "wchar_t %s::get%s\n{\n",name, pname);
+ fprintf(body, " return the_object->getCharacter(\"%s\");\n",pname);
+ fprintf(body, "}\n\n");
+ fprintf(header," void set%s(wchar_t c);\n",pname);
+ fprintf(body, "void %s::set%s(wchar_t c)\n{\n",name, pname);
+ fprintf(body, " the_object->setCharacter(\"%s\",c);\nreturn;\n",pname);
+ fprintf(body, "}\n\n");
+
+ break;
+
+ case Type::DateType:
+
+ fprintf(header," SDODate get%s();\n",pname);
+ fprintf(body, "SDODate %s::get%s\n{\n",name, pname);
+ fprintf(body, " return the_object->getDate(\"%s\");\n",pname);
+ fprintf(body, "}\n\n");
+ fprintf(header," void set%s(const SDODate c);\n",pname);
+ fprintf(body, "void %s::set%s(const SDODate c)\n{\n",name, pname);
+ fprintf(body, " the_object->setDate(\"%s\",c);\nreturn;\n",pname);
+ fprintf(body, "}\n\n");
+
+ break;
+
+ case Type::DoubleType:
+
+ fprintf(header," long double get%s();\n",pname);
+ fprintf(body, "long double %s::get%s\n{\n",name, pname);
+ fprintf(body, " return the_object->getDouble(\"%s\");\n",pname);
+ fprintf(body, "}\n\n");
+ fprintf(header," void set%s(long double c);\n",pname);
+ fprintf(body, "void %s::set%s(long double c)\n{\n",name, pname);
+ fprintf(body, " the_object->setDouble(\"%s\",c);\nreturn;\n",pname);
+ fprintf(body, "}\n\n");
+
+ break;
+
+ case Type::FloatType:
+
+ fprintf(header," float get%s();\n",pname);
+ fprintf(body, "float %s::get%s\n{\n",name, pname);
+ fprintf(body, " return the_object->getFloat(\"%s\");\n",pname);
+ fprintf(body, "}\n\n");
+ fprintf(header," void set%s(float c);\n",pname);
+ fprintf(body, "void %s::set%s(float c)\n{\n",name, pname);
+ fprintf(body, " the_object->setFloat(\"%s\",c);\nreturn;\n",pname);
+ fprintf(body, "}\n\n");
+
+ break;
+
+ case Type::IntegerType:
+
+ fprintf(header," long get%s();\n",pname);
+ fprintf(body, "long %s::get%s\n{\n",name, pname);
+ fprintf(body, " return the_object->getInteger(\"%s\");\n",pname);
+ fprintf(body, "}\n\n");
+ fprintf(header," void set%s(long c);\n",pname);
+ fprintf(body, "void %s::set%s(long c)\n{\n",name, pname);
+ fprintf(body, " the_object->setInteger(\"%s\",c);\nreturn;\n",pname);
+ fprintf(body, "}\n\n");
+
+ break;
+
+ case Type::LongType:
+
+ fprintf(header," int64_t get%s();\n",pname);
+ fprintf(body, "int64_t %s::get%s\n{\n",name, pname);
+ fprintf(body, " return the_object->getLong(\"%s\");\n",pname);
+ fprintf(body, "}\n\n");
+ fprintf(header," void set%s(int64_t c);\n",pname);
+ fprintf(body, "void %s::set%s(int64_t c)\n{\n",name, pname);
+ fprintf(body, " the_object->setLong(\"%s\",c);\nreturn;\n",pname);
+ fprintf(body, "}\n\n");
+
+ break;
+
+ case Type::ShortType:
+
+ fprintf(header," short get%s();\n",pname);
+ fprintf(body, "short %s::get%s\n{\n",name, pname);
+ fprintf(body, " return the_object->getShort(\"%s\");\n",pname);
+ fprintf(body, "}\n\n");
+ fprintf(header," void set%s(short c);\n",pname);
+ fprintf(body, "void %s::set%s(short c)\n{\n",name, pname);
+ fprintf(body, " the_object->setShort(\"%s\",c);\nreturn;\n",pname);
+ fprintf(body, "}\n\n");
+
+ break;
+
+ case Type::StringType:
+ case Type::UriType:
+
+ fprintf(header," unsigned int get%s(wchar_t *buf, unsigned int len);\n",pname);
+ fprintf(body, "unsigned int %s::get%s(wchar_t *buf, unsigned int len)\n{\n",name,
+ pname);
+ fprintf(body, " return the_object->getString(\"%s\", buf,len);\n",pname);
+ fprintf(body, "}\n\n");
+ fprintf(header," void set%s(wchar_t *buf,unsigned int len);\n",pname);
+ fprintf(body, "void %s::set%s(wchar_t *buf, unsigned int len)\n{\n",name,
+ pname);
+ fprintf(body, " the_object->setString(\"%s\", buf,len);\nreturn;\n",pname);
+ fprintf(body, "}\n\n");
+
+ break;
+
+ default:
+ fprintf(header,"/* unknown primitive:%s */\n",pname);
+ break;
+ }
+ }
+ else
+
+ {
+ const char* ttname = pl[j].getType().getName();
+
+ fprintf(header," %sPtr get%s();\n",ttname, pname);
+
+ fprintf(body, "%sPtr %s::get%s()\n{\n",
+ ttname,
+ name,
+ pname);
+ fprintf(body, "DataObjectPtr dob = the_object->getDataObject(\"%s\");\n",pname);
+ fprintf(body, "DataObject* d = (DataObject*)dob;\n");
+ fprintf(body,"%s* value = (%s*)(d->getUserData());\n",ttname, ttname);
+ fprintf(body, " return (%s*)value;\n", ttname);
+ fprintf(body, "}\n\n");
+ fprintf(header," void set%s(%sPtr dob);\n",pname, ttname);
+ fprintf(body, "void %s::set%s(%sPtr dob)\n{\n",
+ name,pname,ttname);
+ fprintf(body,"%s* ptr = dob;\n", ttname);
+ fprintf(body,"DataObject* the_obj = ptr->getDataObject();\n");
+ fprintf(body,"the_object->setDataObject(\"%s\", the_obj);\nreturn;\n",
+ pname);
+ fprintf(body, "}\n\n");
+
+ }
+ }
+ } // for
+
+ // now print the contained data object
+
+ fprintf(header," DataObject* getDataObject()\n");
+ fprintf(header," {\n");
+ fprintf(header," return (DataObject*)the_object;\n");
+ fprintf(header," }\n");
+ fprintf(header," private:\n");
+ fprintf(header," DataObjectPtr the_object;\n");
+
+ fprintf(header,"};\n");
+ for (int i=0;i<nscount;i++)
+ {
+ fprintf(header,"}\n");
+ fprintf(body,"}\n");
+ }
+ }
+ fclose (header);
+ fclose (body);
+ }
+ catch (SDORuntimeException e)
+ {
+ cout << "Exception in code Generation" << endl;
+ cout << e << endl;
+ }
+ return true;
+}
+
+bool DataFactoryImpl::generateInterface(const SDOString& fileroot, const SDOString& factoryname)
+{
+ return generateInterface(fileroot.c_str(), factoryname.c_str());
+}
+
+ std::ostream& DataFactoryImpl::printSelf(std::ostream &os)
+ {
+ SDOUtils::printTypes(os, this);
+ return os;
+ }
+
+};
+};
+